From bc7a9dec6f48941b9f41a018d37f56850e23e4c0 Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 7 Apr 2015 13:30:33 -0700 Subject: [PATCH 001/664] ACE2 tracers port. --- addons/tracers/$PBOPREFIX$ | 1 + addons/tracers/README.md | 11 +++++ addons/tracers/ace_40mm_tracer_red.p3d | Bin 0 -> 17858 bytes addons/tracers/ace_TracerGreen2.p3d | Bin 0 -> 5688 bytes addons/tracers/ace_TracerRed2.p3d | Bin 0 -> 5633 bytes addons/tracers/ace_TracerYellow2.p3d | Bin 0 -> 5724 bytes addons/tracers/ace_shell_tracer_green.p3d | Bin 0 -> 18396 bytes addons/tracers/ace_shell_tracer_red.p3d | Bin 0 -> 18164 bytes addons/tracers/ace_shell_tracer_yellow.p3d | Bin 0 -> 18512 bytes addons/tracers/config.cpp | 13 ++++++ .../data/SLX_GreenTracer_Material.rvmat | 9 ++++ .../tracers/data/SLX_RedTracer_Material.rvmat | 9 ++++ .../data/SLX_YellowTracer_Material.rvmat | 9 ++++ addons/tracers/data/TracerGreen.paa | Bin 0 -> 22016 bytes addons/tracers/data/TracerRed.paa | Bin 0 -> 22016 bytes addons/tracers/data/TracerYellow.paa | Bin 0 -> 22016 bytes addons/tracers/data/clear_empty.paa | Bin 0 -> 480 bytes addons/tracers/data/tracer_green.rvmat | 18 +++++++ addons/tracers/data/tracer_green1_ca.paa | Bin 0 -> 5625 bytes addons/tracers/data/tracer_red.rvmat | 18 +++++++ addons/tracers/data/tracer_red1_ca.paa | Bin 0 -> 5625 bytes addons/tracers/data/tracer_yellow.rvmat | 18 +++++++ addons/tracers/data/tracer_yellow1_ca.paa | Bin 0 -> 5625 bytes addons/tracers/model.cfg | 44 ++++++++++++++++++ addons/tracers/script_component.hpp | 12 +++++ addons/tracers/tracer_green_2.p3d | Bin 0 -> 18396 bytes addons/tracers/tracer_red_2.p3d | Bin 0 -> 18164 bytes addons/tracers/tracer_yellow_2.p3d | Bin 0 -> 18512 bytes 28 files changed, 162 insertions(+) create mode 100644 addons/tracers/$PBOPREFIX$ create mode 100644 addons/tracers/README.md create mode 100644 addons/tracers/ace_40mm_tracer_red.p3d create mode 100644 addons/tracers/ace_TracerGreen2.p3d create mode 100644 addons/tracers/ace_TracerRed2.p3d create mode 100644 addons/tracers/ace_TracerYellow2.p3d create mode 100644 addons/tracers/ace_shell_tracer_green.p3d create mode 100644 addons/tracers/ace_shell_tracer_red.p3d create mode 100644 addons/tracers/ace_shell_tracer_yellow.p3d create mode 100644 addons/tracers/config.cpp create mode 100644 addons/tracers/data/SLX_GreenTracer_Material.rvmat create mode 100644 addons/tracers/data/SLX_RedTracer_Material.rvmat create mode 100644 addons/tracers/data/SLX_YellowTracer_Material.rvmat create mode 100644 addons/tracers/data/TracerGreen.paa create mode 100644 addons/tracers/data/TracerRed.paa create mode 100644 addons/tracers/data/TracerYellow.paa create mode 100644 addons/tracers/data/clear_empty.paa create mode 100644 addons/tracers/data/tracer_green.rvmat create mode 100644 addons/tracers/data/tracer_green1_ca.paa create mode 100644 addons/tracers/data/tracer_red.rvmat create mode 100644 addons/tracers/data/tracer_red1_ca.paa create mode 100644 addons/tracers/data/tracer_yellow.rvmat create mode 100644 addons/tracers/data/tracer_yellow1_ca.paa create mode 100644 addons/tracers/model.cfg create mode 100644 addons/tracers/script_component.hpp create mode 100644 addons/tracers/tracer_green_2.p3d create mode 100644 addons/tracers/tracer_red_2.p3d create mode 100644 addons/tracers/tracer_yellow_2.p3d diff --git a/addons/tracers/$PBOPREFIX$ b/addons/tracers/$PBOPREFIX$ new file mode 100644 index 0000000000..0b2ee2511f --- /dev/null +++ b/addons/tracers/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\tracers \ No newline at end of file diff --git a/addons/tracers/README.md b/addons/tracers/README.md new file mode 100644 index 0000000000..3fa628ce27 --- /dev/null +++ b/addons/tracers/README.md @@ -0,0 +1,11 @@ +ace_tracers +=========== + +Ball tracers for ArmA3 ported from ACE2. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [jaynus](https://github.com/walterpearce) diff --git a/addons/tracers/ace_40mm_tracer_red.p3d b/addons/tracers/ace_40mm_tracer_red.p3d new file mode 100644 index 0000000000000000000000000000000000000000..d9ed221913316a11bee343b32b051f0f1e9db379 GIT binary patch literal 17858 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 literal 0 HcmV?d00001 diff --git a/addons/tracers/ace_TracerRed2.p3d b/addons/tracers/ace_TracerRed2.p3d new file mode 100644 index 0000000000000000000000000000000000000000..bf22f9b761b3c69d230096e50cfa16041ac32dd4 GIT binary patch literal 5633 zcmdT|YinFp6g^X8e6}WOs!i3}dVTZ}$4pXRon)@Dlcb0th1hB#5-ypWTAW9`Ga4&W z#@5Gg5d9dTMU4>9FG{9<=~oejf&~ecR#2fJNYL1cYu!65j7ei=1g|)-viI3%pL5pP zXP-SMGx*d{G7>T78e`0XuH@hykOu7*i2VR1KX3lDJ$B>^V}G?X-O2WgJzHZ7=TF9e z%P-Ed-S*Zxo9#oJGJZe(FOOZBl|S3;U&t>eD*h$5&zr38pK1QAgY(DxU-R1whrI;* z;}_=q`J2AH=(o?Dn)JuhpYzNAkHg+9{d+FV`Tg+s+q0)8{qg@cf9}bcq8-Ru^uTvZ zA}tSAQ-W>qfCI`PkqC8Q8%y3ZCR+fBoGr z{yDtz7^1+a~rn-N{WzZGA}m+qRH#hMpSZ- zdAJ1-P3GnE1INnZxs#FyblmfZsUGH+X#s!4|NBig2d?V1XPfiySo4tB+}jugj|qF zvmFpk(s-bX25I7Tw?vcM;LAc_bka-$qDdNkRWwMm9}rD$ zV*t=LLdeahdj|$0*6{O=H_?|m;^r;0jSnV#D#Cxav(0xBKYWO=j}I0~K13*Kr;Tk& z`cs!=KXpoeL9nb*vfNR!3{tW@vX6F3e%VmcP8-{l^rtS#e(ID=O9qpYL8fFdDS0UD zqn(l|PDwj$Y*W&ox+MFlQ%0-oWVWOKv&dy_-YpjH1TR{xN{jEGnV z4-LBo%On|je3WrYcx9L}OZQv%R`*%uM%7eRRMk^eQ}b&+&9C(|zvk2YT2J$9KFzQ7 zYVDW5#%n&Uul2OP_^4lP^~-;){i$F3)&3Qa|2zMP)t5~TjrSi-yH=1<_@$`&S4dTd zO6LkusVi>U9V@sg%dZfT$i7@=BA0cug^pOovg{%`FBNiQ=y$ypGuCA2sL5+}r-(J^ t=F~K3GFwivDQ)2?A5OuB*;^di48e{{&G|Po4k( literal 0 HcmV?d00001 diff --git a/addons/tracers/ace_TracerYellow2.p3d b/addons/tracers/ace_TracerYellow2.p3d new file mode 100644 index 0000000000000000000000000000000000000000..7ab78d466e4f603c55c44157d1c002dda219c6b6 GIT binary patch literal 5724 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 literal 0 HcmV?d00001 diff --git a/addons/tracers/ace_shell_tracer_red.p3d b/addons/tracers/ace_shell_tracer_red.p3d new file mode 100644 index 0000000000000000000000000000000000000000..622427ca63a869af5d7ba531e6ad7916c8071b5d GIT binary patch literal 18164 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 literal 0 HcmV?d00001 diff --git a/addons/tracers/ace_shell_tracer_yellow.p3d b/addons/tracers/ace_shell_tracer_yellow.p3d new file mode 100644 index 0000000000000000000000000000000000000000..3d2de95cf9c6e6b46346d5b3a4df3660e85cad24 GIT binary patch literal 18512 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 C?)hT? literal 0 HcmV?d00001 diff --git a/addons/tracers/data/TracerRed.paa b/addons/tracers/data/TracerRed.paa new file mode 100644 index 0000000000000000000000000000000000000000..c31b94fb806f426a3f1d6c3551b309ceb0a545fe GIT binary patch literal 22016 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 E0B2I|(f|Me literal 0 HcmV?d00001 diff --git a/addons/tracers/data/clear_empty.paa b/addons/tracers/data/clear_empty.paa new file mode 100644 index 0000000000000000000000000000000000000000..e12f6f1568cab2693ca0ffde02ced21d6b92516a GIT binary patch literal 480 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 IPl4F}2a;s7hyVZp literal 0 HcmV?d00001 diff --git a/addons/tracers/data/tracer_red.rvmat b/addons/tracers/data/tracer_red.rvmat new file mode 100644 index 0000000000..08b2ab1abc --- /dev/null +++ b/addons/tracers/data/tracer_red.rvmat @@ -0,0 +1,18 @@ +//////////////////////////////////////////////////////////////////// +//Produced from mikero's Dos Tools using dll 3.17 +//http://dev-heaven.net/projects/list_files/mikero-pbodll +//////////////////////////////////////////////////////////////////// + +#define _ARMA_ + +//Class weapons : Data\bullettracer\Data\tracer_red.rvmat{ +ambient[] = {1.0,1.0,1.0,3.25}; +diffuse[] = {1.0,1.0,1.0,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {1.0,1.0,1.0,1.0}; +specular[] = {0.0,0.0,0.0,1.0}; +specularPower = 1.0; +renderFlags[] = {"NoZWrite","AddBlend"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; +//}; diff --git a/addons/tracers/data/tracer_red1_ca.paa b/addons/tracers/data/tracer_red1_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..171325cc55b6f2e25aea1c0b71d77f48e8ceadf2 GIT binary patch literal 5625 zcmeHLe^66L9^aP`1S%vD)1tr`C78B~H2wgIl{`d&j26?v(-eDG1W$6;LlDkV#?w&k z3C@Wq>g5=uQn4B%PSn;o=*@)wxKp$@6ZA^0FmwLwjCi6(g7sCh_uWli>{*?$*3R?~ zcX)Yx-tODo&*%Hy?|%15a8_1&UPjjZ^dN*#%Ir=x#m4kk2*ywd&Ptz~NiYK!!MT~4 z^H})58m<}{LK{XPv{ivnFI+#au!uzndU#r%D)0mq7>4u>D*ZNDu^SpU#fh8 zp;&@Y6w&6nlE~$4lsQ`bIht!+I%TspML7doSE7JX`7&zg2|br zz9u4`&axf}(U&Ug8= z_LY{2T!eskaReU=6>vut*gGKw^zgMmQi@M^_k^&3-PmjEvzF*DsN1CbD8{$1tw`}DgllI~CJd9V3vGT*#BqR3AxQlz&m zxU*48`XigrOEOJmZqm(&<77M!_PjZ^qWoga}S=)uSnVo#ixMdg zUaj)^L*65=2NT$vQz#U`f0;aGc`jYwUcT?;(Li1knM?G*c8vd+c~d5ZKVkgy>#xZC z^>qGt04yMq!Fsp4ZBPXM0$%|O@86FvZEg{3TUyhE`jxL5*Gz2@2k`7M1=2xiBGku8 z0PKj@68_%XUf>VpAA`T(HzOHMWW~D1zmfQB2Y-5Q+9Z|#>hIqk%^2;ewpOhP{QoeDWyqfhE8fmLoQ*`^$1G8-Z`J+Xez{ngjfoH6DfaNbAp*H=ir7 zZ0zyx4_>@WZYV$8tRnUSxiH>RoqTZLkd9!R)9E~GcAe<<+)^I{47KL@n_l1|w!IXH zm%mAho-z2}T-u(821((@eV!eyY5xA5QK)6IZs0Waci_lAD$j?t6CwS^#gNiu0e^*p z;}p#MWpa(>9fF}SNs(~{VM{HCvw-iLX0tOtf$}|?>6^cI6-#haFYy-)0lx0_C_}lk zSq1x<8UHW$O-C91A;yH=cAJ^gSsv6L5uM^{0zj7rz z4h^aOe2z?(x}NVoMEDbaPFtMVrF9IPR<8yB^MZb%$knQv=cf4&YcTxm`H!H3a1R3i zQ2F(cfPX}w%>@yi&D3AOJrpq_xnXH((A~vi$pB zjMz2npywLc*Qb{hbyz*i8z?_;=e%La1o^cOv#_9rdHhoEBGh?LABaCeXjcHk0f7@E zlSSY|u)u@Fo5zV)!uwC}kEVbUDG?%H7<@$uH&|7HZR3}M#iJZ0F>BXOC2qkbh)@y( z$H>G~Mo3FVfT@3oz{1*#3zLl{3!!}z}l#@`Kt{we-9 z2WePehEAwY3n6J)YZ`gq34~}`24T#Xmd+0>dqIzQl)7oby2ig3!~8@dMzTiPUsloH z)ay$#Jf8lA+s-w#H>-Tx;1T|s-j&_$z_4xBxNVSR{dt^m2JgA320h>yjdAevAM}2* zIq^&l=nr4dSn^AX60Qf@|9fFQ0SxjY`bK8C7uF?NlFcNIxl6*j*^Irj!XS+q+zx3? z7Coi}C0_YFR5ZMY_#2F82u9g%As1c^ss2l=LK5)6+f~L_%#jLOEU|8&8Z?UWe| z;MM_Iz>B%y)cm4sn6l3d5>AU`B|87^iO?II2xSLkBfCuq3L)V`-Vf2nv19_77JS2E zf~y>fXX5T2r?`x*4%;xlbVBlC+O3#j6vON4w|%m@q=(eQSBShIh^U}v=$7F1&t?~N O)Vjw+rz3I-B;|i+;dB}R literal 0 HcmV?d00001 diff --git a/addons/tracers/data/tracer_yellow.rvmat b/addons/tracers/data/tracer_yellow.rvmat new file mode 100644 index 0000000000..f1c7a71670 --- /dev/null +++ b/addons/tracers/data/tracer_yellow.rvmat @@ -0,0 +1,18 @@ +//////////////////////////////////////////////////////////////////// +//Produced from mikero's Dos Tools using dll 3.17 +//http://dev-heaven.net/projects/list_files/mikero-pbodll +//////////////////////////////////////////////////////////////////// + +#define _ARMA_ + +//Class weapons : Data\bullettracer\Data\tracer_yellow.rvmat{ +ambient[] = {1.0,1.0,1.0,3.25}; +diffuse[] = {1.0,1.0,1.0,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {1.0,1.0,1.0,1.0}; +specular[] = {0.0,0.0,0.0,1.0}; +specularPower = 1.0; +renderFlags[] = {"NoZWrite","AddBlend"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; +//}; diff --git a/addons/tracers/data/tracer_yellow1_ca.paa b/addons/tracers/data/tracer_yellow1_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..f895ffe6e3b55ada842adb4f7d76524d3bc7345c GIT binary patch literal 5625 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 CM#gsl literal 0 HcmV?d00001 diff --git a/addons/tracers/tracer_red_2.p3d b/addons/tracers/tracer_red_2.p3d new file mode 100644 index 0000000000000000000000000000000000000000..507fdae33682e70f9201dd14e58735aefc135f71 GIT binary patch literal 18164 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 literal 0 HcmV?d00001 diff --git a/addons/tracers/tracer_yellow_2.p3d b/addons/tracers/tracer_yellow_2.p3d new file mode 100644 index 0000000000000000000000000000000000000000..1a52ada09f597fc5e1bb28a5c264988ad69c07c9 GIT binary patch literal 18512 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 literal 0 HcmV?d00001 From 14579fb90ea12a09afcd5759a9649fd435cb2fda Mon Sep 17 00:00:00 2001 From: Nou Date: Tue, 14 Apr 2015 00:41:19 -0700 Subject: [PATCH 002/664] Explosive reflection, enabled on all frag rounds. --- addons/frag/CfgAmmo.hpp | 3 + addons/frag/CfgAmmoReflections.hpp | 2523 +++++++++++++++++ addons/frag/XEH_pre_Init.sqf | 4 + addons/frag/functions/fnc_doExplosions.sqf | 26 + addons/frag/functions/fnc_doReflections.sqf | 22 + addons/frag/functions/fnc_findReflections.sqf | 130 + addons/frag/functions/fnc_frago.sqf | 6 +- 7 files changed, 2712 insertions(+), 2 deletions(-) create mode 100644 addons/frag/CfgAmmoReflections.hpp create mode 100644 addons/frag/functions/fnc_doExplosions.sqf create mode 100644 addons/frag/functions/fnc_doReflections.sqf create mode 100644 addons/frag/functions/fnc_findReflections.sqf diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp index 8ad76e6ae8..8d965e8d2e 100644 --- a/addons/frag/CfgAmmo.hpp +++ b/addons/frag/CfgAmmo.hpp @@ -8,6 +8,9 @@ class CfgAmmo { //class ace_arty_105mm_m1_m782_delay: ace_arty_105mm_m1_m782_prox { // ACE_FRAG_SKIP = 1; //}; + + #include "CfgAmmoReflections.hpp" + class Bo_GBU12_LGB; class Nou_GBU12 : Bo_GBU12_LGB { ACE_FRAG_CLASSES[] = {"ACE_frag_large", "ACE_frag_large", "ACE_frag_large_HD", "ACE_frag_large", "ACE_frag_huge", "ACE_frag_huge_HD", "ACE_frag_huge"}; diff --git a/addons/frag/CfgAmmoReflections.hpp b/addons/frag/CfgAmmoReflections.hpp new file mode 100644 index 0000000000..8e481a9cd0 --- /dev/null +++ b/addons/frag/CfgAmmoReflections.hpp @@ -0,0 +1,2523 @@ +//CfgAmmoReflections.hpp + +#define ACE_EXPLOSION_REFLECTION(range, hit) class ace_explosion_reflection_##range##_##hit : ace_explosion_reflection_base { indirectHitRange = range; indirectHit = hit; dangerRadiusHit = range*3; suppressionRadiusHit = range*2; }; +class Sh_120mm_HE; +class ace_explosion_reflection_base : Sh_120mm_HE { + CraterWaterEffects = ""; + CraterEffects = ""; + effectsMissile = ""; + ExplosionEffects = ""; + effectFlare = ""; + class HitEffects { + hitWater = ""; + }; + multiSoundHit[] = {}; + explosionTime = 0.0001; + explosive = 1; + soundFakeFall[] = {}; + typicalSpeed = 0; + model = "\A3\Weapons_F\empty.p3d"; + craterShape = "\A3\weapons_f\empty.p3d"; +}; + +ACE_EXPLOSION_REFLECTION(2,10); +ACE_EXPLOSION_REFLECTION(2,20); +ACE_EXPLOSION_REFLECTION(2,30); +ACE_EXPLOSION_REFLECTION(2,40); +ACE_EXPLOSION_REFLECTION(2,50); +ACE_EXPLOSION_REFLECTION(2,60); +ACE_EXPLOSION_REFLECTION(2,70); +ACE_EXPLOSION_REFLECTION(2,80); +ACE_EXPLOSION_REFLECTION(2,90); +ACE_EXPLOSION_REFLECTION(2,100); +ACE_EXPLOSION_REFLECTION(2,110); +ACE_EXPLOSION_REFLECTION(2,120); +ACE_EXPLOSION_REFLECTION(2,130); +ACE_EXPLOSION_REFLECTION(2,140); +ACE_EXPLOSION_REFLECTION(2,150); +ACE_EXPLOSION_REFLECTION(2,160); +ACE_EXPLOSION_REFLECTION(2,170); +ACE_EXPLOSION_REFLECTION(2,180); +ACE_EXPLOSION_REFLECTION(2,190); +ACE_EXPLOSION_REFLECTION(2,200); +ACE_EXPLOSION_REFLECTION(2,210); +ACE_EXPLOSION_REFLECTION(2,220); +ACE_EXPLOSION_REFLECTION(2,230); +ACE_EXPLOSION_REFLECTION(2,240); +ACE_EXPLOSION_REFLECTION(2,250); +ACE_EXPLOSION_REFLECTION(2,260); +ACE_EXPLOSION_REFLECTION(2,270); +ACE_EXPLOSION_REFLECTION(2,280); +ACE_EXPLOSION_REFLECTION(2,290); +ACE_EXPLOSION_REFLECTION(2,300); +ACE_EXPLOSION_REFLECTION(2,310); +ACE_EXPLOSION_REFLECTION(2,320); +ACE_EXPLOSION_REFLECTION(2,330); +ACE_EXPLOSION_REFLECTION(2,340); +ACE_EXPLOSION_REFLECTION(2,350); +ACE_EXPLOSION_REFLECTION(2,360); +ACE_EXPLOSION_REFLECTION(2,370); +ACE_EXPLOSION_REFLECTION(2,380); +ACE_EXPLOSION_REFLECTION(2,390); +ACE_EXPLOSION_REFLECTION(2,400); +ACE_EXPLOSION_REFLECTION(2,410); +ACE_EXPLOSION_REFLECTION(2,420); +ACE_EXPLOSION_REFLECTION(2,430); +ACE_EXPLOSION_REFLECTION(2,440); +ACE_EXPLOSION_REFLECTION(2,450); +ACE_EXPLOSION_REFLECTION(2,460); +ACE_EXPLOSION_REFLECTION(2,470); +ACE_EXPLOSION_REFLECTION(2,480); +ACE_EXPLOSION_REFLECTION(2,490); +ACE_EXPLOSION_REFLECTION(2,500); +ACE_EXPLOSION_REFLECTION(4,10); +ACE_EXPLOSION_REFLECTION(4,20); +ACE_EXPLOSION_REFLECTION(4,30); +ACE_EXPLOSION_REFLECTION(4,40); +ACE_EXPLOSION_REFLECTION(4,50); +ACE_EXPLOSION_REFLECTION(4,60); +ACE_EXPLOSION_REFLECTION(4,70); +ACE_EXPLOSION_REFLECTION(4,80); +ACE_EXPLOSION_REFLECTION(4,90); +ACE_EXPLOSION_REFLECTION(4,100); +ACE_EXPLOSION_REFLECTION(4,110); +ACE_EXPLOSION_REFLECTION(4,120); +ACE_EXPLOSION_REFLECTION(4,130); +ACE_EXPLOSION_REFLECTION(4,140); +ACE_EXPLOSION_REFLECTION(4,150); +ACE_EXPLOSION_REFLECTION(4,160); +ACE_EXPLOSION_REFLECTION(4,170); +ACE_EXPLOSION_REFLECTION(4,180); +ACE_EXPLOSION_REFLECTION(4,190); +ACE_EXPLOSION_REFLECTION(4,200); +ACE_EXPLOSION_REFLECTION(4,210); +ACE_EXPLOSION_REFLECTION(4,220); +ACE_EXPLOSION_REFLECTION(4,230); +ACE_EXPLOSION_REFLECTION(4,240); +ACE_EXPLOSION_REFLECTION(4,250); +ACE_EXPLOSION_REFLECTION(4,260); +ACE_EXPLOSION_REFLECTION(4,270); +ACE_EXPLOSION_REFLECTION(4,280); +ACE_EXPLOSION_REFLECTION(4,290); +ACE_EXPLOSION_REFLECTION(4,300); +ACE_EXPLOSION_REFLECTION(4,310); +ACE_EXPLOSION_REFLECTION(4,320); +ACE_EXPLOSION_REFLECTION(4,330); +ACE_EXPLOSION_REFLECTION(4,340); +ACE_EXPLOSION_REFLECTION(4,350); +ACE_EXPLOSION_REFLECTION(4,360); +ACE_EXPLOSION_REFLECTION(4,370); +ACE_EXPLOSION_REFLECTION(4,380); +ACE_EXPLOSION_REFLECTION(4,390); +ACE_EXPLOSION_REFLECTION(4,400); +ACE_EXPLOSION_REFLECTION(4,410); +ACE_EXPLOSION_REFLECTION(4,420); +ACE_EXPLOSION_REFLECTION(4,430); +ACE_EXPLOSION_REFLECTION(4,440); +ACE_EXPLOSION_REFLECTION(4,450); +ACE_EXPLOSION_REFLECTION(4,460); +ACE_EXPLOSION_REFLECTION(4,470); +ACE_EXPLOSION_REFLECTION(4,480); +ACE_EXPLOSION_REFLECTION(4,490); +ACE_EXPLOSION_REFLECTION(4,500); +ACE_EXPLOSION_REFLECTION(6,10); +ACE_EXPLOSION_REFLECTION(6,20); +ACE_EXPLOSION_REFLECTION(6,30); +ACE_EXPLOSION_REFLECTION(6,40); +ACE_EXPLOSION_REFLECTION(6,50); +ACE_EXPLOSION_REFLECTION(6,60); +ACE_EXPLOSION_REFLECTION(6,70); +ACE_EXPLOSION_REFLECTION(6,80); +ACE_EXPLOSION_REFLECTION(6,90); +ACE_EXPLOSION_REFLECTION(6,100); +ACE_EXPLOSION_REFLECTION(6,110); +ACE_EXPLOSION_REFLECTION(6,120); +ACE_EXPLOSION_REFLECTION(6,130); +ACE_EXPLOSION_REFLECTION(6,140); +ACE_EXPLOSION_REFLECTION(6,150); +ACE_EXPLOSION_REFLECTION(6,160); +ACE_EXPLOSION_REFLECTION(6,170); +ACE_EXPLOSION_REFLECTION(6,180); +ACE_EXPLOSION_REFLECTION(6,190); +ACE_EXPLOSION_REFLECTION(6,200); +ACE_EXPLOSION_REFLECTION(6,210); +ACE_EXPLOSION_REFLECTION(6,220); +ACE_EXPLOSION_REFLECTION(6,230); +ACE_EXPLOSION_REFLECTION(6,240); +ACE_EXPLOSION_REFLECTION(6,250); +ACE_EXPLOSION_REFLECTION(6,260); +ACE_EXPLOSION_REFLECTION(6,270); +ACE_EXPLOSION_REFLECTION(6,280); +ACE_EXPLOSION_REFLECTION(6,290); +ACE_EXPLOSION_REFLECTION(6,300); +ACE_EXPLOSION_REFLECTION(6,310); +ACE_EXPLOSION_REFLECTION(6,320); +ACE_EXPLOSION_REFLECTION(6,330); +ACE_EXPLOSION_REFLECTION(6,340); +ACE_EXPLOSION_REFLECTION(6,350); +ACE_EXPLOSION_REFLECTION(6,360); +ACE_EXPLOSION_REFLECTION(6,370); +ACE_EXPLOSION_REFLECTION(6,380); +ACE_EXPLOSION_REFLECTION(6,390); +ACE_EXPLOSION_REFLECTION(6,400); +ACE_EXPLOSION_REFLECTION(6,410); +ACE_EXPLOSION_REFLECTION(6,420); +ACE_EXPLOSION_REFLECTION(6,430); +ACE_EXPLOSION_REFLECTION(6,440); +ACE_EXPLOSION_REFLECTION(6,450); +ACE_EXPLOSION_REFLECTION(6,460); +ACE_EXPLOSION_REFLECTION(6,470); +ACE_EXPLOSION_REFLECTION(6,480); +ACE_EXPLOSION_REFLECTION(6,490); +ACE_EXPLOSION_REFLECTION(6,500); +ACE_EXPLOSION_REFLECTION(8,10); +ACE_EXPLOSION_REFLECTION(8,20); +ACE_EXPLOSION_REFLECTION(8,30); +ACE_EXPLOSION_REFLECTION(8,40); +ACE_EXPLOSION_REFLECTION(8,50); +ACE_EXPLOSION_REFLECTION(8,60); +ACE_EXPLOSION_REFLECTION(8,70); +ACE_EXPLOSION_REFLECTION(8,80); +ACE_EXPLOSION_REFLECTION(8,90); +ACE_EXPLOSION_REFLECTION(8,100); +ACE_EXPLOSION_REFLECTION(8,110); +ACE_EXPLOSION_REFLECTION(8,120); +ACE_EXPLOSION_REFLECTION(8,130); +ACE_EXPLOSION_REFLECTION(8,140); +ACE_EXPLOSION_REFLECTION(8,150); +ACE_EXPLOSION_REFLECTION(8,160); +ACE_EXPLOSION_REFLECTION(8,170); +ACE_EXPLOSION_REFLECTION(8,180); +ACE_EXPLOSION_REFLECTION(8,190); +ACE_EXPLOSION_REFLECTION(8,200); +ACE_EXPLOSION_REFLECTION(8,210); +ACE_EXPLOSION_REFLECTION(8,220); +ACE_EXPLOSION_REFLECTION(8,230); +ACE_EXPLOSION_REFLECTION(8,240); +ACE_EXPLOSION_REFLECTION(8,250); +ACE_EXPLOSION_REFLECTION(8,260); +ACE_EXPLOSION_REFLECTION(8,270); +ACE_EXPLOSION_REFLECTION(8,280); +ACE_EXPLOSION_REFLECTION(8,290); +ACE_EXPLOSION_REFLECTION(8,300); +ACE_EXPLOSION_REFLECTION(8,310); +ACE_EXPLOSION_REFLECTION(8,320); +ACE_EXPLOSION_REFLECTION(8,330); +ACE_EXPLOSION_REFLECTION(8,340); +ACE_EXPLOSION_REFLECTION(8,350); +ACE_EXPLOSION_REFLECTION(8,360); +ACE_EXPLOSION_REFLECTION(8,370); +ACE_EXPLOSION_REFLECTION(8,380); +ACE_EXPLOSION_REFLECTION(8,390); +ACE_EXPLOSION_REFLECTION(8,400); +ACE_EXPLOSION_REFLECTION(8,410); +ACE_EXPLOSION_REFLECTION(8,420); +ACE_EXPLOSION_REFLECTION(8,430); +ACE_EXPLOSION_REFLECTION(8,440); +ACE_EXPLOSION_REFLECTION(8,450); +ACE_EXPLOSION_REFLECTION(8,460); +ACE_EXPLOSION_REFLECTION(8,470); +ACE_EXPLOSION_REFLECTION(8,480); +ACE_EXPLOSION_REFLECTION(8,490); +ACE_EXPLOSION_REFLECTION(8,500); +ACE_EXPLOSION_REFLECTION(10,10); +ACE_EXPLOSION_REFLECTION(10,20); +ACE_EXPLOSION_REFLECTION(10,30); +ACE_EXPLOSION_REFLECTION(10,40); +ACE_EXPLOSION_REFLECTION(10,50); +ACE_EXPLOSION_REFLECTION(10,60); +ACE_EXPLOSION_REFLECTION(10,70); +ACE_EXPLOSION_REFLECTION(10,80); +ACE_EXPLOSION_REFLECTION(10,90); +ACE_EXPLOSION_REFLECTION(10,100); +ACE_EXPLOSION_REFLECTION(10,110); +ACE_EXPLOSION_REFLECTION(10,120); +ACE_EXPLOSION_REFLECTION(10,130); +ACE_EXPLOSION_REFLECTION(10,140); +ACE_EXPLOSION_REFLECTION(10,150); +ACE_EXPLOSION_REFLECTION(10,160); +ACE_EXPLOSION_REFLECTION(10,170); +ACE_EXPLOSION_REFLECTION(10,180); +ACE_EXPLOSION_REFLECTION(10,190); +ACE_EXPLOSION_REFLECTION(10,200); +ACE_EXPLOSION_REFLECTION(10,210); +ACE_EXPLOSION_REFLECTION(10,220); +ACE_EXPLOSION_REFLECTION(10,230); +ACE_EXPLOSION_REFLECTION(10,240); +ACE_EXPLOSION_REFLECTION(10,250); +ACE_EXPLOSION_REFLECTION(10,260); +ACE_EXPLOSION_REFLECTION(10,270); +ACE_EXPLOSION_REFLECTION(10,280); +ACE_EXPLOSION_REFLECTION(10,290); +ACE_EXPLOSION_REFLECTION(10,300); +ACE_EXPLOSION_REFLECTION(10,310); +ACE_EXPLOSION_REFLECTION(10,320); +ACE_EXPLOSION_REFLECTION(10,330); +ACE_EXPLOSION_REFLECTION(10,340); +ACE_EXPLOSION_REFLECTION(10,350); +ACE_EXPLOSION_REFLECTION(10,360); +ACE_EXPLOSION_REFLECTION(10,370); +ACE_EXPLOSION_REFLECTION(10,380); +ACE_EXPLOSION_REFLECTION(10,390); +ACE_EXPLOSION_REFLECTION(10,400); +ACE_EXPLOSION_REFLECTION(10,410); +ACE_EXPLOSION_REFLECTION(10,420); +ACE_EXPLOSION_REFLECTION(10,430); +ACE_EXPLOSION_REFLECTION(10,440); +ACE_EXPLOSION_REFLECTION(10,450); +ACE_EXPLOSION_REFLECTION(10,460); +ACE_EXPLOSION_REFLECTION(10,470); +ACE_EXPLOSION_REFLECTION(10,480); +ACE_EXPLOSION_REFLECTION(10,490); +ACE_EXPLOSION_REFLECTION(10,500); +ACE_EXPLOSION_REFLECTION(12,10); +ACE_EXPLOSION_REFLECTION(12,20); +ACE_EXPLOSION_REFLECTION(12,30); +ACE_EXPLOSION_REFLECTION(12,40); +ACE_EXPLOSION_REFLECTION(12,50); +ACE_EXPLOSION_REFLECTION(12,60); +ACE_EXPLOSION_REFLECTION(12,70); +ACE_EXPLOSION_REFLECTION(12,80); +ACE_EXPLOSION_REFLECTION(12,90); +ACE_EXPLOSION_REFLECTION(12,100); +ACE_EXPLOSION_REFLECTION(12,110); +ACE_EXPLOSION_REFLECTION(12,120); +ACE_EXPLOSION_REFLECTION(12,130); +ACE_EXPLOSION_REFLECTION(12,140); +ACE_EXPLOSION_REFLECTION(12,150); +ACE_EXPLOSION_REFLECTION(12,160); +ACE_EXPLOSION_REFLECTION(12,170); +ACE_EXPLOSION_REFLECTION(12,180); +ACE_EXPLOSION_REFLECTION(12,190); +ACE_EXPLOSION_REFLECTION(12,200); +ACE_EXPLOSION_REFLECTION(12,210); +ACE_EXPLOSION_REFLECTION(12,220); +ACE_EXPLOSION_REFLECTION(12,230); +ACE_EXPLOSION_REFLECTION(12,240); +ACE_EXPLOSION_REFLECTION(12,250); +ACE_EXPLOSION_REFLECTION(12,260); +ACE_EXPLOSION_REFLECTION(12,270); +ACE_EXPLOSION_REFLECTION(12,280); +ACE_EXPLOSION_REFLECTION(12,290); +ACE_EXPLOSION_REFLECTION(12,300); +ACE_EXPLOSION_REFLECTION(12,310); +ACE_EXPLOSION_REFLECTION(12,320); +ACE_EXPLOSION_REFLECTION(12,330); +ACE_EXPLOSION_REFLECTION(12,340); +ACE_EXPLOSION_REFLECTION(12,350); +ACE_EXPLOSION_REFLECTION(12,360); +ACE_EXPLOSION_REFLECTION(12,370); +ACE_EXPLOSION_REFLECTION(12,380); +ACE_EXPLOSION_REFLECTION(12,390); +ACE_EXPLOSION_REFLECTION(12,400); +ACE_EXPLOSION_REFLECTION(12,410); +ACE_EXPLOSION_REFLECTION(12,420); +ACE_EXPLOSION_REFLECTION(12,430); +ACE_EXPLOSION_REFLECTION(12,440); +ACE_EXPLOSION_REFLECTION(12,450); +ACE_EXPLOSION_REFLECTION(12,460); +ACE_EXPLOSION_REFLECTION(12,470); +ACE_EXPLOSION_REFLECTION(12,480); +ACE_EXPLOSION_REFLECTION(12,490); +ACE_EXPLOSION_REFLECTION(12,500); +ACE_EXPLOSION_REFLECTION(14,10); +ACE_EXPLOSION_REFLECTION(14,20); +ACE_EXPLOSION_REFLECTION(14,30); +ACE_EXPLOSION_REFLECTION(14,40); +ACE_EXPLOSION_REFLECTION(14,50); +ACE_EXPLOSION_REFLECTION(14,60); +ACE_EXPLOSION_REFLECTION(14,70); +ACE_EXPLOSION_REFLECTION(14,80); +ACE_EXPLOSION_REFLECTION(14,90); +ACE_EXPLOSION_REFLECTION(14,100); +ACE_EXPLOSION_REFLECTION(14,110); +ACE_EXPLOSION_REFLECTION(14,120); +ACE_EXPLOSION_REFLECTION(14,130); +ACE_EXPLOSION_REFLECTION(14,140); +ACE_EXPLOSION_REFLECTION(14,150); +ACE_EXPLOSION_REFLECTION(14,160); +ACE_EXPLOSION_REFLECTION(14,170); +ACE_EXPLOSION_REFLECTION(14,180); +ACE_EXPLOSION_REFLECTION(14,190); +ACE_EXPLOSION_REFLECTION(14,200); +ACE_EXPLOSION_REFLECTION(14,210); +ACE_EXPLOSION_REFLECTION(14,220); +ACE_EXPLOSION_REFLECTION(14,230); +ACE_EXPLOSION_REFLECTION(14,240); +ACE_EXPLOSION_REFLECTION(14,250); +ACE_EXPLOSION_REFLECTION(14,260); +ACE_EXPLOSION_REFLECTION(14,270); +ACE_EXPLOSION_REFLECTION(14,280); +ACE_EXPLOSION_REFLECTION(14,290); +ACE_EXPLOSION_REFLECTION(14,300); +ACE_EXPLOSION_REFLECTION(14,310); +ACE_EXPLOSION_REFLECTION(14,320); +ACE_EXPLOSION_REFLECTION(14,330); +ACE_EXPLOSION_REFLECTION(14,340); +ACE_EXPLOSION_REFLECTION(14,350); +ACE_EXPLOSION_REFLECTION(14,360); +ACE_EXPLOSION_REFLECTION(14,370); +ACE_EXPLOSION_REFLECTION(14,380); +ACE_EXPLOSION_REFLECTION(14,390); +ACE_EXPLOSION_REFLECTION(14,400); +ACE_EXPLOSION_REFLECTION(14,410); +ACE_EXPLOSION_REFLECTION(14,420); +ACE_EXPLOSION_REFLECTION(14,430); +ACE_EXPLOSION_REFLECTION(14,440); +ACE_EXPLOSION_REFLECTION(14,450); +ACE_EXPLOSION_REFLECTION(14,460); +ACE_EXPLOSION_REFLECTION(14,470); +ACE_EXPLOSION_REFLECTION(14,480); +ACE_EXPLOSION_REFLECTION(14,490); +ACE_EXPLOSION_REFLECTION(14,500); +ACE_EXPLOSION_REFLECTION(16,10); +ACE_EXPLOSION_REFLECTION(16,20); +ACE_EXPLOSION_REFLECTION(16,30); +ACE_EXPLOSION_REFLECTION(16,40); +ACE_EXPLOSION_REFLECTION(16,50); +ACE_EXPLOSION_REFLECTION(16,60); +ACE_EXPLOSION_REFLECTION(16,70); +ACE_EXPLOSION_REFLECTION(16,80); +ACE_EXPLOSION_REFLECTION(16,90); +ACE_EXPLOSION_REFLECTION(16,100); +ACE_EXPLOSION_REFLECTION(16,110); +ACE_EXPLOSION_REFLECTION(16,120); +ACE_EXPLOSION_REFLECTION(16,130); +ACE_EXPLOSION_REFLECTION(16,140); +ACE_EXPLOSION_REFLECTION(16,150); +ACE_EXPLOSION_REFLECTION(16,160); +ACE_EXPLOSION_REFLECTION(16,170); +ACE_EXPLOSION_REFLECTION(16,180); +ACE_EXPLOSION_REFLECTION(16,190); +ACE_EXPLOSION_REFLECTION(16,200); +ACE_EXPLOSION_REFLECTION(16,210); +ACE_EXPLOSION_REFLECTION(16,220); +ACE_EXPLOSION_REFLECTION(16,230); +ACE_EXPLOSION_REFLECTION(16,240); +ACE_EXPLOSION_REFLECTION(16,250); +ACE_EXPLOSION_REFLECTION(16,260); +ACE_EXPLOSION_REFLECTION(16,270); +ACE_EXPLOSION_REFLECTION(16,280); +ACE_EXPLOSION_REFLECTION(16,290); +ACE_EXPLOSION_REFLECTION(16,300); +ACE_EXPLOSION_REFLECTION(16,310); +ACE_EXPLOSION_REFLECTION(16,320); +ACE_EXPLOSION_REFLECTION(16,330); +ACE_EXPLOSION_REFLECTION(16,340); +ACE_EXPLOSION_REFLECTION(16,350); +ACE_EXPLOSION_REFLECTION(16,360); +ACE_EXPLOSION_REFLECTION(16,370); +ACE_EXPLOSION_REFLECTION(16,380); +ACE_EXPLOSION_REFLECTION(16,390); +ACE_EXPLOSION_REFLECTION(16,400); +ACE_EXPLOSION_REFLECTION(16,410); +ACE_EXPLOSION_REFLECTION(16,420); +ACE_EXPLOSION_REFLECTION(16,430); +ACE_EXPLOSION_REFLECTION(16,440); +ACE_EXPLOSION_REFLECTION(16,450); +ACE_EXPLOSION_REFLECTION(16,460); +ACE_EXPLOSION_REFLECTION(16,470); +ACE_EXPLOSION_REFLECTION(16,480); +ACE_EXPLOSION_REFLECTION(16,490); +ACE_EXPLOSION_REFLECTION(16,500); +ACE_EXPLOSION_REFLECTION(18,10); +ACE_EXPLOSION_REFLECTION(18,20); +ACE_EXPLOSION_REFLECTION(18,30); +ACE_EXPLOSION_REFLECTION(18,40); +ACE_EXPLOSION_REFLECTION(18,50); +ACE_EXPLOSION_REFLECTION(18,60); +ACE_EXPLOSION_REFLECTION(18,70); +ACE_EXPLOSION_REFLECTION(18,80); +ACE_EXPLOSION_REFLECTION(18,90); +ACE_EXPLOSION_REFLECTION(18,100); +ACE_EXPLOSION_REFLECTION(18,110); +ACE_EXPLOSION_REFLECTION(18,120); +ACE_EXPLOSION_REFLECTION(18,130); +ACE_EXPLOSION_REFLECTION(18,140); +ACE_EXPLOSION_REFLECTION(18,150); +ACE_EXPLOSION_REFLECTION(18,160); +ACE_EXPLOSION_REFLECTION(18,170); +ACE_EXPLOSION_REFLECTION(18,180); +ACE_EXPLOSION_REFLECTION(18,190); +ACE_EXPLOSION_REFLECTION(18,200); +ACE_EXPLOSION_REFLECTION(18,210); +ACE_EXPLOSION_REFLECTION(18,220); +ACE_EXPLOSION_REFLECTION(18,230); +ACE_EXPLOSION_REFLECTION(18,240); +ACE_EXPLOSION_REFLECTION(18,250); +ACE_EXPLOSION_REFLECTION(18,260); +ACE_EXPLOSION_REFLECTION(18,270); +ACE_EXPLOSION_REFLECTION(18,280); +ACE_EXPLOSION_REFLECTION(18,290); +ACE_EXPLOSION_REFLECTION(18,300); +ACE_EXPLOSION_REFLECTION(18,310); +ACE_EXPLOSION_REFLECTION(18,320); +ACE_EXPLOSION_REFLECTION(18,330); +ACE_EXPLOSION_REFLECTION(18,340); +ACE_EXPLOSION_REFLECTION(18,350); +ACE_EXPLOSION_REFLECTION(18,360); +ACE_EXPLOSION_REFLECTION(18,370); +ACE_EXPLOSION_REFLECTION(18,380); +ACE_EXPLOSION_REFLECTION(18,390); +ACE_EXPLOSION_REFLECTION(18,400); +ACE_EXPLOSION_REFLECTION(18,410); +ACE_EXPLOSION_REFLECTION(18,420); +ACE_EXPLOSION_REFLECTION(18,430); +ACE_EXPLOSION_REFLECTION(18,440); +ACE_EXPLOSION_REFLECTION(18,450); +ACE_EXPLOSION_REFLECTION(18,460); +ACE_EXPLOSION_REFLECTION(18,470); +ACE_EXPLOSION_REFLECTION(18,480); +ACE_EXPLOSION_REFLECTION(18,490); +ACE_EXPLOSION_REFLECTION(18,500); +ACE_EXPLOSION_REFLECTION(20,10); +ACE_EXPLOSION_REFLECTION(20,20); +ACE_EXPLOSION_REFLECTION(20,30); +ACE_EXPLOSION_REFLECTION(20,40); +ACE_EXPLOSION_REFLECTION(20,50); +ACE_EXPLOSION_REFLECTION(20,60); +ACE_EXPLOSION_REFLECTION(20,70); +ACE_EXPLOSION_REFLECTION(20,80); +ACE_EXPLOSION_REFLECTION(20,90); +ACE_EXPLOSION_REFLECTION(20,100); +ACE_EXPLOSION_REFLECTION(20,110); +ACE_EXPLOSION_REFLECTION(20,120); +ACE_EXPLOSION_REFLECTION(20,130); +ACE_EXPLOSION_REFLECTION(20,140); +ACE_EXPLOSION_REFLECTION(20,150); +ACE_EXPLOSION_REFLECTION(20,160); +ACE_EXPLOSION_REFLECTION(20,170); +ACE_EXPLOSION_REFLECTION(20,180); +ACE_EXPLOSION_REFLECTION(20,190); +ACE_EXPLOSION_REFLECTION(20,200); +ACE_EXPLOSION_REFLECTION(20,210); +ACE_EXPLOSION_REFLECTION(20,220); +ACE_EXPLOSION_REFLECTION(20,230); +ACE_EXPLOSION_REFLECTION(20,240); +ACE_EXPLOSION_REFLECTION(20,250); +ACE_EXPLOSION_REFLECTION(20,260); +ACE_EXPLOSION_REFLECTION(20,270); +ACE_EXPLOSION_REFLECTION(20,280); +ACE_EXPLOSION_REFLECTION(20,290); +ACE_EXPLOSION_REFLECTION(20,300); +ACE_EXPLOSION_REFLECTION(20,310); +ACE_EXPLOSION_REFLECTION(20,320); +ACE_EXPLOSION_REFLECTION(20,330); +ACE_EXPLOSION_REFLECTION(20,340); +ACE_EXPLOSION_REFLECTION(20,350); +ACE_EXPLOSION_REFLECTION(20,360); +ACE_EXPLOSION_REFLECTION(20,370); +ACE_EXPLOSION_REFLECTION(20,380); +ACE_EXPLOSION_REFLECTION(20,390); +ACE_EXPLOSION_REFLECTION(20,400); +ACE_EXPLOSION_REFLECTION(20,410); +ACE_EXPLOSION_REFLECTION(20,420); +ACE_EXPLOSION_REFLECTION(20,430); +ACE_EXPLOSION_REFLECTION(20,440); +ACE_EXPLOSION_REFLECTION(20,450); +ACE_EXPLOSION_REFLECTION(20,460); +ACE_EXPLOSION_REFLECTION(20,470); +ACE_EXPLOSION_REFLECTION(20,480); +ACE_EXPLOSION_REFLECTION(20,490); +ACE_EXPLOSION_REFLECTION(20,500); +ACE_EXPLOSION_REFLECTION(22,10); +ACE_EXPLOSION_REFLECTION(22,20); +ACE_EXPLOSION_REFLECTION(22,30); +ACE_EXPLOSION_REFLECTION(22,40); +ACE_EXPLOSION_REFLECTION(22,50); +ACE_EXPLOSION_REFLECTION(22,60); +ACE_EXPLOSION_REFLECTION(22,70); +ACE_EXPLOSION_REFLECTION(22,80); +ACE_EXPLOSION_REFLECTION(22,90); +ACE_EXPLOSION_REFLECTION(22,100); +ACE_EXPLOSION_REFLECTION(22,110); +ACE_EXPLOSION_REFLECTION(22,120); +ACE_EXPLOSION_REFLECTION(22,130); +ACE_EXPLOSION_REFLECTION(22,140); +ACE_EXPLOSION_REFLECTION(22,150); +ACE_EXPLOSION_REFLECTION(22,160); +ACE_EXPLOSION_REFLECTION(22,170); +ACE_EXPLOSION_REFLECTION(22,180); +ACE_EXPLOSION_REFLECTION(22,190); +ACE_EXPLOSION_REFLECTION(22,200); +ACE_EXPLOSION_REFLECTION(22,210); +ACE_EXPLOSION_REFLECTION(22,220); +ACE_EXPLOSION_REFLECTION(22,230); +ACE_EXPLOSION_REFLECTION(22,240); +ACE_EXPLOSION_REFLECTION(22,250); +ACE_EXPLOSION_REFLECTION(22,260); +ACE_EXPLOSION_REFLECTION(22,270); +ACE_EXPLOSION_REFLECTION(22,280); +ACE_EXPLOSION_REFLECTION(22,290); +ACE_EXPLOSION_REFLECTION(22,300); +ACE_EXPLOSION_REFLECTION(22,310); +ACE_EXPLOSION_REFLECTION(22,320); +ACE_EXPLOSION_REFLECTION(22,330); +ACE_EXPLOSION_REFLECTION(22,340); +ACE_EXPLOSION_REFLECTION(22,350); +ACE_EXPLOSION_REFLECTION(22,360); +ACE_EXPLOSION_REFLECTION(22,370); +ACE_EXPLOSION_REFLECTION(22,380); +ACE_EXPLOSION_REFLECTION(22,390); +ACE_EXPLOSION_REFLECTION(22,400); +ACE_EXPLOSION_REFLECTION(22,410); +ACE_EXPLOSION_REFLECTION(22,420); +ACE_EXPLOSION_REFLECTION(22,430); +ACE_EXPLOSION_REFLECTION(22,440); +ACE_EXPLOSION_REFLECTION(22,450); +ACE_EXPLOSION_REFLECTION(22,460); +ACE_EXPLOSION_REFLECTION(22,470); +ACE_EXPLOSION_REFLECTION(22,480); +ACE_EXPLOSION_REFLECTION(22,490); +ACE_EXPLOSION_REFLECTION(22,500); +ACE_EXPLOSION_REFLECTION(24,10); +ACE_EXPLOSION_REFLECTION(24,20); +ACE_EXPLOSION_REFLECTION(24,30); +ACE_EXPLOSION_REFLECTION(24,40); +ACE_EXPLOSION_REFLECTION(24,50); +ACE_EXPLOSION_REFLECTION(24,60); +ACE_EXPLOSION_REFLECTION(24,70); +ACE_EXPLOSION_REFLECTION(24,80); +ACE_EXPLOSION_REFLECTION(24,90); +ACE_EXPLOSION_REFLECTION(24,100); +ACE_EXPLOSION_REFLECTION(24,110); +ACE_EXPLOSION_REFLECTION(24,120); +ACE_EXPLOSION_REFLECTION(24,130); +ACE_EXPLOSION_REFLECTION(24,140); +ACE_EXPLOSION_REFLECTION(24,150); +ACE_EXPLOSION_REFLECTION(24,160); +ACE_EXPLOSION_REFLECTION(24,170); +ACE_EXPLOSION_REFLECTION(24,180); +ACE_EXPLOSION_REFLECTION(24,190); +ACE_EXPLOSION_REFLECTION(24,200); +ACE_EXPLOSION_REFLECTION(24,210); +ACE_EXPLOSION_REFLECTION(24,220); +ACE_EXPLOSION_REFLECTION(24,230); +ACE_EXPLOSION_REFLECTION(24,240); +ACE_EXPLOSION_REFLECTION(24,250); +ACE_EXPLOSION_REFLECTION(24,260); +ACE_EXPLOSION_REFLECTION(24,270); +ACE_EXPLOSION_REFLECTION(24,280); +ACE_EXPLOSION_REFLECTION(24,290); +ACE_EXPLOSION_REFLECTION(24,300); +ACE_EXPLOSION_REFLECTION(24,310); +ACE_EXPLOSION_REFLECTION(24,320); +ACE_EXPLOSION_REFLECTION(24,330); +ACE_EXPLOSION_REFLECTION(24,340); +ACE_EXPLOSION_REFLECTION(24,350); +ACE_EXPLOSION_REFLECTION(24,360); +ACE_EXPLOSION_REFLECTION(24,370); +ACE_EXPLOSION_REFLECTION(24,380); +ACE_EXPLOSION_REFLECTION(24,390); +ACE_EXPLOSION_REFLECTION(24,400); +ACE_EXPLOSION_REFLECTION(24,410); +ACE_EXPLOSION_REFLECTION(24,420); +ACE_EXPLOSION_REFLECTION(24,430); +ACE_EXPLOSION_REFLECTION(24,440); +ACE_EXPLOSION_REFLECTION(24,450); +ACE_EXPLOSION_REFLECTION(24,460); +ACE_EXPLOSION_REFLECTION(24,470); +ACE_EXPLOSION_REFLECTION(24,480); +ACE_EXPLOSION_REFLECTION(24,490); +ACE_EXPLOSION_REFLECTION(24,500); +ACE_EXPLOSION_REFLECTION(26,10); +ACE_EXPLOSION_REFLECTION(26,20); +ACE_EXPLOSION_REFLECTION(26,30); +ACE_EXPLOSION_REFLECTION(26,40); +ACE_EXPLOSION_REFLECTION(26,50); +ACE_EXPLOSION_REFLECTION(26,60); +ACE_EXPLOSION_REFLECTION(26,70); +ACE_EXPLOSION_REFLECTION(26,80); +ACE_EXPLOSION_REFLECTION(26,90); +ACE_EXPLOSION_REFLECTION(26,100); +ACE_EXPLOSION_REFLECTION(26,110); +ACE_EXPLOSION_REFLECTION(26,120); +ACE_EXPLOSION_REFLECTION(26,130); +ACE_EXPLOSION_REFLECTION(26,140); +ACE_EXPLOSION_REFLECTION(26,150); +ACE_EXPLOSION_REFLECTION(26,160); +ACE_EXPLOSION_REFLECTION(26,170); +ACE_EXPLOSION_REFLECTION(26,180); +ACE_EXPLOSION_REFLECTION(26,190); +ACE_EXPLOSION_REFLECTION(26,200); +ACE_EXPLOSION_REFLECTION(26,210); +ACE_EXPLOSION_REFLECTION(26,220); +ACE_EXPLOSION_REFLECTION(26,230); +ACE_EXPLOSION_REFLECTION(26,240); +ACE_EXPLOSION_REFLECTION(26,250); +ACE_EXPLOSION_REFLECTION(26,260); +ACE_EXPLOSION_REFLECTION(26,270); +ACE_EXPLOSION_REFLECTION(26,280); +ACE_EXPLOSION_REFLECTION(26,290); +ACE_EXPLOSION_REFLECTION(26,300); +ACE_EXPLOSION_REFLECTION(26,310); +ACE_EXPLOSION_REFLECTION(26,320); +ACE_EXPLOSION_REFLECTION(26,330); +ACE_EXPLOSION_REFLECTION(26,340); +ACE_EXPLOSION_REFLECTION(26,350); +ACE_EXPLOSION_REFLECTION(26,360); +ACE_EXPLOSION_REFLECTION(26,370); +ACE_EXPLOSION_REFLECTION(26,380); +ACE_EXPLOSION_REFLECTION(26,390); +ACE_EXPLOSION_REFLECTION(26,400); +ACE_EXPLOSION_REFLECTION(26,410); +ACE_EXPLOSION_REFLECTION(26,420); +ACE_EXPLOSION_REFLECTION(26,430); +ACE_EXPLOSION_REFLECTION(26,440); +ACE_EXPLOSION_REFLECTION(26,450); +ACE_EXPLOSION_REFLECTION(26,460); +ACE_EXPLOSION_REFLECTION(26,470); +ACE_EXPLOSION_REFLECTION(26,480); +ACE_EXPLOSION_REFLECTION(26,490); +ACE_EXPLOSION_REFLECTION(26,500); +ACE_EXPLOSION_REFLECTION(28,10); +ACE_EXPLOSION_REFLECTION(28,20); +ACE_EXPLOSION_REFLECTION(28,30); +ACE_EXPLOSION_REFLECTION(28,40); +ACE_EXPLOSION_REFLECTION(28,50); +ACE_EXPLOSION_REFLECTION(28,60); +ACE_EXPLOSION_REFLECTION(28,70); +ACE_EXPLOSION_REFLECTION(28,80); +ACE_EXPLOSION_REFLECTION(28,90); +ACE_EXPLOSION_REFLECTION(28,100); +ACE_EXPLOSION_REFLECTION(28,110); +ACE_EXPLOSION_REFLECTION(28,120); +ACE_EXPLOSION_REFLECTION(28,130); +ACE_EXPLOSION_REFLECTION(28,140); +ACE_EXPLOSION_REFLECTION(28,150); +ACE_EXPLOSION_REFLECTION(28,160); +ACE_EXPLOSION_REFLECTION(28,170); +ACE_EXPLOSION_REFLECTION(28,180); +ACE_EXPLOSION_REFLECTION(28,190); +ACE_EXPLOSION_REFLECTION(28,200); +ACE_EXPLOSION_REFLECTION(28,210); +ACE_EXPLOSION_REFLECTION(28,220); +ACE_EXPLOSION_REFLECTION(28,230); +ACE_EXPLOSION_REFLECTION(28,240); +ACE_EXPLOSION_REFLECTION(28,250); +ACE_EXPLOSION_REFLECTION(28,260); +ACE_EXPLOSION_REFLECTION(28,270); +ACE_EXPLOSION_REFLECTION(28,280); +ACE_EXPLOSION_REFLECTION(28,290); +ACE_EXPLOSION_REFLECTION(28,300); +ACE_EXPLOSION_REFLECTION(28,310); +ACE_EXPLOSION_REFLECTION(28,320); +ACE_EXPLOSION_REFLECTION(28,330); +ACE_EXPLOSION_REFLECTION(28,340); +ACE_EXPLOSION_REFLECTION(28,350); +ACE_EXPLOSION_REFLECTION(28,360); +ACE_EXPLOSION_REFLECTION(28,370); +ACE_EXPLOSION_REFLECTION(28,380); +ACE_EXPLOSION_REFLECTION(28,390); +ACE_EXPLOSION_REFLECTION(28,400); +ACE_EXPLOSION_REFLECTION(28,410); +ACE_EXPLOSION_REFLECTION(28,420); +ACE_EXPLOSION_REFLECTION(28,430); +ACE_EXPLOSION_REFLECTION(28,440); +ACE_EXPLOSION_REFLECTION(28,450); +ACE_EXPLOSION_REFLECTION(28,460); +ACE_EXPLOSION_REFLECTION(28,470); +ACE_EXPLOSION_REFLECTION(28,480); +ACE_EXPLOSION_REFLECTION(28,490); +ACE_EXPLOSION_REFLECTION(28,500); +ACE_EXPLOSION_REFLECTION(30,10); +ACE_EXPLOSION_REFLECTION(30,20); +ACE_EXPLOSION_REFLECTION(30,30); +ACE_EXPLOSION_REFLECTION(30,40); +ACE_EXPLOSION_REFLECTION(30,50); +ACE_EXPLOSION_REFLECTION(30,60); +ACE_EXPLOSION_REFLECTION(30,70); +ACE_EXPLOSION_REFLECTION(30,80); +ACE_EXPLOSION_REFLECTION(30,90); +ACE_EXPLOSION_REFLECTION(30,100); +ACE_EXPLOSION_REFLECTION(30,110); +ACE_EXPLOSION_REFLECTION(30,120); +ACE_EXPLOSION_REFLECTION(30,130); +ACE_EXPLOSION_REFLECTION(30,140); +ACE_EXPLOSION_REFLECTION(30,150); +ACE_EXPLOSION_REFLECTION(30,160); +ACE_EXPLOSION_REFLECTION(30,170); +ACE_EXPLOSION_REFLECTION(30,180); +ACE_EXPLOSION_REFLECTION(30,190); +ACE_EXPLOSION_REFLECTION(30,200); +ACE_EXPLOSION_REFLECTION(30,210); +ACE_EXPLOSION_REFLECTION(30,220); +ACE_EXPLOSION_REFLECTION(30,230); +ACE_EXPLOSION_REFLECTION(30,240); +ACE_EXPLOSION_REFLECTION(30,250); +ACE_EXPLOSION_REFLECTION(30,260); +ACE_EXPLOSION_REFLECTION(30,270); +ACE_EXPLOSION_REFLECTION(30,280); +ACE_EXPLOSION_REFLECTION(30,290); +ACE_EXPLOSION_REFLECTION(30,300); +ACE_EXPLOSION_REFLECTION(30,310); +ACE_EXPLOSION_REFLECTION(30,320); +ACE_EXPLOSION_REFLECTION(30,330); +ACE_EXPLOSION_REFLECTION(30,340); +ACE_EXPLOSION_REFLECTION(30,350); +ACE_EXPLOSION_REFLECTION(30,360); +ACE_EXPLOSION_REFLECTION(30,370); +ACE_EXPLOSION_REFLECTION(30,380); +ACE_EXPLOSION_REFLECTION(30,390); +ACE_EXPLOSION_REFLECTION(30,400); +ACE_EXPLOSION_REFLECTION(30,410); +ACE_EXPLOSION_REFLECTION(30,420); +ACE_EXPLOSION_REFLECTION(30,430); +ACE_EXPLOSION_REFLECTION(30,440); +ACE_EXPLOSION_REFLECTION(30,450); +ACE_EXPLOSION_REFLECTION(30,460); +ACE_EXPLOSION_REFLECTION(30,470); +ACE_EXPLOSION_REFLECTION(30,480); +ACE_EXPLOSION_REFLECTION(30,490); +ACE_EXPLOSION_REFLECTION(30,500); +ACE_EXPLOSION_REFLECTION(32,10); +ACE_EXPLOSION_REFLECTION(32,20); +ACE_EXPLOSION_REFLECTION(32,30); +ACE_EXPLOSION_REFLECTION(32,40); +ACE_EXPLOSION_REFLECTION(32,50); +ACE_EXPLOSION_REFLECTION(32,60); +ACE_EXPLOSION_REFLECTION(32,70); +ACE_EXPLOSION_REFLECTION(32,80); +ACE_EXPLOSION_REFLECTION(32,90); +ACE_EXPLOSION_REFLECTION(32,100); +ACE_EXPLOSION_REFLECTION(32,110); +ACE_EXPLOSION_REFLECTION(32,120); +ACE_EXPLOSION_REFLECTION(32,130); +ACE_EXPLOSION_REFLECTION(32,140); +ACE_EXPLOSION_REFLECTION(32,150); +ACE_EXPLOSION_REFLECTION(32,160); +ACE_EXPLOSION_REFLECTION(32,170); +ACE_EXPLOSION_REFLECTION(32,180); +ACE_EXPLOSION_REFLECTION(32,190); +ACE_EXPLOSION_REFLECTION(32,200); +ACE_EXPLOSION_REFLECTION(32,210); +ACE_EXPLOSION_REFLECTION(32,220); +ACE_EXPLOSION_REFLECTION(32,230); +ACE_EXPLOSION_REFLECTION(32,240); +ACE_EXPLOSION_REFLECTION(32,250); +ACE_EXPLOSION_REFLECTION(32,260); +ACE_EXPLOSION_REFLECTION(32,270); +ACE_EXPLOSION_REFLECTION(32,280); +ACE_EXPLOSION_REFLECTION(32,290); +ACE_EXPLOSION_REFLECTION(32,300); +ACE_EXPLOSION_REFLECTION(32,310); +ACE_EXPLOSION_REFLECTION(32,320); +ACE_EXPLOSION_REFLECTION(32,330); +ACE_EXPLOSION_REFLECTION(32,340); +ACE_EXPLOSION_REFLECTION(32,350); +ACE_EXPLOSION_REFLECTION(32,360); +ACE_EXPLOSION_REFLECTION(32,370); +ACE_EXPLOSION_REFLECTION(32,380); +ACE_EXPLOSION_REFLECTION(32,390); +ACE_EXPLOSION_REFLECTION(32,400); +ACE_EXPLOSION_REFLECTION(32,410); +ACE_EXPLOSION_REFLECTION(32,420); +ACE_EXPLOSION_REFLECTION(32,430); +ACE_EXPLOSION_REFLECTION(32,440); +ACE_EXPLOSION_REFLECTION(32,450); +ACE_EXPLOSION_REFLECTION(32,460); +ACE_EXPLOSION_REFLECTION(32,470); +ACE_EXPLOSION_REFLECTION(32,480); +ACE_EXPLOSION_REFLECTION(32,490); +ACE_EXPLOSION_REFLECTION(32,500); +ACE_EXPLOSION_REFLECTION(34,10); +ACE_EXPLOSION_REFLECTION(34,20); +ACE_EXPLOSION_REFLECTION(34,30); +ACE_EXPLOSION_REFLECTION(34,40); +ACE_EXPLOSION_REFLECTION(34,50); +ACE_EXPLOSION_REFLECTION(34,60); +ACE_EXPLOSION_REFLECTION(34,70); +ACE_EXPLOSION_REFLECTION(34,80); +ACE_EXPLOSION_REFLECTION(34,90); +ACE_EXPLOSION_REFLECTION(34,100); +ACE_EXPLOSION_REFLECTION(34,110); +ACE_EXPLOSION_REFLECTION(34,120); +ACE_EXPLOSION_REFLECTION(34,130); +ACE_EXPLOSION_REFLECTION(34,140); +ACE_EXPLOSION_REFLECTION(34,150); +ACE_EXPLOSION_REFLECTION(34,160); +ACE_EXPLOSION_REFLECTION(34,170); +ACE_EXPLOSION_REFLECTION(34,180); +ACE_EXPLOSION_REFLECTION(34,190); +ACE_EXPLOSION_REFLECTION(34,200); +ACE_EXPLOSION_REFLECTION(34,210); +ACE_EXPLOSION_REFLECTION(34,220); +ACE_EXPLOSION_REFLECTION(34,230); +ACE_EXPLOSION_REFLECTION(34,240); +ACE_EXPLOSION_REFLECTION(34,250); +ACE_EXPLOSION_REFLECTION(34,260); +ACE_EXPLOSION_REFLECTION(34,270); +ACE_EXPLOSION_REFLECTION(34,280); +ACE_EXPLOSION_REFLECTION(34,290); +ACE_EXPLOSION_REFLECTION(34,300); +ACE_EXPLOSION_REFLECTION(34,310); +ACE_EXPLOSION_REFLECTION(34,320); +ACE_EXPLOSION_REFLECTION(34,330); +ACE_EXPLOSION_REFLECTION(34,340); +ACE_EXPLOSION_REFLECTION(34,350); +ACE_EXPLOSION_REFLECTION(34,360); +ACE_EXPLOSION_REFLECTION(34,370); +ACE_EXPLOSION_REFLECTION(34,380); +ACE_EXPLOSION_REFLECTION(34,390); +ACE_EXPLOSION_REFLECTION(34,400); +ACE_EXPLOSION_REFLECTION(34,410); +ACE_EXPLOSION_REFLECTION(34,420); +ACE_EXPLOSION_REFLECTION(34,430); +ACE_EXPLOSION_REFLECTION(34,440); +ACE_EXPLOSION_REFLECTION(34,450); +ACE_EXPLOSION_REFLECTION(34,460); +ACE_EXPLOSION_REFLECTION(34,470); +ACE_EXPLOSION_REFLECTION(34,480); +ACE_EXPLOSION_REFLECTION(34,490); +ACE_EXPLOSION_REFLECTION(34,500); +ACE_EXPLOSION_REFLECTION(36,10); +ACE_EXPLOSION_REFLECTION(36,20); +ACE_EXPLOSION_REFLECTION(36,30); +ACE_EXPLOSION_REFLECTION(36,40); +ACE_EXPLOSION_REFLECTION(36,50); +ACE_EXPLOSION_REFLECTION(36,60); +ACE_EXPLOSION_REFLECTION(36,70); +ACE_EXPLOSION_REFLECTION(36,80); +ACE_EXPLOSION_REFLECTION(36,90); +ACE_EXPLOSION_REFLECTION(36,100); +ACE_EXPLOSION_REFLECTION(36,110); +ACE_EXPLOSION_REFLECTION(36,120); +ACE_EXPLOSION_REFLECTION(36,130); +ACE_EXPLOSION_REFLECTION(36,140); +ACE_EXPLOSION_REFLECTION(36,150); +ACE_EXPLOSION_REFLECTION(36,160); +ACE_EXPLOSION_REFLECTION(36,170); +ACE_EXPLOSION_REFLECTION(36,180); +ACE_EXPLOSION_REFLECTION(36,190); +ACE_EXPLOSION_REFLECTION(36,200); +ACE_EXPLOSION_REFLECTION(36,210); +ACE_EXPLOSION_REFLECTION(36,220); +ACE_EXPLOSION_REFLECTION(36,230); +ACE_EXPLOSION_REFLECTION(36,240); +ACE_EXPLOSION_REFLECTION(36,250); +ACE_EXPLOSION_REFLECTION(36,260); +ACE_EXPLOSION_REFLECTION(36,270); +ACE_EXPLOSION_REFLECTION(36,280); +ACE_EXPLOSION_REFLECTION(36,290); +ACE_EXPLOSION_REFLECTION(36,300); +ACE_EXPLOSION_REFLECTION(36,310); +ACE_EXPLOSION_REFLECTION(36,320); +ACE_EXPLOSION_REFLECTION(36,330); +ACE_EXPLOSION_REFLECTION(36,340); +ACE_EXPLOSION_REFLECTION(36,350); +ACE_EXPLOSION_REFLECTION(36,360); +ACE_EXPLOSION_REFLECTION(36,370); +ACE_EXPLOSION_REFLECTION(36,380); +ACE_EXPLOSION_REFLECTION(36,390); +ACE_EXPLOSION_REFLECTION(36,400); +ACE_EXPLOSION_REFLECTION(36,410); +ACE_EXPLOSION_REFLECTION(36,420); +ACE_EXPLOSION_REFLECTION(36,430); +ACE_EXPLOSION_REFLECTION(36,440); +ACE_EXPLOSION_REFLECTION(36,450); +ACE_EXPLOSION_REFLECTION(36,460); +ACE_EXPLOSION_REFLECTION(36,470); +ACE_EXPLOSION_REFLECTION(36,480); +ACE_EXPLOSION_REFLECTION(36,490); +ACE_EXPLOSION_REFLECTION(36,500); +ACE_EXPLOSION_REFLECTION(38,10); +ACE_EXPLOSION_REFLECTION(38,20); +ACE_EXPLOSION_REFLECTION(38,30); +ACE_EXPLOSION_REFLECTION(38,40); +ACE_EXPLOSION_REFLECTION(38,50); +ACE_EXPLOSION_REFLECTION(38,60); +ACE_EXPLOSION_REFLECTION(38,70); +ACE_EXPLOSION_REFLECTION(38,80); +ACE_EXPLOSION_REFLECTION(38,90); +ACE_EXPLOSION_REFLECTION(38,100); +ACE_EXPLOSION_REFLECTION(38,110); +ACE_EXPLOSION_REFLECTION(38,120); +ACE_EXPLOSION_REFLECTION(38,130); +ACE_EXPLOSION_REFLECTION(38,140); +ACE_EXPLOSION_REFLECTION(38,150); +ACE_EXPLOSION_REFLECTION(38,160); +ACE_EXPLOSION_REFLECTION(38,170); +ACE_EXPLOSION_REFLECTION(38,180); +ACE_EXPLOSION_REFLECTION(38,190); +ACE_EXPLOSION_REFLECTION(38,200); +ACE_EXPLOSION_REFLECTION(38,210); +ACE_EXPLOSION_REFLECTION(38,220); +ACE_EXPLOSION_REFLECTION(38,230); +ACE_EXPLOSION_REFLECTION(38,240); +ACE_EXPLOSION_REFLECTION(38,250); +ACE_EXPLOSION_REFLECTION(38,260); +ACE_EXPLOSION_REFLECTION(38,270); +ACE_EXPLOSION_REFLECTION(38,280); +ACE_EXPLOSION_REFLECTION(38,290); +ACE_EXPLOSION_REFLECTION(38,300); +ACE_EXPLOSION_REFLECTION(38,310); +ACE_EXPLOSION_REFLECTION(38,320); +ACE_EXPLOSION_REFLECTION(38,330); +ACE_EXPLOSION_REFLECTION(38,340); +ACE_EXPLOSION_REFLECTION(38,350); +ACE_EXPLOSION_REFLECTION(38,360); +ACE_EXPLOSION_REFLECTION(38,370); +ACE_EXPLOSION_REFLECTION(38,380); +ACE_EXPLOSION_REFLECTION(38,390); +ACE_EXPLOSION_REFLECTION(38,400); +ACE_EXPLOSION_REFLECTION(38,410); +ACE_EXPLOSION_REFLECTION(38,420); +ACE_EXPLOSION_REFLECTION(38,430); +ACE_EXPLOSION_REFLECTION(38,440); +ACE_EXPLOSION_REFLECTION(38,450); +ACE_EXPLOSION_REFLECTION(38,460); +ACE_EXPLOSION_REFLECTION(38,470); +ACE_EXPLOSION_REFLECTION(38,480); +ACE_EXPLOSION_REFLECTION(38,490); +ACE_EXPLOSION_REFLECTION(38,500); +ACE_EXPLOSION_REFLECTION(40,10); +ACE_EXPLOSION_REFLECTION(40,20); +ACE_EXPLOSION_REFLECTION(40,30); +ACE_EXPLOSION_REFLECTION(40,40); +ACE_EXPLOSION_REFLECTION(40,50); +ACE_EXPLOSION_REFLECTION(40,60); +ACE_EXPLOSION_REFLECTION(40,70); +ACE_EXPLOSION_REFLECTION(40,80); +ACE_EXPLOSION_REFLECTION(40,90); +ACE_EXPLOSION_REFLECTION(40,100); +ACE_EXPLOSION_REFLECTION(40,110); +ACE_EXPLOSION_REFLECTION(40,120); +ACE_EXPLOSION_REFLECTION(40,130); +ACE_EXPLOSION_REFLECTION(40,140); +ACE_EXPLOSION_REFLECTION(40,150); +ACE_EXPLOSION_REFLECTION(40,160); +ACE_EXPLOSION_REFLECTION(40,170); +ACE_EXPLOSION_REFLECTION(40,180); +ACE_EXPLOSION_REFLECTION(40,190); +ACE_EXPLOSION_REFLECTION(40,200); +ACE_EXPLOSION_REFLECTION(40,210); +ACE_EXPLOSION_REFLECTION(40,220); +ACE_EXPLOSION_REFLECTION(40,230); +ACE_EXPLOSION_REFLECTION(40,240); +ACE_EXPLOSION_REFLECTION(40,250); +ACE_EXPLOSION_REFLECTION(40,260); +ACE_EXPLOSION_REFLECTION(40,270); +ACE_EXPLOSION_REFLECTION(40,280); +ACE_EXPLOSION_REFLECTION(40,290); +ACE_EXPLOSION_REFLECTION(40,300); +ACE_EXPLOSION_REFLECTION(40,310); +ACE_EXPLOSION_REFLECTION(40,320); +ACE_EXPLOSION_REFLECTION(40,330); +ACE_EXPLOSION_REFLECTION(40,340); +ACE_EXPLOSION_REFLECTION(40,350); +ACE_EXPLOSION_REFLECTION(40,360); +ACE_EXPLOSION_REFLECTION(40,370); +ACE_EXPLOSION_REFLECTION(40,380); +ACE_EXPLOSION_REFLECTION(40,390); +ACE_EXPLOSION_REFLECTION(40,400); +ACE_EXPLOSION_REFLECTION(40,410); +ACE_EXPLOSION_REFLECTION(40,420); +ACE_EXPLOSION_REFLECTION(40,430); +ACE_EXPLOSION_REFLECTION(40,440); +ACE_EXPLOSION_REFLECTION(40,450); +ACE_EXPLOSION_REFLECTION(40,460); +ACE_EXPLOSION_REFLECTION(40,470); +ACE_EXPLOSION_REFLECTION(40,480); +ACE_EXPLOSION_REFLECTION(40,490); +ACE_EXPLOSION_REFLECTION(40,500); +ACE_EXPLOSION_REFLECTION(42,10); +ACE_EXPLOSION_REFLECTION(42,20); +ACE_EXPLOSION_REFLECTION(42,30); +ACE_EXPLOSION_REFLECTION(42,40); +ACE_EXPLOSION_REFLECTION(42,50); +ACE_EXPLOSION_REFLECTION(42,60); +ACE_EXPLOSION_REFLECTION(42,70); +ACE_EXPLOSION_REFLECTION(42,80); +ACE_EXPLOSION_REFLECTION(42,90); +ACE_EXPLOSION_REFLECTION(42,100); +ACE_EXPLOSION_REFLECTION(42,110); +ACE_EXPLOSION_REFLECTION(42,120); +ACE_EXPLOSION_REFLECTION(42,130); +ACE_EXPLOSION_REFLECTION(42,140); +ACE_EXPLOSION_REFLECTION(42,150); +ACE_EXPLOSION_REFLECTION(42,160); +ACE_EXPLOSION_REFLECTION(42,170); +ACE_EXPLOSION_REFLECTION(42,180); +ACE_EXPLOSION_REFLECTION(42,190); +ACE_EXPLOSION_REFLECTION(42,200); +ACE_EXPLOSION_REFLECTION(42,210); +ACE_EXPLOSION_REFLECTION(42,220); +ACE_EXPLOSION_REFLECTION(42,230); +ACE_EXPLOSION_REFLECTION(42,240); +ACE_EXPLOSION_REFLECTION(42,250); +ACE_EXPLOSION_REFLECTION(42,260); +ACE_EXPLOSION_REFLECTION(42,270); +ACE_EXPLOSION_REFLECTION(42,280); +ACE_EXPLOSION_REFLECTION(42,290); +ACE_EXPLOSION_REFLECTION(42,300); +ACE_EXPLOSION_REFLECTION(42,310); +ACE_EXPLOSION_REFLECTION(42,320); +ACE_EXPLOSION_REFLECTION(42,330); +ACE_EXPLOSION_REFLECTION(42,340); +ACE_EXPLOSION_REFLECTION(42,350); +ACE_EXPLOSION_REFLECTION(42,360); +ACE_EXPLOSION_REFLECTION(42,370); +ACE_EXPLOSION_REFLECTION(42,380); +ACE_EXPLOSION_REFLECTION(42,390); +ACE_EXPLOSION_REFLECTION(42,400); +ACE_EXPLOSION_REFLECTION(42,410); +ACE_EXPLOSION_REFLECTION(42,420); +ACE_EXPLOSION_REFLECTION(42,430); +ACE_EXPLOSION_REFLECTION(42,440); +ACE_EXPLOSION_REFLECTION(42,450); +ACE_EXPLOSION_REFLECTION(42,460); +ACE_EXPLOSION_REFLECTION(42,470); +ACE_EXPLOSION_REFLECTION(42,480); +ACE_EXPLOSION_REFLECTION(42,490); +ACE_EXPLOSION_REFLECTION(42,500); +ACE_EXPLOSION_REFLECTION(44,10); +ACE_EXPLOSION_REFLECTION(44,20); +ACE_EXPLOSION_REFLECTION(44,30); +ACE_EXPLOSION_REFLECTION(44,40); +ACE_EXPLOSION_REFLECTION(44,50); +ACE_EXPLOSION_REFLECTION(44,60); +ACE_EXPLOSION_REFLECTION(44,70); +ACE_EXPLOSION_REFLECTION(44,80); +ACE_EXPLOSION_REFLECTION(44,90); +ACE_EXPLOSION_REFLECTION(44,100); +ACE_EXPLOSION_REFLECTION(44,110); +ACE_EXPLOSION_REFLECTION(44,120); +ACE_EXPLOSION_REFLECTION(44,130); +ACE_EXPLOSION_REFLECTION(44,140); +ACE_EXPLOSION_REFLECTION(44,150); +ACE_EXPLOSION_REFLECTION(44,160); +ACE_EXPLOSION_REFLECTION(44,170); +ACE_EXPLOSION_REFLECTION(44,180); +ACE_EXPLOSION_REFLECTION(44,190); +ACE_EXPLOSION_REFLECTION(44,200); +ACE_EXPLOSION_REFLECTION(44,210); +ACE_EXPLOSION_REFLECTION(44,220); +ACE_EXPLOSION_REFLECTION(44,230); +ACE_EXPLOSION_REFLECTION(44,240); +ACE_EXPLOSION_REFLECTION(44,250); +ACE_EXPLOSION_REFLECTION(44,260); +ACE_EXPLOSION_REFLECTION(44,270); +ACE_EXPLOSION_REFLECTION(44,280); +ACE_EXPLOSION_REFLECTION(44,290); +ACE_EXPLOSION_REFLECTION(44,300); +ACE_EXPLOSION_REFLECTION(44,310); +ACE_EXPLOSION_REFLECTION(44,320); +ACE_EXPLOSION_REFLECTION(44,330); +ACE_EXPLOSION_REFLECTION(44,340); +ACE_EXPLOSION_REFLECTION(44,350); +ACE_EXPLOSION_REFLECTION(44,360); +ACE_EXPLOSION_REFLECTION(44,370); +ACE_EXPLOSION_REFLECTION(44,380); +ACE_EXPLOSION_REFLECTION(44,390); +ACE_EXPLOSION_REFLECTION(44,400); +ACE_EXPLOSION_REFLECTION(44,410); +ACE_EXPLOSION_REFLECTION(44,420); +ACE_EXPLOSION_REFLECTION(44,430); +ACE_EXPLOSION_REFLECTION(44,440); +ACE_EXPLOSION_REFLECTION(44,450); +ACE_EXPLOSION_REFLECTION(44,460); +ACE_EXPLOSION_REFLECTION(44,470); +ACE_EXPLOSION_REFLECTION(44,480); +ACE_EXPLOSION_REFLECTION(44,490); +ACE_EXPLOSION_REFLECTION(44,500); +ACE_EXPLOSION_REFLECTION(46,10); +ACE_EXPLOSION_REFLECTION(46,20); +ACE_EXPLOSION_REFLECTION(46,30); +ACE_EXPLOSION_REFLECTION(46,40); +ACE_EXPLOSION_REFLECTION(46,50); +ACE_EXPLOSION_REFLECTION(46,60); +ACE_EXPLOSION_REFLECTION(46,70); +ACE_EXPLOSION_REFLECTION(46,80); +ACE_EXPLOSION_REFLECTION(46,90); +ACE_EXPLOSION_REFLECTION(46,100); +ACE_EXPLOSION_REFLECTION(46,110); +ACE_EXPLOSION_REFLECTION(46,120); +ACE_EXPLOSION_REFLECTION(46,130); +ACE_EXPLOSION_REFLECTION(46,140); +ACE_EXPLOSION_REFLECTION(46,150); +ACE_EXPLOSION_REFLECTION(46,160); +ACE_EXPLOSION_REFLECTION(46,170); +ACE_EXPLOSION_REFLECTION(46,180); +ACE_EXPLOSION_REFLECTION(46,190); +ACE_EXPLOSION_REFLECTION(46,200); +ACE_EXPLOSION_REFLECTION(46,210); +ACE_EXPLOSION_REFLECTION(46,220); +ACE_EXPLOSION_REFLECTION(46,230); +ACE_EXPLOSION_REFLECTION(46,240); +ACE_EXPLOSION_REFLECTION(46,250); +ACE_EXPLOSION_REFLECTION(46,260); +ACE_EXPLOSION_REFLECTION(46,270); +ACE_EXPLOSION_REFLECTION(46,280); +ACE_EXPLOSION_REFLECTION(46,290); +ACE_EXPLOSION_REFLECTION(46,300); +ACE_EXPLOSION_REFLECTION(46,310); +ACE_EXPLOSION_REFLECTION(46,320); +ACE_EXPLOSION_REFLECTION(46,330); +ACE_EXPLOSION_REFLECTION(46,340); +ACE_EXPLOSION_REFLECTION(46,350); +ACE_EXPLOSION_REFLECTION(46,360); +ACE_EXPLOSION_REFLECTION(46,370); +ACE_EXPLOSION_REFLECTION(46,380); +ACE_EXPLOSION_REFLECTION(46,390); +ACE_EXPLOSION_REFLECTION(46,400); +ACE_EXPLOSION_REFLECTION(46,410); +ACE_EXPLOSION_REFLECTION(46,420); +ACE_EXPLOSION_REFLECTION(46,430); +ACE_EXPLOSION_REFLECTION(46,440); +ACE_EXPLOSION_REFLECTION(46,450); +ACE_EXPLOSION_REFLECTION(46,460); +ACE_EXPLOSION_REFLECTION(46,470); +ACE_EXPLOSION_REFLECTION(46,480); +ACE_EXPLOSION_REFLECTION(46,490); +ACE_EXPLOSION_REFLECTION(46,500); +ACE_EXPLOSION_REFLECTION(48,10); +ACE_EXPLOSION_REFLECTION(48,20); +ACE_EXPLOSION_REFLECTION(48,30); +ACE_EXPLOSION_REFLECTION(48,40); +ACE_EXPLOSION_REFLECTION(48,50); +ACE_EXPLOSION_REFLECTION(48,60); +ACE_EXPLOSION_REFLECTION(48,70); +ACE_EXPLOSION_REFLECTION(48,80); +ACE_EXPLOSION_REFLECTION(48,90); +ACE_EXPLOSION_REFLECTION(48,100); +ACE_EXPLOSION_REFLECTION(48,110); +ACE_EXPLOSION_REFLECTION(48,120); +ACE_EXPLOSION_REFLECTION(48,130); +ACE_EXPLOSION_REFLECTION(48,140); +ACE_EXPLOSION_REFLECTION(48,150); +ACE_EXPLOSION_REFLECTION(48,160); +ACE_EXPLOSION_REFLECTION(48,170); +ACE_EXPLOSION_REFLECTION(48,180); +ACE_EXPLOSION_REFLECTION(48,190); +ACE_EXPLOSION_REFLECTION(48,200); +ACE_EXPLOSION_REFLECTION(48,210); +ACE_EXPLOSION_REFLECTION(48,220); +ACE_EXPLOSION_REFLECTION(48,230); +ACE_EXPLOSION_REFLECTION(48,240); +ACE_EXPLOSION_REFLECTION(48,250); +ACE_EXPLOSION_REFLECTION(48,260); +ACE_EXPLOSION_REFLECTION(48,270); +ACE_EXPLOSION_REFLECTION(48,280); +ACE_EXPLOSION_REFLECTION(48,290); +ACE_EXPLOSION_REFLECTION(48,300); +ACE_EXPLOSION_REFLECTION(48,310); +ACE_EXPLOSION_REFLECTION(48,320); +ACE_EXPLOSION_REFLECTION(48,330); +ACE_EXPLOSION_REFLECTION(48,340); +ACE_EXPLOSION_REFLECTION(48,350); +ACE_EXPLOSION_REFLECTION(48,360); +ACE_EXPLOSION_REFLECTION(48,370); +ACE_EXPLOSION_REFLECTION(48,380); +ACE_EXPLOSION_REFLECTION(48,390); +ACE_EXPLOSION_REFLECTION(48,400); +ACE_EXPLOSION_REFLECTION(48,410); +ACE_EXPLOSION_REFLECTION(48,420); +ACE_EXPLOSION_REFLECTION(48,430); +ACE_EXPLOSION_REFLECTION(48,440); +ACE_EXPLOSION_REFLECTION(48,450); +ACE_EXPLOSION_REFLECTION(48,460); +ACE_EXPLOSION_REFLECTION(48,470); +ACE_EXPLOSION_REFLECTION(48,480); +ACE_EXPLOSION_REFLECTION(48,490); +ACE_EXPLOSION_REFLECTION(48,500); +ACE_EXPLOSION_REFLECTION(50,10); +ACE_EXPLOSION_REFLECTION(50,20); +ACE_EXPLOSION_REFLECTION(50,30); +ACE_EXPLOSION_REFLECTION(50,40); +ACE_EXPLOSION_REFLECTION(50,50); +ACE_EXPLOSION_REFLECTION(50,60); +ACE_EXPLOSION_REFLECTION(50,70); +ACE_EXPLOSION_REFLECTION(50,80); +ACE_EXPLOSION_REFLECTION(50,90); +ACE_EXPLOSION_REFLECTION(50,100); +ACE_EXPLOSION_REFLECTION(50,110); +ACE_EXPLOSION_REFLECTION(50,120); +ACE_EXPLOSION_REFLECTION(50,130); +ACE_EXPLOSION_REFLECTION(50,140); +ACE_EXPLOSION_REFLECTION(50,150); +ACE_EXPLOSION_REFLECTION(50,160); +ACE_EXPLOSION_REFLECTION(50,170); +ACE_EXPLOSION_REFLECTION(50,180); +ACE_EXPLOSION_REFLECTION(50,190); +ACE_EXPLOSION_REFLECTION(50,200); +ACE_EXPLOSION_REFLECTION(50,210); +ACE_EXPLOSION_REFLECTION(50,220); +ACE_EXPLOSION_REFLECTION(50,230); +ACE_EXPLOSION_REFLECTION(50,240); +ACE_EXPLOSION_REFLECTION(50,250); +ACE_EXPLOSION_REFLECTION(50,260); +ACE_EXPLOSION_REFLECTION(50,270); +ACE_EXPLOSION_REFLECTION(50,280); +ACE_EXPLOSION_REFLECTION(50,290); +ACE_EXPLOSION_REFLECTION(50,300); +ACE_EXPLOSION_REFLECTION(50,310); +ACE_EXPLOSION_REFLECTION(50,320); +ACE_EXPLOSION_REFLECTION(50,330); +ACE_EXPLOSION_REFLECTION(50,340); +ACE_EXPLOSION_REFLECTION(50,350); +ACE_EXPLOSION_REFLECTION(50,360); +ACE_EXPLOSION_REFLECTION(50,370); +ACE_EXPLOSION_REFLECTION(50,380); +ACE_EXPLOSION_REFLECTION(50,390); +ACE_EXPLOSION_REFLECTION(50,400); +ACE_EXPLOSION_REFLECTION(50,410); +ACE_EXPLOSION_REFLECTION(50,420); +ACE_EXPLOSION_REFLECTION(50,430); +ACE_EXPLOSION_REFLECTION(50,440); +ACE_EXPLOSION_REFLECTION(50,450); +ACE_EXPLOSION_REFLECTION(50,460); +ACE_EXPLOSION_REFLECTION(50,470); +ACE_EXPLOSION_REFLECTION(50,480); +ACE_EXPLOSION_REFLECTION(50,490); +ACE_EXPLOSION_REFLECTION(50,500); +ACE_EXPLOSION_REFLECTION(52,10); +ACE_EXPLOSION_REFLECTION(52,20); +ACE_EXPLOSION_REFLECTION(52,30); +ACE_EXPLOSION_REFLECTION(52,40); +ACE_EXPLOSION_REFLECTION(52,50); +ACE_EXPLOSION_REFLECTION(52,60); +ACE_EXPLOSION_REFLECTION(52,70); +ACE_EXPLOSION_REFLECTION(52,80); +ACE_EXPLOSION_REFLECTION(52,90); +ACE_EXPLOSION_REFLECTION(52,100); +ACE_EXPLOSION_REFLECTION(52,110); +ACE_EXPLOSION_REFLECTION(52,120); +ACE_EXPLOSION_REFLECTION(52,130); +ACE_EXPLOSION_REFLECTION(52,140); +ACE_EXPLOSION_REFLECTION(52,150); +ACE_EXPLOSION_REFLECTION(52,160); +ACE_EXPLOSION_REFLECTION(52,170); +ACE_EXPLOSION_REFLECTION(52,180); +ACE_EXPLOSION_REFLECTION(52,190); +ACE_EXPLOSION_REFLECTION(52,200); +ACE_EXPLOSION_REFLECTION(52,210); +ACE_EXPLOSION_REFLECTION(52,220); +ACE_EXPLOSION_REFLECTION(52,230); +ACE_EXPLOSION_REFLECTION(52,240); +ACE_EXPLOSION_REFLECTION(52,250); +ACE_EXPLOSION_REFLECTION(52,260); +ACE_EXPLOSION_REFLECTION(52,270); +ACE_EXPLOSION_REFLECTION(52,280); +ACE_EXPLOSION_REFLECTION(52,290); +ACE_EXPLOSION_REFLECTION(52,300); +ACE_EXPLOSION_REFLECTION(52,310); +ACE_EXPLOSION_REFLECTION(52,320); +ACE_EXPLOSION_REFLECTION(52,330); +ACE_EXPLOSION_REFLECTION(52,340); +ACE_EXPLOSION_REFLECTION(52,350); +ACE_EXPLOSION_REFLECTION(52,360); +ACE_EXPLOSION_REFLECTION(52,370); +ACE_EXPLOSION_REFLECTION(52,380); +ACE_EXPLOSION_REFLECTION(52,390); +ACE_EXPLOSION_REFLECTION(52,400); +ACE_EXPLOSION_REFLECTION(52,410); +ACE_EXPLOSION_REFLECTION(52,420); +ACE_EXPLOSION_REFLECTION(52,430); +ACE_EXPLOSION_REFLECTION(52,440); +ACE_EXPLOSION_REFLECTION(52,450); +ACE_EXPLOSION_REFLECTION(52,460); +ACE_EXPLOSION_REFLECTION(52,470); +ACE_EXPLOSION_REFLECTION(52,480); +ACE_EXPLOSION_REFLECTION(52,490); +ACE_EXPLOSION_REFLECTION(52,500); +ACE_EXPLOSION_REFLECTION(54,10); +ACE_EXPLOSION_REFLECTION(54,20); +ACE_EXPLOSION_REFLECTION(54,30); +ACE_EXPLOSION_REFLECTION(54,40); +ACE_EXPLOSION_REFLECTION(54,50); +ACE_EXPLOSION_REFLECTION(54,60); +ACE_EXPLOSION_REFLECTION(54,70); +ACE_EXPLOSION_REFLECTION(54,80); +ACE_EXPLOSION_REFLECTION(54,90); +ACE_EXPLOSION_REFLECTION(54,100); +ACE_EXPLOSION_REFLECTION(54,110); +ACE_EXPLOSION_REFLECTION(54,120); +ACE_EXPLOSION_REFLECTION(54,130); +ACE_EXPLOSION_REFLECTION(54,140); +ACE_EXPLOSION_REFLECTION(54,150); +ACE_EXPLOSION_REFLECTION(54,160); +ACE_EXPLOSION_REFLECTION(54,170); +ACE_EXPLOSION_REFLECTION(54,180); +ACE_EXPLOSION_REFLECTION(54,190); +ACE_EXPLOSION_REFLECTION(54,200); +ACE_EXPLOSION_REFLECTION(54,210); +ACE_EXPLOSION_REFLECTION(54,220); +ACE_EXPLOSION_REFLECTION(54,230); +ACE_EXPLOSION_REFLECTION(54,240); +ACE_EXPLOSION_REFLECTION(54,250); +ACE_EXPLOSION_REFLECTION(54,260); +ACE_EXPLOSION_REFLECTION(54,270); +ACE_EXPLOSION_REFLECTION(54,280); +ACE_EXPLOSION_REFLECTION(54,290); +ACE_EXPLOSION_REFLECTION(54,300); +ACE_EXPLOSION_REFLECTION(54,310); +ACE_EXPLOSION_REFLECTION(54,320); +ACE_EXPLOSION_REFLECTION(54,330); +ACE_EXPLOSION_REFLECTION(54,340); +ACE_EXPLOSION_REFLECTION(54,350); +ACE_EXPLOSION_REFLECTION(54,360); +ACE_EXPLOSION_REFLECTION(54,370); +ACE_EXPLOSION_REFLECTION(54,380); +ACE_EXPLOSION_REFLECTION(54,390); +ACE_EXPLOSION_REFLECTION(54,400); +ACE_EXPLOSION_REFLECTION(54,410); +ACE_EXPLOSION_REFLECTION(54,420); +ACE_EXPLOSION_REFLECTION(54,430); +ACE_EXPLOSION_REFLECTION(54,440); +ACE_EXPLOSION_REFLECTION(54,450); +ACE_EXPLOSION_REFLECTION(54,460); +ACE_EXPLOSION_REFLECTION(54,470); +ACE_EXPLOSION_REFLECTION(54,480); +ACE_EXPLOSION_REFLECTION(54,490); +ACE_EXPLOSION_REFLECTION(54,500); +ACE_EXPLOSION_REFLECTION(56,10); +ACE_EXPLOSION_REFLECTION(56,20); +ACE_EXPLOSION_REFLECTION(56,30); +ACE_EXPLOSION_REFLECTION(56,40); +ACE_EXPLOSION_REFLECTION(56,50); +ACE_EXPLOSION_REFLECTION(56,60); +ACE_EXPLOSION_REFLECTION(56,70); +ACE_EXPLOSION_REFLECTION(56,80); +ACE_EXPLOSION_REFLECTION(56,90); +ACE_EXPLOSION_REFLECTION(56,100); +ACE_EXPLOSION_REFLECTION(56,110); +ACE_EXPLOSION_REFLECTION(56,120); +ACE_EXPLOSION_REFLECTION(56,130); +ACE_EXPLOSION_REFLECTION(56,140); +ACE_EXPLOSION_REFLECTION(56,150); +ACE_EXPLOSION_REFLECTION(56,160); +ACE_EXPLOSION_REFLECTION(56,170); +ACE_EXPLOSION_REFLECTION(56,180); +ACE_EXPLOSION_REFLECTION(56,190); +ACE_EXPLOSION_REFLECTION(56,200); +ACE_EXPLOSION_REFLECTION(56,210); +ACE_EXPLOSION_REFLECTION(56,220); +ACE_EXPLOSION_REFLECTION(56,230); +ACE_EXPLOSION_REFLECTION(56,240); +ACE_EXPLOSION_REFLECTION(56,250); +ACE_EXPLOSION_REFLECTION(56,260); +ACE_EXPLOSION_REFLECTION(56,270); +ACE_EXPLOSION_REFLECTION(56,280); +ACE_EXPLOSION_REFLECTION(56,290); +ACE_EXPLOSION_REFLECTION(56,300); +ACE_EXPLOSION_REFLECTION(56,310); +ACE_EXPLOSION_REFLECTION(56,320); +ACE_EXPLOSION_REFLECTION(56,330); +ACE_EXPLOSION_REFLECTION(56,340); +ACE_EXPLOSION_REFLECTION(56,350); +ACE_EXPLOSION_REFLECTION(56,360); +ACE_EXPLOSION_REFLECTION(56,370); +ACE_EXPLOSION_REFLECTION(56,380); +ACE_EXPLOSION_REFLECTION(56,390); +ACE_EXPLOSION_REFLECTION(56,400); +ACE_EXPLOSION_REFLECTION(56,410); +ACE_EXPLOSION_REFLECTION(56,420); +ACE_EXPLOSION_REFLECTION(56,430); +ACE_EXPLOSION_REFLECTION(56,440); +ACE_EXPLOSION_REFLECTION(56,450); +ACE_EXPLOSION_REFLECTION(56,460); +ACE_EXPLOSION_REFLECTION(56,470); +ACE_EXPLOSION_REFLECTION(56,480); +ACE_EXPLOSION_REFLECTION(56,490); +ACE_EXPLOSION_REFLECTION(56,500); +ACE_EXPLOSION_REFLECTION(58,10); +ACE_EXPLOSION_REFLECTION(58,20); +ACE_EXPLOSION_REFLECTION(58,30); +ACE_EXPLOSION_REFLECTION(58,40); +ACE_EXPLOSION_REFLECTION(58,50); +ACE_EXPLOSION_REFLECTION(58,60); +ACE_EXPLOSION_REFLECTION(58,70); +ACE_EXPLOSION_REFLECTION(58,80); +ACE_EXPLOSION_REFLECTION(58,90); +ACE_EXPLOSION_REFLECTION(58,100); +ACE_EXPLOSION_REFLECTION(58,110); +ACE_EXPLOSION_REFLECTION(58,120); +ACE_EXPLOSION_REFLECTION(58,130); +ACE_EXPLOSION_REFLECTION(58,140); +ACE_EXPLOSION_REFLECTION(58,150); +ACE_EXPLOSION_REFLECTION(58,160); +ACE_EXPLOSION_REFLECTION(58,170); +ACE_EXPLOSION_REFLECTION(58,180); +ACE_EXPLOSION_REFLECTION(58,190); +ACE_EXPLOSION_REFLECTION(58,200); +ACE_EXPLOSION_REFLECTION(58,210); +ACE_EXPLOSION_REFLECTION(58,220); +ACE_EXPLOSION_REFLECTION(58,230); +ACE_EXPLOSION_REFLECTION(58,240); +ACE_EXPLOSION_REFLECTION(58,250); +ACE_EXPLOSION_REFLECTION(58,260); +ACE_EXPLOSION_REFLECTION(58,270); +ACE_EXPLOSION_REFLECTION(58,280); +ACE_EXPLOSION_REFLECTION(58,290); +ACE_EXPLOSION_REFLECTION(58,300); +ACE_EXPLOSION_REFLECTION(58,310); +ACE_EXPLOSION_REFLECTION(58,320); +ACE_EXPLOSION_REFLECTION(58,330); +ACE_EXPLOSION_REFLECTION(58,340); +ACE_EXPLOSION_REFLECTION(58,350); +ACE_EXPLOSION_REFLECTION(58,360); +ACE_EXPLOSION_REFLECTION(58,370); +ACE_EXPLOSION_REFLECTION(58,380); +ACE_EXPLOSION_REFLECTION(58,390); +ACE_EXPLOSION_REFLECTION(58,400); +ACE_EXPLOSION_REFLECTION(58,410); +ACE_EXPLOSION_REFLECTION(58,420); +ACE_EXPLOSION_REFLECTION(58,430); +ACE_EXPLOSION_REFLECTION(58,440); +ACE_EXPLOSION_REFLECTION(58,450); +ACE_EXPLOSION_REFLECTION(58,460); +ACE_EXPLOSION_REFLECTION(58,470); +ACE_EXPLOSION_REFLECTION(58,480); +ACE_EXPLOSION_REFLECTION(58,490); +ACE_EXPLOSION_REFLECTION(58,500); +ACE_EXPLOSION_REFLECTION(60,10); +ACE_EXPLOSION_REFLECTION(60,20); +ACE_EXPLOSION_REFLECTION(60,30); +ACE_EXPLOSION_REFLECTION(60,40); +ACE_EXPLOSION_REFLECTION(60,50); +ACE_EXPLOSION_REFLECTION(60,60); +ACE_EXPLOSION_REFLECTION(60,70); +ACE_EXPLOSION_REFLECTION(60,80); +ACE_EXPLOSION_REFLECTION(60,90); +ACE_EXPLOSION_REFLECTION(60,100); +ACE_EXPLOSION_REFLECTION(60,110); +ACE_EXPLOSION_REFLECTION(60,120); +ACE_EXPLOSION_REFLECTION(60,130); +ACE_EXPLOSION_REFLECTION(60,140); +ACE_EXPLOSION_REFLECTION(60,150); +ACE_EXPLOSION_REFLECTION(60,160); +ACE_EXPLOSION_REFLECTION(60,170); +ACE_EXPLOSION_REFLECTION(60,180); +ACE_EXPLOSION_REFLECTION(60,190); +ACE_EXPLOSION_REFLECTION(60,200); +ACE_EXPLOSION_REFLECTION(60,210); +ACE_EXPLOSION_REFLECTION(60,220); +ACE_EXPLOSION_REFLECTION(60,230); +ACE_EXPLOSION_REFLECTION(60,240); +ACE_EXPLOSION_REFLECTION(60,250); +ACE_EXPLOSION_REFLECTION(60,260); +ACE_EXPLOSION_REFLECTION(60,270); +ACE_EXPLOSION_REFLECTION(60,280); +ACE_EXPLOSION_REFLECTION(60,290); +ACE_EXPLOSION_REFLECTION(60,300); +ACE_EXPLOSION_REFLECTION(60,310); +ACE_EXPLOSION_REFLECTION(60,320); +ACE_EXPLOSION_REFLECTION(60,330); +ACE_EXPLOSION_REFLECTION(60,340); +ACE_EXPLOSION_REFLECTION(60,350); +ACE_EXPLOSION_REFLECTION(60,360); +ACE_EXPLOSION_REFLECTION(60,370); +ACE_EXPLOSION_REFLECTION(60,380); +ACE_EXPLOSION_REFLECTION(60,390); +ACE_EXPLOSION_REFLECTION(60,400); +ACE_EXPLOSION_REFLECTION(60,410); +ACE_EXPLOSION_REFLECTION(60,420); +ACE_EXPLOSION_REFLECTION(60,430); +ACE_EXPLOSION_REFLECTION(60,440); +ACE_EXPLOSION_REFLECTION(60,450); +ACE_EXPLOSION_REFLECTION(60,460); +ACE_EXPLOSION_REFLECTION(60,470); +ACE_EXPLOSION_REFLECTION(60,480); +ACE_EXPLOSION_REFLECTION(60,490); +ACE_EXPLOSION_REFLECTION(60,500); +ACE_EXPLOSION_REFLECTION(62,10); +ACE_EXPLOSION_REFLECTION(62,20); +ACE_EXPLOSION_REFLECTION(62,30); +ACE_EXPLOSION_REFLECTION(62,40); +ACE_EXPLOSION_REFLECTION(62,50); +ACE_EXPLOSION_REFLECTION(62,60); +ACE_EXPLOSION_REFLECTION(62,70); +ACE_EXPLOSION_REFLECTION(62,80); +ACE_EXPLOSION_REFLECTION(62,90); +ACE_EXPLOSION_REFLECTION(62,100); +ACE_EXPLOSION_REFLECTION(62,110); +ACE_EXPLOSION_REFLECTION(62,120); +ACE_EXPLOSION_REFLECTION(62,130); +ACE_EXPLOSION_REFLECTION(62,140); +ACE_EXPLOSION_REFLECTION(62,150); +ACE_EXPLOSION_REFLECTION(62,160); +ACE_EXPLOSION_REFLECTION(62,170); +ACE_EXPLOSION_REFLECTION(62,180); +ACE_EXPLOSION_REFLECTION(62,190); +ACE_EXPLOSION_REFLECTION(62,200); +ACE_EXPLOSION_REFLECTION(62,210); +ACE_EXPLOSION_REFLECTION(62,220); +ACE_EXPLOSION_REFLECTION(62,230); +ACE_EXPLOSION_REFLECTION(62,240); +ACE_EXPLOSION_REFLECTION(62,250); +ACE_EXPLOSION_REFLECTION(62,260); +ACE_EXPLOSION_REFLECTION(62,270); +ACE_EXPLOSION_REFLECTION(62,280); +ACE_EXPLOSION_REFLECTION(62,290); +ACE_EXPLOSION_REFLECTION(62,300); +ACE_EXPLOSION_REFLECTION(62,310); +ACE_EXPLOSION_REFLECTION(62,320); +ACE_EXPLOSION_REFLECTION(62,330); +ACE_EXPLOSION_REFLECTION(62,340); +ACE_EXPLOSION_REFLECTION(62,350); +ACE_EXPLOSION_REFLECTION(62,360); +ACE_EXPLOSION_REFLECTION(62,370); +ACE_EXPLOSION_REFLECTION(62,380); +ACE_EXPLOSION_REFLECTION(62,390); +ACE_EXPLOSION_REFLECTION(62,400); +ACE_EXPLOSION_REFLECTION(62,410); +ACE_EXPLOSION_REFLECTION(62,420); +ACE_EXPLOSION_REFLECTION(62,430); +ACE_EXPLOSION_REFLECTION(62,440); +ACE_EXPLOSION_REFLECTION(62,450); +ACE_EXPLOSION_REFLECTION(62,460); +ACE_EXPLOSION_REFLECTION(62,470); +ACE_EXPLOSION_REFLECTION(62,480); +ACE_EXPLOSION_REFLECTION(62,490); +ACE_EXPLOSION_REFLECTION(62,500); +ACE_EXPLOSION_REFLECTION(64,10); +ACE_EXPLOSION_REFLECTION(64,20); +ACE_EXPLOSION_REFLECTION(64,30); +ACE_EXPLOSION_REFLECTION(64,40); +ACE_EXPLOSION_REFLECTION(64,50); +ACE_EXPLOSION_REFLECTION(64,60); +ACE_EXPLOSION_REFLECTION(64,70); +ACE_EXPLOSION_REFLECTION(64,80); +ACE_EXPLOSION_REFLECTION(64,90); +ACE_EXPLOSION_REFLECTION(64,100); +ACE_EXPLOSION_REFLECTION(64,110); +ACE_EXPLOSION_REFLECTION(64,120); +ACE_EXPLOSION_REFLECTION(64,130); +ACE_EXPLOSION_REFLECTION(64,140); +ACE_EXPLOSION_REFLECTION(64,150); +ACE_EXPLOSION_REFLECTION(64,160); +ACE_EXPLOSION_REFLECTION(64,170); +ACE_EXPLOSION_REFLECTION(64,180); +ACE_EXPLOSION_REFLECTION(64,190); +ACE_EXPLOSION_REFLECTION(64,200); +ACE_EXPLOSION_REFLECTION(64,210); +ACE_EXPLOSION_REFLECTION(64,220); +ACE_EXPLOSION_REFLECTION(64,230); +ACE_EXPLOSION_REFLECTION(64,240); +ACE_EXPLOSION_REFLECTION(64,250); +ACE_EXPLOSION_REFLECTION(64,260); +ACE_EXPLOSION_REFLECTION(64,270); +ACE_EXPLOSION_REFLECTION(64,280); +ACE_EXPLOSION_REFLECTION(64,290); +ACE_EXPLOSION_REFLECTION(64,300); +ACE_EXPLOSION_REFLECTION(64,310); +ACE_EXPLOSION_REFLECTION(64,320); +ACE_EXPLOSION_REFLECTION(64,330); +ACE_EXPLOSION_REFLECTION(64,340); +ACE_EXPLOSION_REFLECTION(64,350); +ACE_EXPLOSION_REFLECTION(64,360); +ACE_EXPLOSION_REFLECTION(64,370); +ACE_EXPLOSION_REFLECTION(64,380); +ACE_EXPLOSION_REFLECTION(64,390); +ACE_EXPLOSION_REFLECTION(64,400); +ACE_EXPLOSION_REFLECTION(64,410); +ACE_EXPLOSION_REFLECTION(64,420); +ACE_EXPLOSION_REFLECTION(64,430); +ACE_EXPLOSION_REFLECTION(64,440); +ACE_EXPLOSION_REFLECTION(64,450); +ACE_EXPLOSION_REFLECTION(64,460); +ACE_EXPLOSION_REFLECTION(64,470); +ACE_EXPLOSION_REFLECTION(64,480); +ACE_EXPLOSION_REFLECTION(64,490); +ACE_EXPLOSION_REFLECTION(64,500); +ACE_EXPLOSION_REFLECTION(66,10); +ACE_EXPLOSION_REFLECTION(66,20); +ACE_EXPLOSION_REFLECTION(66,30); +ACE_EXPLOSION_REFLECTION(66,40); +ACE_EXPLOSION_REFLECTION(66,50); +ACE_EXPLOSION_REFLECTION(66,60); +ACE_EXPLOSION_REFLECTION(66,70); +ACE_EXPLOSION_REFLECTION(66,80); +ACE_EXPLOSION_REFLECTION(66,90); +ACE_EXPLOSION_REFLECTION(66,100); +ACE_EXPLOSION_REFLECTION(66,110); +ACE_EXPLOSION_REFLECTION(66,120); +ACE_EXPLOSION_REFLECTION(66,130); +ACE_EXPLOSION_REFLECTION(66,140); +ACE_EXPLOSION_REFLECTION(66,150); +ACE_EXPLOSION_REFLECTION(66,160); +ACE_EXPLOSION_REFLECTION(66,170); +ACE_EXPLOSION_REFLECTION(66,180); +ACE_EXPLOSION_REFLECTION(66,190); +ACE_EXPLOSION_REFLECTION(66,200); +ACE_EXPLOSION_REFLECTION(66,210); +ACE_EXPLOSION_REFLECTION(66,220); +ACE_EXPLOSION_REFLECTION(66,230); +ACE_EXPLOSION_REFLECTION(66,240); +ACE_EXPLOSION_REFLECTION(66,250); +ACE_EXPLOSION_REFLECTION(66,260); +ACE_EXPLOSION_REFLECTION(66,270); +ACE_EXPLOSION_REFLECTION(66,280); +ACE_EXPLOSION_REFLECTION(66,290); +ACE_EXPLOSION_REFLECTION(66,300); +ACE_EXPLOSION_REFLECTION(66,310); +ACE_EXPLOSION_REFLECTION(66,320); +ACE_EXPLOSION_REFLECTION(66,330); +ACE_EXPLOSION_REFLECTION(66,340); +ACE_EXPLOSION_REFLECTION(66,350); +ACE_EXPLOSION_REFLECTION(66,360); +ACE_EXPLOSION_REFLECTION(66,370); +ACE_EXPLOSION_REFLECTION(66,380); +ACE_EXPLOSION_REFLECTION(66,390); +ACE_EXPLOSION_REFLECTION(66,400); +ACE_EXPLOSION_REFLECTION(66,410); +ACE_EXPLOSION_REFLECTION(66,420); +ACE_EXPLOSION_REFLECTION(66,430); +ACE_EXPLOSION_REFLECTION(66,440); +ACE_EXPLOSION_REFLECTION(66,450); +ACE_EXPLOSION_REFLECTION(66,460); +ACE_EXPLOSION_REFLECTION(66,470); +ACE_EXPLOSION_REFLECTION(66,480); +ACE_EXPLOSION_REFLECTION(66,490); +ACE_EXPLOSION_REFLECTION(66,500); +ACE_EXPLOSION_REFLECTION(68,10); +ACE_EXPLOSION_REFLECTION(68,20); +ACE_EXPLOSION_REFLECTION(68,30); +ACE_EXPLOSION_REFLECTION(68,40); +ACE_EXPLOSION_REFLECTION(68,50); +ACE_EXPLOSION_REFLECTION(68,60); +ACE_EXPLOSION_REFLECTION(68,70); +ACE_EXPLOSION_REFLECTION(68,80); +ACE_EXPLOSION_REFLECTION(68,90); +ACE_EXPLOSION_REFLECTION(68,100); +ACE_EXPLOSION_REFLECTION(68,110); +ACE_EXPLOSION_REFLECTION(68,120); +ACE_EXPLOSION_REFLECTION(68,130); +ACE_EXPLOSION_REFLECTION(68,140); +ACE_EXPLOSION_REFLECTION(68,150); +ACE_EXPLOSION_REFLECTION(68,160); +ACE_EXPLOSION_REFLECTION(68,170); +ACE_EXPLOSION_REFLECTION(68,180); +ACE_EXPLOSION_REFLECTION(68,190); +ACE_EXPLOSION_REFLECTION(68,200); +ACE_EXPLOSION_REFLECTION(68,210); +ACE_EXPLOSION_REFLECTION(68,220); +ACE_EXPLOSION_REFLECTION(68,230); +ACE_EXPLOSION_REFLECTION(68,240); +ACE_EXPLOSION_REFLECTION(68,250); +ACE_EXPLOSION_REFLECTION(68,260); +ACE_EXPLOSION_REFLECTION(68,270); +ACE_EXPLOSION_REFLECTION(68,280); +ACE_EXPLOSION_REFLECTION(68,290); +ACE_EXPLOSION_REFLECTION(68,300); +ACE_EXPLOSION_REFLECTION(68,310); +ACE_EXPLOSION_REFLECTION(68,320); +ACE_EXPLOSION_REFLECTION(68,330); +ACE_EXPLOSION_REFLECTION(68,340); +ACE_EXPLOSION_REFLECTION(68,350); +ACE_EXPLOSION_REFLECTION(68,360); +ACE_EXPLOSION_REFLECTION(68,370); +ACE_EXPLOSION_REFLECTION(68,380); +ACE_EXPLOSION_REFLECTION(68,390); +ACE_EXPLOSION_REFLECTION(68,400); +ACE_EXPLOSION_REFLECTION(68,410); +ACE_EXPLOSION_REFLECTION(68,420); +ACE_EXPLOSION_REFLECTION(68,430); +ACE_EXPLOSION_REFLECTION(68,440); +ACE_EXPLOSION_REFLECTION(68,450); +ACE_EXPLOSION_REFLECTION(68,460); +ACE_EXPLOSION_REFLECTION(68,470); +ACE_EXPLOSION_REFLECTION(68,480); +ACE_EXPLOSION_REFLECTION(68,490); +ACE_EXPLOSION_REFLECTION(68,500); +ACE_EXPLOSION_REFLECTION(70,10); +ACE_EXPLOSION_REFLECTION(70,20); +ACE_EXPLOSION_REFLECTION(70,30); +ACE_EXPLOSION_REFLECTION(70,40); +ACE_EXPLOSION_REFLECTION(70,50); +ACE_EXPLOSION_REFLECTION(70,60); +ACE_EXPLOSION_REFLECTION(70,70); +ACE_EXPLOSION_REFLECTION(70,80); +ACE_EXPLOSION_REFLECTION(70,90); +ACE_EXPLOSION_REFLECTION(70,100); +ACE_EXPLOSION_REFLECTION(70,110); +ACE_EXPLOSION_REFLECTION(70,120); +ACE_EXPLOSION_REFLECTION(70,130); +ACE_EXPLOSION_REFLECTION(70,140); +ACE_EXPLOSION_REFLECTION(70,150); +ACE_EXPLOSION_REFLECTION(70,160); +ACE_EXPLOSION_REFLECTION(70,170); +ACE_EXPLOSION_REFLECTION(70,180); +ACE_EXPLOSION_REFLECTION(70,190); +ACE_EXPLOSION_REFLECTION(70,200); +ACE_EXPLOSION_REFLECTION(70,210); +ACE_EXPLOSION_REFLECTION(70,220); +ACE_EXPLOSION_REFLECTION(70,230); +ACE_EXPLOSION_REFLECTION(70,240); +ACE_EXPLOSION_REFLECTION(70,250); +ACE_EXPLOSION_REFLECTION(70,260); +ACE_EXPLOSION_REFLECTION(70,270); +ACE_EXPLOSION_REFLECTION(70,280); +ACE_EXPLOSION_REFLECTION(70,290); +ACE_EXPLOSION_REFLECTION(70,300); +ACE_EXPLOSION_REFLECTION(70,310); +ACE_EXPLOSION_REFLECTION(70,320); +ACE_EXPLOSION_REFLECTION(70,330); +ACE_EXPLOSION_REFLECTION(70,340); +ACE_EXPLOSION_REFLECTION(70,350); +ACE_EXPLOSION_REFLECTION(70,360); +ACE_EXPLOSION_REFLECTION(70,370); +ACE_EXPLOSION_REFLECTION(70,380); +ACE_EXPLOSION_REFLECTION(70,390); +ACE_EXPLOSION_REFLECTION(70,400); +ACE_EXPLOSION_REFLECTION(70,410); +ACE_EXPLOSION_REFLECTION(70,420); +ACE_EXPLOSION_REFLECTION(70,430); +ACE_EXPLOSION_REFLECTION(70,440); +ACE_EXPLOSION_REFLECTION(70,450); +ACE_EXPLOSION_REFLECTION(70,460); +ACE_EXPLOSION_REFLECTION(70,470); +ACE_EXPLOSION_REFLECTION(70,480); +ACE_EXPLOSION_REFLECTION(70,490); +ACE_EXPLOSION_REFLECTION(70,500); +ACE_EXPLOSION_REFLECTION(72,10); +ACE_EXPLOSION_REFLECTION(72,20); +ACE_EXPLOSION_REFLECTION(72,30); +ACE_EXPLOSION_REFLECTION(72,40); +ACE_EXPLOSION_REFLECTION(72,50); +ACE_EXPLOSION_REFLECTION(72,60); +ACE_EXPLOSION_REFLECTION(72,70); +ACE_EXPLOSION_REFLECTION(72,80); +ACE_EXPLOSION_REFLECTION(72,90); +ACE_EXPLOSION_REFLECTION(72,100); +ACE_EXPLOSION_REFLECTION(72,110); +ACE_EXPLOSION_REFLECTION(72,120); +ACE_EXPLOSION_REFLECTION(72,130); +ACE_EXPLOSION_REFLECTION(72,140); +ACE_EXPLOSION_REFLECTION(72,150); +ACE_EXPLOSION_REFLECTION(72,160); +ACE_EXPLOSION_REFLECTION(72,170); +ACE_EXPLOSION_REFLECTION(72,180); +ACE_EXPLOSION_REFLECTION(72,190); +ACE_EXPLOSION_REFLECTION(72,200); +ACE_EXPLOSION_REFLECTION(72,210); +ACE_EXPLOSION_REFLECTION(72,220); +ACE_EXPLOSION_REFLECTION(72,230); +ACE_EXPLOSION_REFLECTION(72,240); +ACE_EXPLOSION_REFLECTION(72,250); +ACE_EXPLOSION_REFLECTION(72,260); +ACE_EXPLOSION_REFLECTION(72,270); +ACE_EXPLOSION_REFLECTION(72,280); +ACE_EXPLOSION_REFLECTION(72,290); +ACE_EXPLOSION_REFLECTION(72,300); +ACE_EXPLOSION_REFLECTION(72,310); +ACE_EXPLOSION_REFLECTION(72,320); +ACE_EXPLOSION_REFLECTION(72,330); +ACE_EXPLOSION_REFLECTION(72,340); +ACE_EXPLOSION_REFLECTION(72,350); +ACE_EXPLOSION_REFLECTION(72,360); +ACE_EXPLOSION_REFLECTION(72,370); +ACE_EXPLOSION_REFLECTION(72,380); +ACE_EXPLOSION_REFLECTION(72,390); +ACE_EXPLOSION_REFLECTION(72,400); +ACE_EXPLOSION_REFLECTION(72,410); +ACE_EXPLOSION_REFLECTION(72,420); +ACE_EXPLOSION_REFLECTION(72,430); +ACE_EXPLOSION_REFLECTION(72,440); +ACE_EXPLOSION_REFLECTION(72,450); +ACE_EXPLOSION_REFLECTION(72,460); +ACE_EXPLOSION_REFLECTION(72,470); +ACE_EXPLOSION_REFLECTION(72,480); +ACE_EXPLOSION_REFLECTION(72,490); +ACE_EXPLOSION_REFLECTION(72,500); +ACE_EXPLOSION_REFLECTION(74,10); +ACE_EXPLOSION_REFLECTION(74,20); +ACE_EXPLOSION_REFLECTION(74,30); +ACE_EXPLOSION_REFLECTION(74,40); +ACE_EXPLOSION_REFLECTION(74,50); +ACE_EXPLOSION_REFLECTION(74,60); +ACE_EXPLOSION_REFLECTION(74,70); +ACE_EXPLOSION_REFLECTION(74,80); +ACE_EXPLOSION_REFLECTION(74,90); +ACE_EXPLOSION_REFLECTION(74,100); +ACE_EXPLOSION_REFLECTION(74,110); +ACE_EXPLOSION_REFLECTION(74,120); +ACE_EXPLOSION_REFLECTION(74,130); +ACE_EXPLOSION_REFLECTION(74,140); +ACE_EXPLOSION_REFLECTION(74,150); +ACE_EXPLOSION_REFLECTION(74,160); +ACE_EXPLOSION_REFLECTION(74,170); +ACE_EXPLOSION_REFLECTION(74,180); +ACE_EXPLOSION_REFLECTION(74,190); +ACE_EXPLOSION_REFLECTION(74,200); +ACE_EXPLOSION_REFLECTION(74,210); +ACE_EXPLOSION_REFLECTION(74,220); +ACE_EXPLOSION_REFLECTION(74,230); +ACE_EXPLOSION_REFLECTION(74,240); +ACE_EXPLOSION_REFLECTION(74,250); +ACE_EXPLOSION_REFLECTION(74,260); +ACE_EXPLOSION_REFLECTION(74,270); +ACE_EXPLOSION_REFLECTION(74,280); +ACE_EXPLOSION_REFLECTION(74,290); +ACE_EXPLOSION_REFLECTION(74,300); +ACE_EXPLOSION_REFLECTION(74,310); +ACE_EXPLOSION_REFLECTION(74,320); +ACE_EXPLOSION_REFLECTION(74,330); +ACE_EXPLOSION_REFLECTION(74,340); +ACE_EXPLOSION_REFLECTION(74,350); +ACE_EXPLOSION_REFLECTION(74,360); +ACE_EXPLOSION_REFLECTION(74,370); +ACE_EXPLOSION_REFLECTION(74,380); +ACE_EXPLOSION_REFLECTION(74,390); +ACE_EXPLOSION_REFLECTION(74,400); +ACE_EXPLOSION_REFLECTION(74,410); +ACE_EXPLOSION_REFLECTION(74,420); +ACE_EXPLOSION_REFLECTION(74,430); +ACE_EXPLOSION_REFLECTION(74,440); +ACE_EXPLOSION_REFLECTION(74,450); +ACE_EXPLOSION_REFLECTION(74,460); +ACE_EXPLOSION_REFLECTION(74,470); +ACE_EXPLOSION_REFLECTION(74,480); +ACE_EXPLOSION_REFLECTION(74,490); +ACE_EXPLOSION_REFLECTION(74,500); +ACE_EXPLOSION_REFLECTION(76,10); +ACE_EXPLOSION_REFLECTION(76,20); +ACE_EXPLOSION_REFLECTION(76,30); +ACE_EXPLOSION_REFLECTION(76,40); +ACE_EXPLOSION_REFLECTION(76,50); +ACE_EXPLOSION_REFLECTION(76,60); +ACE_EXPLOSION_REFLECTION(76,70); +ACE_EXPLOSION_REFLECTION(76,80); +ACE_EXPLOSION_REFLECTION(76,90); +ACE_EXPLOSION_REFLECTION(76,100); +ACE_EXPLOSION_REFLECTION(76,110); +ACE_EXPLOSION_REFLECTION(76,120); +ACE_EXPLOSION_REFLECTION(76,130); +ACE_EXPLOSION_REFLECTION(76,140); +ACE_EXPLOSION_REFLECTION(76,150); +ACE_EXPLOSION_REFLECTION(76,160); +ACE_EXPLOSION_REFLECTION(76,170); +ACE_EXPLOSION_REFLECTION(76,180); +ACE_EXPLOSION_REFLECTION(76,190); +ACE_EXPLOSION_REFLECTION(76,200); +ACE_EXPLOSION_REFLECTION(76,210); +ACE_EXPLOSION_REFLECTION(76,220); +ACE_EXPLOSION_REFLECTION(76,230); +ACE_EXPLOSION_REFLECTION(76,240); +ACE_EXPLOSION_REFLECTION(76,250); +ACE_EXPLOSION_REFLECTION(76,260); +ACE_EXPLOSION_REFLECTION(76,270); +ACE_EXPLOSION_REFLECTION(76,280); +ACE_EXPLOSION_REFLECTION(76,290); +ACE_EXPLOSION_REFLECTION(76,300); +ACE_EXPLOSION_REFLECTION(76,310); +ACE_EXPLOSION_REFLECTION(76,320); +ACE_EXPLOSION_REFLECTION(76,330); +ACE_EXPLOSION_REFLECTION(76,340); +ACE_EXPLOSION_REFLECTION(76,350); +ACE_EXPLOSION_REFLECTION(76,360); +ACE_EXPLOSION_REFLECTION(76,370); +ACE_EXPLOSION_REFLECTION(76,380); +ACE_EXPLOSION_REFLECTION(76,390); +ACE_EXPLOSION_REFLECTION(76,400); +ACE_EXPLOSION_REFLECTION(76,410); +ACE_EXPLOSION_REFLECTION(76,420); +ACE_EXPLOSION_REFLECTION(76,430); +ACE_EXPLOSION_REFLECTION(76,440); +ACE_EXPLOSION_REFLECTION(76,450); +ACE_EXPLOSION_REFLECTION(76,460); +ACE_EXPLOSION_REFLECTION(76,470); +ACE_EXPLOSION_REFLECTION(76,480); +ACE_EXPLOSION_REFLECTION(76,490); +ACE_EXPLOSION_REFLECTION(76,500); +ACE_EXPLOSION_REFLECTION(78,10); +ACE_EXPLOSION_REFLECTION(78,20); +ACE_EXPLOSION_REFLECTION(78,30); +ACE_EXPLOSION_REFLECTION(78,40); +ACE_EXPLOSION_REFLECTION(78,50); +ACE_EXPLOSION_REFLECTION(78,60); +ACE_EXPLOSION_REFLECTION(78,70); +ACE_EXPLOSION_REFLECTION(78,80); +ACE_EXPLOSION_REFLECTION(78,90); +ACE_EXPLOSION_REFLECTION(78,100); +ACE_EXPLOSION_REFLECTION(78,110); +ACE_EXPLOSION_REFLECTION(78,120); +ACE_EXPLOSION_REFLECTION(78,130); +ACE_EXPLOSION_REFLECTION(78,140); +ACE_EXPLOSION_REFLECTION(78,150); +ACE_EXPLOSION_REFLECTION(78,160); +ACE_EXPLOSION_REFLECTION(78,170); +ACE_EXPLOSION_REFLECTION(78,180); +ACE_EXPLOSION_REFLECTION(78,190); +ACE_EXPLOSION_REFLECTION(78,200); +ACE_EXPLOSION_REFLECTION(78,210); +ACE_EXPLOSION_REFLECTION(78,220); +ACE_EXPLOSION_REFLECTION(78,230); +ACE_EXPLOSION_REFLECTION(78,240); +ACE_EXPLOSION_REFLECTION(78,250); +ACE_EXPLOSION_REFLECTION(78,260); +ACE_EXPLOSION_REFLECTION(78,270); +ACE_EXPLOSION_REFLECTION(78,280); +ACE_EXPLOSION_REFLECTION(78,290); +ACE_EXPLOSION_REFLECTION(78,300); +ACE_EXPLOSION_REFLECTION(78,310); +ACE_EXPLOSION_REFLECTION(78,320); +ACE_EXPLOSION_REFLECTION(78,330); +ACE_EXPLOSION_REFLECTION(78,340); +ACE_EXPLOSION_REFLECTION(78,350); +ACE_EXPLOSION_REFLECTION(78,360); +ACE_EXPLOSION_REFLECTION(78,370); +ACE_EXPLOSION_REFLECTION(78,380); +ACE_EXPLOSION_REFLECTION(78,390); +ACE_EXPLOSION_REFLECTION(78,400); +ACE_EXPLOSION_REFLECTION(78,410); +ACE_EXPLOSION_REFLECTION(78,420); +ACE_EXPLOSION_REFLECTION(78,430); +ACE_EXPLOSION_REFLECTION(78,440); +ACE_EXPLOSION_REFLECTION(78,450); +ACE_EXPLOSION_REFLECTION(78,460); +ACE_EXPLOSION_REFLECTION(78,470); +ACE_EXPLOSION_REFLECTION(78,480); +ACE_EXPLOSION_REFLECTION(78,490); +ACE_EXPLOSION_REFLECTION(78,500); +ACE_EXPLOSION_REFLECTION(80,10); +ACE_EXPLOSION_REFLECTION(80,20); +ACE_EXPLOSION_REFLECTION(80,30); +ACE_EXPLOSION_REFLECTION(80,40); +ACE_EXPLOSION_REFLECTION(80,50); +ACE_EXPLOSION_REFLECTION(80,60); +ACE_EXPLOSION_REFLECTION(80,70); +ACE_EXPLOSION_REFLECTION(80,80); +ACE_EXPLOSION_REFLECTION(80,90); +ACE_EXPLOSION_REFLECTION(80,100); +ACE_EXPLOSION_REFLECTION(80,110); +ACE_EXPLOSION_REFLECTION(80,120); +ACE_EXPLOSION_REFLECTION(80,130); +ACE_EXPLOSION_REFLECTION(80,140); +ACE_EXPLOSION_REFLECTION(80,150); +ACE_EXPLOSION_REFLECTION(80,160); +ACE_EXPLOSION_REFLECTION(80,170); +ACE_EXPLOSION_REFLECTION(80,180); +ACE_EXPLOSION_REFLECTION(80,190); +ACE_EXPLOSION_REFLECTION(80,200); +ACE_EXPLOSION_REFLECTION(80,210); +ACE_EXPLOSION_REFLECTION(80,220); +ACE_EXPLOSION_REFLECTION(80,230); +ACE_EXPLOSION_REFLECTION(80,240); +ACE_EXPLOSION_REFLECTION(80,250); +ACE_EXPLOSION_REFLECTION(80,260); +ACE_EXPLOSION_REFLECTION(80,270); +ACE_EXPLOSION_REFLECTION(80,280); +ACE_EXPLOSION_REFLECTION(80,290); +ACE_EXPLOSION_REFLECTION(80,300); +ACE_EXPLOSION_REFLECTION(80,310); +ACE_EXPLOSION_REFLECTION(80,320); +ACE_EXPLOSION_REFLECTION(80,330); +ACE_EXPLOSION_REFLECTION(80,340); +ACE_EXPLOSION_REFLECTION(80,350); +ACE_EXPLOSION_REFLECTION(80,360); +ACE_EXPLOSION_REFLECTION(80,370); +ACE_EXPLOSION_REFLECTION(80,380); +ACE_EXPLOSION_REFLECTION(80,390); +ACE_EXPLOSION_REFLECTION(80,400); +ACE_EXPLOSION_REFLECTION(80,410); +ACE_EXPLOSION_REFLECTION(80,420); +ACE_EXPLOSION_REFLECTION(80,430); +ACE_EXPLOSION_REFLECTION(80,440); +ACE_EXPLOSION_REFLECTION(80,450); +ACE_EXPLOSION_REFLECTION(80,460); +ACE_EXPLOSION_REFLECTION(80,470); +ACE_EXPLOSION_REFLECTION(80,480); +ACE_EXPLOSION_REFLECTION(80,490); +ACE_EXPLOSION_REFLECTION(80,500); +ACE_EXPLOSION_REFLECTION(82,10); +ACE_EXPLOSION_REFLECTION(82,20); +ACE_EXPLOSION_REFLECTION(82,30); +ACE_EXPLOSION_REFLECTION(82,40); +ACE_EXPLOSION_REFLECTION(82,50); +ACE_EXPLOSION_REFLECTION(82,60); +ACE_EXPLOSION_REFLECTION(82,70); +ACE_EXPLOSION_REFLECTION(82,80); +ACE_EXPLOSION_REFLECTION(82,90); +ACE_EXPLOSION_REFLECTION(82,100); +ACE_EXPLOSION_REFLECTION(82,110); +ACE_EXPLOSION_REFLECTION(82,120); +ACE_EXPLOSION_REFLECTION(82,130); +ACE_EXPLOSION_REFLECTION(82,140); +ACE_EXPLOSION_REFLECTION(82,150); +ACE_EXPLOSION_REFLECTION(82,160); +ACE_EXPLOSION_REFLECTION(82,170); +ACE_EXPLOSION_REFLECTION(82,180); +ACE_EXPLOSION_REFLECTION(82,190); +ACE_EXPLOSION_REFLECTION(82,200); +ACE_EXPLOSION_REFLECTION(82,210); +ACE_EXPLOSION_REFLECTION(82,220); +ACE_EXPLOSION_REFLECTION(82,230); +ACE_EXPLOSION_REFLECTION(82,240); +ACE_EXPLOSION_REFLECTION(82,250); +ACE_EXPLOSION_REFLECTION(82,260); +ACE_EXPLOSION_REFLECTION(82,270); +ACE_EXPLOSION_REFLECTION(82,280); +ACE_EXPLOSION_REFLECTION(82,290); +ACE_EXPLOSION_REFLECTION(82,300); +ACE_EXPLOSION_REFLECTION(82,310); +ACE_EXPLOSION_REFLECTION(82,320); +ACE_EXPLOSION_REFLECTION(82,330); +ACE_EXPLOSION_REFLECTION(82,340); +ACE_EXPLOSION_REFLECTION(82,350); +ACE_EXPLOSION_REFLECTION(82,360); +ACE_EXPLOSION_REFLECTION(82,370); +ACE_EXPLOSION_REFLECTION(82,380); +ACE_EXPLOSION_REFLECTION(82,390); +ACE_EXPLOSION_REFLECTION(82,400); +ACE_EXPLOSION_REFLECTION(82,410); +ACE_EXPLOSION_REFLECTION(82,420); +ACE_EXPLOSION_REFLECTION(82,430); +ACE_EXPLOSION_REFLECTION(82,440); +ACE_EXPLOSION_REFLECTION(82,450); +ACE_EXPLOSION_REFLECTION(82,460); +ACE_EXPLOSION_REFLECTION(82,470); +ACE_EXPLOSION_REFLECTION(82,480); +ACE_EXPLOSION_REFLECTION(82,490); +ACE_EXPLOSION_REFLECTION(82,500); +ACE_EXPLOSION_REFLECTION(84,10); +ACE_EXPLOSION_REFLECTION(84,20); +ACE_EXPLOSION_REFLECTION(84,30); +ACE_EXPLOSION_REFLECTION(84,40); +ACE_EXPLOSION_REFLECTION(84,50); +ACE_EXPLOSION_REFLECTION(84,60); +ACE_EXPLOSION_REFLECTION(84,70); +ACE_EXPLOSION_REFLECTION(84,80); +ACE_EXPLOSION_REFLECTION(84,90); +ACE_EXPLOSION_REFLECTION(84,100); +ACE_EXPLOSION_REFLECTION(84,110); +ACE_EXPLOSION_REFLECTION(84,120); +ACE_EXPLOSION_REFLECTION(84,130); +ACE_EXPLOSION_REFLECTION(84,140); +ACE_EXPLOSION_REFLECTION(84,150); +ACE_EXPLOSION_REFLECTION(84,160); +ACE_EXPLOSION_REFLECTION(84,170); +ACE_EXPLOSION_REFLECTION(84,180); +ACE_EXPLOSION_REFLECTION(84,190); +ACE_EXPLOSION_REFLECTION(84,200); +ACE_EXPLOSION_REFLECTION(84,210); +ACE_EXPLOSION_REFLECTION(84,220); +ACE_EXPLOSION_REFLECTION(84,230); +ACE_EXPLOSION_REFLECTION(84,240); +ACE_EXPLOSION_REFLECTION(84,250); +ACE_EXPLOSION_REFLECTION(84,260); +ACE_EXPLOSION_REFLECTION(84,270); +ACE_EXPLOSION_REFLECTION(84,280); +ACE_EXPLOSION_REFLECTION(84,290); +ACE_EXPLOSION_REFLECTION(84,300); +ACE_EXPLOSION_REFLECTION(84,310); +ACE_EXPLOSION_REFLECTION(84,320); +ACE_EXPLOSION_REFLECTION(84,330); +ACE_EXPLOSION_REFLECTION(84,340); +ACE_EXPLOSION_REFLECTION(84,350); +ACE_EXPLOSION_REFLECTION(84,360); +ACE_EXPLOSION_REFLECTION(84,370); +ACE_EXPLOSION_REFLECTION(84,380); +ACE_EXPLOSION_REFLECTION(84,390); +ACE_EXPLOSION_REFLECTION(84,400); +ACE_EXPLOSION_REFLECTION(84,410); +ACE_EXPLOSION_REFLECTION(84,420); +ACE_EXPLOSION_REFLECTION(84,430); +ACE_EXPLOSION_REFLECTION(84,440); +ACE_EXPLOSION_REFLECTION(84,450); +ACE_EXPLOSION_REFLECTION(84,460); +ACE_EXPLOSION_REFLECTION(84,470); +ACE_EXPLOSION_REFLECTION(84,480); +ACE_EXPLOSION_REFLECTION(84,490); +ACE_EXPLOSION_REFLECTION(84,500); +ACE_EXPLOSION_REFLECTION(86,10); +ACE_EXPLOSION_REFLECTION(86,20); +ACE_EXPLOSION_REFLECTION(86,30); +ACE_EXPLOSION_REFLECTION(86,40); +ACE_EXPLOSION_REFLECTION(86,50); +ACE_EXPLOSION_REFLECTION(86,60); +ACE_EXPLOSION_REFLECTION(86,70); +ACE_EXPLOSION_REFLECTION(86,80); +ACE_EXPLOSION_REFLECTION(86,90); +ACE_EXPLOSION_REFLECTION(86,100); +ACE_EXPLOSION_REFLECTION(86,110); +ACE_EXPLOSION_REFLECTION(86,120); +ACE_EXPLOSION_REFLECTION(86,130); +ACE_EXPLOSION_REFLECTION(86,140); +ACE_EXPLOSION_REFLECTION(86,150); +ACE_EXPLOSION_REFLECTION(86,160); +ACE_EXPLOSION_REFLECTION(86,170); +ACE_EXPLOSION_REFLECTION(86,180); +ACE_EXPLOSION_REFLECTION(86,190); +ACE_EXPLOSION_REFLECTION(86,200); +ACE_EXPLOSION_REFLECTION(86,210); +ACE_EXPLOSION_REFLECTION(86,220); +ACE_EXPLOSION_REFLECTION(86,230); +ACE_EXPLOSION_REFLECTION(86,240); +ACE_EXPLOSION_REFLECTION(86,250); +ACE_EXPLOSION_REFLECTION(86,260); +ACE_EXPLOSION_REFLECTION(86,270); +ACE_EXPLOSION_REFLECTION(86,280); +ACE_EXPLOSION_REFLECTION(86,290); +ACE_EXPLOSION_REFLECTION(86,300); +ACE_EXPLOSION_REFLECTION(86,310); +ACE_EXPLOSION_REFLECTION(86,320); +ACE_EXPLOSION_REFLECTION(86,330); +ACE_EXPLOSION_REFLECTION(86,340); +ACE_EXPLOSION_REFLECTION(86,350); +ACE_EXPLOSION_REFLECTION(86,360); +ACE_EXPLOSION_REFLECTION(86,370); +ACE_EXPLOSION_REFLECTION(86,380); +ACE_EXPLOSION_REFLECTION(86,390); +ACE_EXPLOSION_REFLECTION(86,400); +ACE_EXPLOSION_REFLECTION(86,410); +ACE_EXPLOSION_REFLECTION(86,420); +ACE_EXPLOSION_REFLECTION(86,430); +ACE_EXPLOSION_REFLECTION(86,440); +ACE_EXPLOSION_REFLECTION(86,450); +ACE_EXPLOSION_REFLECTION(86,460); +ACE_EXPLOSION_REFLECTION(86,470); +ACE_EXPLOSION_REFLECTION(86,480); +ACE_EXPLOSION_REFLECTION(86,490); +ACE_EXPLOSION_REFLECTION(86,500); +ACE_EXPLOSION_REFLECTION(88,10); +ACE_EXPLOSION_REFLECTION(88,20); +ACE_EXPLOSION_REFLECTION(88,30); +ACE_EXPLOSION_REFLECTION(88,40); +ACE_EXPLOSION_REFLECTION(88,50); +ACE_EXPLOSION_REFLECTION(88,60); +ACE_EXPLOSION_REFLECTION(88,70); +ACE_EXPLOSION_REFLECTION(88,80); +ACE_EXPLOSION_REFLECTION(88,90); +ACE_EXPLOSION_REFLECTION(88,100); +ACE_EXPLOSION_REFLECTION(88,110); +ACE_EXPLOSION_REFLECTION(88,120); +ACE_EXPLOSION_REFLECTION(88,130); +ACE_EXPLOSION_REFLECTION(88,140); +ACE_EXPLOSION_REFLECTION(88,150); +ACE_EXPLOSION_REFLECTION(88,160); +ACE_EXPLOSION_REFLECTION(88,170); +ACE_EXPLOSION_REFLECTION(88,180); +ACE_EXPLOSION_REFLECTION(88,190); +ACE_EXPLOSION_REFLECTION(88,200); +ACE_EXPLOSION_REFLECTION(88,210); +ACE_EXPLOSION_REFLECTION(88,220); +ACE_EXPLOSION_REFLECTION(88,230); +ACE_EXPLOSION_REFLECTION(88,240); +ACE_EXPLOSION_REFLECTION(88,250); +ACE_EXPLOSION_REFLECTION(88,260); +ACE_EXPLOSION_REFLECTION(88,270); +ACE_EXPLOSION_REFLECTION(88,280); +ACE_EXPLOSION_REFLECTION(88,290); +ACE_EXPLOSION_REFLECTION(88,300); +ACE_EXPLOSION_REFLECTION(88,310); +ACE_EXPLOSION_REFLECTION(88,320); +ACE_EXPLOSION_REFLECTION(88,330); +ACE_EXPLOSION_REFLECTION(88,340); +ACE_EXPLOSION_REFLECTION(88,350); +ACE_EXPLOSION_REFLECTION(88,360); +ACE_EXPLOSION_REFLECTION(88,370); +ACE_EXPLOSION_REFLECTION(88,380); +ACE_EXPLOSION_REFLECTION(88,390); +ACE_EXPLOSION_REFLECTION(88,400); +ACE_EXPLOSION_REFLECTION(88,410); +ACE_EXPLOSION_REFLECTION(88,420); +ACE_EXPLOSION_REFLECTION(88,430); +ACE_EXPLOSION_REFLECTION(88,440); +ACE_EXPLOSION_REFLECTION(88,450); +ACE_EXPLOSION_REFLECTION(88,460); +ACE_EXPLOSION_REFLECTION(88,470); +ACE_EXPLOSION_REFLECTION(88,480); +ACE_EXPLOSION_REFLECTION(88,490); +ACE_EXPLOSION_REFLECTION(88,500); +ACE_EXPLOSION_REFLECTION(90,10); +ACE_EXPLOSION_REFLECTION(90,20); +ACE_EXPLOSION_REFLECTION(90,30); +ACE_EXPLOSION_REFLECTION(90,40); +ACE_EXPLOSION_REFLECTION(90,50); +ACE_EXPLOSION_REFLECTION(90,60); +ACE_EXPLOSION_REFLECTION(90,70); +ACE_EXPLOSION_REFLECTION(90,80); +ACE_EXPLOSION_REFLECTION(90,90); +ACE_EXPLOSION_REFLECTION(90,100); +ACE_EXPLOSION_REFLECTION(90,110); +ACE_EXPLOSION_REFLECTION(90,120); +ACE_EXPLOSION_REFLECTION(90,130); +ACE_EXPLOSION_REFLECTION(90,140); +ACE_EXPLOSION_REFLECTION(90,150); +ACE_EXPLOSION_REFLECTION(90,160); +ACE_EXPLOSION_REFLECTION(90,170); +ACE_EXPLOSION_REFLECTION(90,180); +ACE_EXPLOSION_REFLECTION(90,190); +ACE_EXPLOSION_REFLECTION(90,200); +ACE_EXPLOSION_REFLECTION(90,210); +ACE_EXPLOSION_REFLECTION(90,220); +ACE_EXPLOSION_REFLECTION(90,230); +ACE_EXPLOSION_REFLECTION(90,240); +ACE_EXPLOSION_REFLECTION(90,250); +ACE_EXPLOSION_REFLECTION(90,260); +ACE_EXPLOSION_REFLECTION(90,270); +ACE_EXPLOSION_REFLECTION(90,280); +ACE_EXPLOSION_REFLECTION(90,290); +ACE_EXPLOSION_REFLECTION(90,300); +ACE_EXPLOSION_REFLECTION(90,310); +ACE_EXPLOSION_REFLECTION(90,320); +ACE_EXPLOSION_REFLECTION(90,330); +ACE_EXPLOSION_REFLECTION(90,340); +ACE_EXPLOSION_REFLECTION(90,350); +ACE_EXPLOSION_REFLECTION(90,360); +ACE_EXPLOSION_REFLECTION(90,370); +ACE_EXPLOSION_REFLECTION(90,380); +ACE_EXPLOSION_REFLECTION(90,390); +ACE_EXPLOSION_REFLECTION(90,400); +ACE_EXPLOSION_REFLECTION(90,410); +ACE_EXPLOSION_REFLECTION(90,420); +ACE_EXPLOSION_REFLECTION(90,430); +ACE_EXPLOSION_REFLECTION(90,440); +ACE_EXPLOSION_REFLECTION(90,450); +ACE_EXPLOSION_REFLECTION(90,460); +ACE_EXPLOSION_REFLECTION(90,470); +ACE_EXPLOSION_REFLECTION(90,480); +ACE_EXPLOSION_REFLECTION(90,490); +ACE_EXPLOSION_REFLECTION(90,500); +ACE_EXPLOSION_REFLECTION(92,10); +ACE_EXPLOSION_REFLECTION(92,20); +ACE_EXPLOSION_REFLECTION(92,30); +ACE_EXPLOSION_REFLECTION(92,40); +ACE_EXPLOSION_REFLECTION(92,50); +ACE_EXPLOSION_REFLECTION(92,60); +ACE_EXPLOSION_REFLECTION(92,70); +ACE_EXPLOSION_REFLECTION(92,80); +ACE_EXPLOSION_REFLECTION(92,90); +ACE_EXPLOSION_REFLECTION(92,100); +ACE_EXPLOSION_REFLECTION(92,110); +ACE_EXPLOSION_REFLECTION(92,120); +ACE_EXPLOSION_REFLECTION(92,130); +ACE_EXPLOSION_REFLECTION(92,140); +ACE_EXPLOSION_REFLECTION(92,150); +ACE_EXPLOSION_REFLECTION(92,160); +ACE_EXPLOSION_REFLECTION(92,170); +ACE_EXPLOSION_REFLECTION(92,180); +ACE_EXPLOSION_REFLECTION(92,190); +ACE_EXPLOSION_REFLECTION(92,200); +ACE_EXPLOSION_REFLECTION(92,210); +ACE_EXPLOSION_REFLECTION(92,220); +ACE_EXPLOSION_REFLECTION(92,230); +ACE_EXPLOSION_REFLECTION(92,240); +ACE_EXPLOSION_REFLECTION(92,250); +ACE_EXPLOSION_REFLECTION(92,260); +ACE_EXPLOSION_REFLECTION(92,270); +ACE_EXPLOSION_REFLECTION(92,280); +ACE_EXPLOSION_REFLECTION(92,290); +ACE_EXPLOSION_REFLECTION(92,300); +ACE_EXPLOSION_REFLECTION(92,310); +ACE_EXPLOSION_REFLECTION(92,320); +ACE_EXPLOSION_REFLECTION(92,330); +ACE_EXPLOSION_REFLECTION(92,340); +ACE_EXPLOSION_REFLECTION(92,350); +ACE_EXPLOSION_REFLECTION(92,360); +ACE_EXPLOSION_REFLECTION(92,370); +ACE_EXPLOSION_REFLECTION(92,380); +ACE_EXPLOSION_REFLECTION(92,390); +ACE_EXPLOSION_REFLECTION(92,400); +ACE_EXPLOSION_REFLECTION(92,410); +ACE_EXPLOSION_REFLECTION(92,420); +ACE_EXPLOSION_REFLECTION(92,430); +ACE_EXPLOSION_REFLECTION(92,440); +ACE_EXPLOSION_REFLECTION(92,450); +ACE_EXPLOSION_REFLECTION(92,460); +ACE_EXPLOSION_REFLECTION(92,470); +ACE_EXPLOSION_REFLECTION(92,480); +ACE_EXPLOSION_REFLECTION(92,490); +ACE_EXPLOSION_REFLECTION(92,500); +ACE_EXPLOSION_REFLECTION(94,10); +ACE_EXPLOSION_REFLECTION(94,20); +ACE_EXPLOSION_REFLECTION(94,30); +ACE_EXPLOSION_REFLECTION(94,40); +ACE_EXPLOSION_REFLECTION(94,50); +ACE_EXPLOSION_REFLECTION(94,60); +ACE_EXPLOSION_REFLECTION(94,70); +ACE_EXPLOSION_REFLECTION(94,80); +ACE_EXPLOSION_REFLECTION(94,90); +ACE_EXPLOSION_REFLECTION(94,100); +ACE_EXPLOSION_REFLECTION(94,110); +ACE_EXPLOSION_REFLECTION(94,120); +ACE_EXPLOSION_REFLECTION(94,130); +ACE_EXPLOSION_REFLECTION(94,140); +ACE_EXPLOSION_REFLECTION(94,150); +ACE_EXPLOSION_REFLECTION(94,160); +ACE_EXPLOSION_REFLECTION(94,170); +ACE_EXPLOSION_REFLECTION(94,180); +ACE_EXPLOSION_REFLECTION(94,190); +ACE_EXPLOSION_REFLECTION(94,200); +ACE_EXPLOSION_REFLECTION(94,210); +ACE_EXPLOSION_REFLECTION(94,220); +ACE_EXPLOSION_REFLECTION(94,230); +ACE_EXPLOSION_REFLECTION(94,240); +ACE_EXPLOSION_REFLECTION(94,250); +ACE_EXPLOSION_REFLECTION(94,260); +ACE_EXPLOSION_REFLECTION(94,270); +ACE_EXPLOSION_REFLECTION(94,280); +ACE_EXPLOSION_REFLECTION(94,290); +ACE_EXPLOSION_REFLECTION(94,300); +ACE_EXPLOSION_REFLECTION(94,310); +ACE_EXPLOSION_REFLECTION(94,320); +ACE_EXPLOSION_REFLECTION(94,330); +ACE_EXPLOSION_REFLECTION(94,340); +ACE_EXPLOSION_REFLECTION(94,350); +ACE_EXPLOSION_REFLECTION(94,360); +ACE_EXPLOSION_REFLECTION(94,370); +ACE_EXPLOSION_REFLECTION(94,380); +ACE_EXPLOSION_REFLECTION(94,390); +ACE_EXPLOSION_REFLECTION(94,400); +ACE_EXPLOSION_REFLECTION(94,410); +ACE_EXPLOSION_REFLECTION(94,420); +ACE_EXPLOSION_REFLECTION(94,430); +ACE_EXPLOSION_REFLECTION(94,440); +ACE_EXPLOSION_REFLECTION(94,450); +ACE_EXPLOSION_REFLECTION(94,460); +ACE_EXPLOSION_REFLECTION(94,470); +ACE_EXPLOSION_REFLECTION(94,480); +ACE_EXPLOSION_REFLECTION(94,490); +ACE_EXPLOSION_REFLECTION(94,500); +ACE_EXPLOSION_REFLECTION(96,10); +ACE_EXPLOSION_REFLECTION(96,20); +ACE_EXPLOSION_REFLECTION(96,30); +ACE_EXPLOSION_REFLECTION(96,40); +ACE_EXPLOSION_REFLECTION(96,50); +ACE_EXPLOSION_REFLECTION(96,60); +ACE_EXPLOSION_REFLECTION(96,70); +ACE_EXPLOSION_REFLECTION(96,80); +ACE_EXPLOSION_REFLECTION(96,90); +ACE_EXPLOSION_REFLECTION(96,100); +ACE_EXPLOSION_REFLECTION(96,110); +ACE_EXPLOSION_REFLECTION(96,120); +ACE_EXPLOSION_REFLECTION(96,130); +ACE_EXPLOSION_REFLECTION(96,140); +ACE_EXPLOSION_REFLECTION(96,150); +ACE_EXPLOSION_REFLECTION(96,160); +ACE_EXPLOSION_REFLECTION(96,170); +ACE_EXPLOSION_REFLECTION(96,180); +ACE_EXPLOSION_REFLECTION(96,190); +ACE_EXPLOSION_REFLECTION(96,200); +ACE_EXPLOSION_REFLECTION(96,210); +ACE_EXPLOSION_REFLECTION(96,220); +ACE_EXPLOSION_REFLECTION(96,230); +ACE_EXPLOSION_REFLECTION(96,240); +ACE_EXPLOSION_REFLECTION(96,250); +ACE_EXPLOSION_REFLECTION(96,260); +ACE_EXPLOSION_REFLECTION(96,270); +ACE_EXPLOSION_REFLECTION(96,280); +ACE_EXPLOSION_REFLECTION(96,290); +ACE_EXPLOSION_REFLECTION(96,300); +ACE_EXPLOSION_REFLECTION(96,310); +ACE_EXPLOSION_REFLECTION(96,320); +ACE_EXPLOSION_REFLECTION(96,330); +ACE_EXPLOSION_REFLECTION(96,340); +ACE_EXPLOSION_REFLECTION(96,350); +ACE_EXPLOSION_REFLECTION(96,360); +ACE_EXPLOSION_REFLECTION(96,370); +ACE_EXPLOSION_REFLECTION(96,380); +ACE_EXPLOSION_REFLECTION(96,390); +ACE_EXPLOSION_REFLECTION(96,400); +ACE_EXPLOSION_REFLECTION(96,410); +ACE_EXPLOSION_REFLECTION(96,420); +ACE_EXPLOSION_REFLECTION(96,430); +ACE_EXPLOSION_REFLECTION(96,440); +ACE_EXPLOSION_REFLECTION(96,450); +ACE_EXPLOSION_REFLECTION(96,460); +ACE_EXPLOSION_REFLECTION(96,470); +ACE_EXPLOSION_REFLECTION(96,480); +ACE_EXPLOSION_REFLECTION(96,490); +ACE_EXPLOSION_REFLECTION(96,500); +ACE_EXPLOSION_REFLECTION(98,10); +ACE_EXPLOSION_REFLECTION(98,20); +ACE_EXPLOSION_REFLECTION(98,30); +ACE_EXPLOSION_REFLECTION(98,40); +ACE_EXPLOSION_REFLECTION(98,50); +ACE_EXPLOSION_REFLECTION(98,60); +ACE_EXPLOSION_REFLECTION(98,70); +ACE_EXPLOSION_REFLECTION(98,80); +ACE_EXPLOSION_REFLECTION(98,90); +ACE_EXPLOSION_REFLECTION(98,100); +ACE_EXPLOSION_REFLECTION(98,110); +ACE_EXPLOSION_REFLECTION(98,120); +ACE_EXPLOSION_REFLECTION(98,130); +ACE_EXPLOSION_REFLECTION(98,140); +ACE_EXPLOSION_REFLECTION(98,150); +ACE_EXPLOSION_REFLECTION(98,160); +ACE_EXPLOSION_REFLECTION(98,170); +ACE_EXPLOSION_REFLECTION(98,180); +ACE_EXPLOSION_REFLECTION(98,190); +ACE_EXPLOSION_REFLECTION(98,200); +ACE_EXPLOSION_REFLECTION(98,210); +ACE_EXPLOSION_REFLECTION(98,220); +ACE_EXPLOSION_REFLECTION(98,230); +ACE_EXPLOSION_REFLECTION(98,240); +ACE_EXPLOSION_REFLECTION(98,250); +ACE_EXPLOSION_REFLECTION(98,260); +ACE_EXPLOSION_REFLECTION(98,270); +ACE_EXPLOSION_REFLECTION(98,280); +ACE_EXPLOSION_REFLECTION(98,290); +ACE_EXPLOSION_REFLECTION(98,300); +ACE_EXPLOSION_REFLECTION(98,310); +ACE_EXPLOSION_REFLECTION(98,320); +ACE_EXPLOSION_REFLECTION(98,330); +ACE_EXPLOSION_REFLECTION(98,340); +ACE_EXPLOSION_REFLECTION(98,350); +ACE_EXPLOSION_REFLECTION(98,360); +ACE_EXPLOSION_REFLECTION(98,370); +ACE_EXPLOSION_REFLECTION(98,380); +ACE_EXPLOSION_REFLECTION(98,390); +ACE_EXPLOSION_REFLECTION(98,400); +ACE_EXPLOSION_REFLECTION(98,410); +ACE_EXPLOSION_REFLECTION(98,420); +ACE_EXPLOSION_REFLECTION(98,430); +ACE_EXPLOSION_REFLECTION(98,440); +ACE_EXPLOSION_REFLECTION(98,450); +ACE_EXPLOSION_REFLECTION(98,460); +ACE_EXPLOSION_REFLECTION(98,470); +ACE_EXPLOSION_REFLECTION(98,480); +ACE_EXPLOSION_REFLECTION(98,490); +ACE_EXPLOSION_REFLECTION(98,500); +ACE_EXPLOSION_REFLECTION(100,10); +ACE_EXPLOSION_REFLECTION(100,20); +ACE_EXPLOSION_REFLECTION(100,30); +ACE_EXPLOSION_REFLECTION(100,40); +ACE_EXPLOSION_REFLECTION(100,50); +ACE_EXPLOSION_REFLECTION(100,60); +ACE_EXPLOSION_REFLECTION(100,70); +ACE_EXPLOSION_REFLECTION(100,80); +ACE_EXPLOSION_REFLECTION(100,90); +ACE_EXPLOSION_REFLECTION(100,100); +ACE_EXPLOSION_REFLECTION(100,110); +ACE_EXPLOSION_REFLECTION(100,120); +ACE_EXPLOSION_REFLECTION(100,130); +ACE_EXPLOSION_REFLECTION(100,140); +ACE_EXPLOSION_REFLECTION(100,150); +ACE_EXPLOSION_REFLECTION(100,160); +ACE_EXPLOSION_REFLECTION(100,170); +ACE_EXPLOSION_REFLECTION(100,180); +ACE_EXPLOSION_REFLECTION(100,190); +ACE_EXPLOSION_REFLECTION(100,200); +ACE_EXPLOSION_REFLECTION(100,210); +ACE_EXPLOSION_REFLECTION(100,220); +ACE_EXPLOSION_REFLECTION(100,230); +ACE_EXPLOSION_REFLECTION(100,240); +ACE_EXPLOSION_REFLECTION(100,250); +ACE_EXPLOSION_REFLECTION(100,260); +ACE_EXPLOSION_REFLECTION(100,270); +ACE_EXPLOSION_REFLECTION(100,280); +ACE_EXPLOSION_REFLECTION(100,290); +ACE_EXPLOSION_REFLECTION(100,300); +ACE_EXPLOSION_REFLECTION(100,310); +ACE_EXPLOSION_REFLECTION(100,320); +ACE_EXPLOSION_REFLECTION(100,330); +ACE_EXPLOSION_REFLECTION(100,340); +ACE_EXPLOSION_REFLECTION(100,350); +ACE_EXPLOSION_REFLECTION(100,360); +ACE_EXPLOSION_REFLECTION(100,370); +ACE_EXPLOSION_REFLECTION(100,380); +ACE_EXPLOSION_REFLECTION(100,390); +ACE_EXPLOSION_REFLECTION(100,400); +ACE_EXPLOSION_REFLECTION(100,410); +ACE_EXPLOSION_REFLECTION(100,420); +ACE_EXPLOSION_REFLECTION(100,430); +ACE_EXPLOSION_REFLECTION(100,440); +ACE_EXPLOSION_REFLECTION(100,450); +ACE_EXPLOSION_REFLECTION(100,460); +ACE_EXPLOSION_REFLECTION(100,470); +ACE_EXPLOSION_REFLECTION(100,480); +ACE_EXPLOSION_REFLECTION(100,490); +ACE_EXPLOSION_REFLECTION(100,500); + diff --git a/addons/frag/XEH_pre_Init.sqf b/addons/frag/XEH_pre_Init.sqf index 5b3aa36b18..4ec70bbc3d 100644 --- a/addons/frag/XEH_pre_Init.sqf +++ b/addons/frag/XEH_pre_Init.sqf @@ -9,6 +9,10 @@ PREP(trackFragRound); PREP(spallTrack); PREP(doSpall); PREP(vectorDiffFast); +PREP(findReflections); +PREP(doExplosions); +PREP(doReflections); + GVAR(trackedObjects) = []; GVAR(blackList) = []; diff --git a/addons/frag/functions/fnc_doExplosions.sqf b/addons/frag/functions/fnc_doExplosions.sqf new file mode 100644 index 0000000000..f2c20c2f1e --- /dev/null +++ b/addons/frag/functions/fnc_doExplosions.sqf @@ -0,0 +1,26 @@ +//fnc_doExplosions.sqf +#include "script_component.hpp" + +private ["_params", "_explosions", "_index", "_i", "_exp", "_refExp", "_bpos", "_hit", "_distance", "_indirectHitRange", "_depth"]; +_params = _this select 0; +_explosions = _params select 0; +_index = _params select 1; +for "_i" from _index to ((_index+1) min (count _explosions)) do { + _exp = _explosions select _i; + _refExp = _exp select 0; + _bpos = _exp select 1; + _hit = _exp select 2; + _distance = _exp select 3; + _indirectHitRange = _exp select 4; + _depth = _exp select 5; + _refExp createVehicle (ASLtoATL _bpos); + // if(_hit >= 150 && _distance > _indirectHitRange) then { + // [_bpos, _refExp, _depth] call FUNC(doReflections); + // }; +}; +_index = _index + 1; +if(_index >= (count _explosions)) then { + [(_this select 1)] call cba_fnc_removePerFrameHandler; +} else { + _params set[1, _index]; +}; diff --git a/addons/frag/functions/fnc_doReflections.sqf b/addons/frag/functions/fnc_doReflections.sqf new file mode 100644 index 0000000000..844ccb4c9b --- /dev/null +++ b/addons/frag/functions/fnc_doReflections.sqf @@ -0,0 +1,22 @@ +//fnc_doReflections.sqf +#include "script_component.hpp" + +private ["_pos", "_ammo", "_depth", "_hit", "_range", "_hitFactor", "_indirectHitRange", "_indirectHit", "_testParams"]; + +_pos = _this select 0; +_ammo = _this select 1; +_depth = 1; +if(count _this > 2) then { + _depth = _this select 2; +}; +// TEST_ICONS pushBack [_pos, format["EXP!", _hit, _range, _hitFactor]]; +if(_depth <= 2) then { + _indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange"); + _indirectHit = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirectHit"); + + + + + _testParams = [_pos, [_indirectHitRange, _indirectHit], [], [], -4, _depth, 0]; + [DFUNC(findReflections), 0.005, _testParams] call cba_fnc_addPerFrameHandler; +}; diff --git a/addons/frag/functions/fnc_findReflections.sqf b/addons/frag/functions/fnc_findReflections.sqf new file mode 100644 index 0000000000..75c4ee2ae6 --- /dev/null +++ b/addons/frag/functions/fnc_findReflections.sqf @@ -0,0 +1,130 @@ +//fnc_findReflections.sqf +#include "script_component.hpp" + +private ["_split", "_radi", "_params", "_pos", "_explosiveInfo", "_los", "_nlos", "_zIndex", "_depth", "_indirectHitRange", + "_indirectHit", "_distanceCount", "_lastPos", "_test", "_vec", "_testPos", "_buckets", "_excludes", "_bucketIndex", "_bucketPos", + "_bucketList", "_c", "_index", "_blist", "_avgX", "_avgY", "_avgZ", "_bpos", "_distance", "_hitFactor", "_hit", "_range", "_refExp", + "_rand", "_i", "_x", "_res", "_forEachIndex", "_explosions", "_can", "_dirvec"]; + + +_params = _this select 0; +_pos = _params select 0; +_explosiveInfo = _params select 1; +_los = _params select 2; +_nlos = _params select 3; +_zIndex = _params select 4; +_depth = _params select 5; +_rand = _params select 6; + +_split = 15; +_radi = (360/_split*_depth); + +// player sideChat format["p: %1", _explosiveInfo]; +_indirectHitRange = _explosiveInfo select 0; +_indirectHit = _explosiveInfo select 1; +_distanceCount = (floor _indirectHitRange*4) min 100; + +if(_zIndex < 5) then { + _lastPos = _pos; + _zAng = _zIndex*20+2; + if(_zAng > 80) then { + _radi = 1; + _zAng = 90; + }; + for "_i" from 0 to _radi do { + _test = true; + _vec = [1, ((_i*_split)+_rand) mod 360, _zAng] call cba_fnc_polar2vect; + for "_x" from 1 to _distanceCount do { + _testPos = _pos vectorAdd (_vec vectorMultiply _x); + // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _testPos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; + _res = lineIntersectsWith [_pos, _testPos]; + if(count _res > 0) exitWith { + _test = false; + _nlos pushBack _lastPos; + // { + // _x addEventHandler ["HandleDamage", { diag_log text format["this: %1", _this]; }]; + // } forEach _res; + // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _testPos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; + // TEST_PAIRS pushBack [_pos, _lastPos, [1,0,0,1]]; + + }; + // if(terrainIntersectASL [_pos, _testPos]) exitWith {}; + _lastPos = _testPos; + }; + }; + _params set[4, _zIndex+1]; +} else { + _depth = _depth + 1; + _buckets = []; + _excludes = []; + _bucketIndex = 0; + _bucketPos = nil; + _bucketList = nil; + _c = 0; + while { count(_nlos) != count(_excludes) && _c < (count _nlos) } do { + scopeName "mainSearch"; + { + if(!(_forEachIndex in _excludes)) then { + _index = _buckets pushBack [_x, [_x]]; + _excludes pushBack _forEachIndex; + _bucketPos = _x; + _bucketList = (_buckets select _index) select 1; + breakTo "mainSearch"; + }; + } forEach _nlos; + { + if(!(_forEachIndex in _excludes)) then { + _testPos = _x; + if(_testPos vectorDistanceSqr _bucketPos <= 30) then { + _bucketList pushBack _x; + _excludes pushBack _forEachIndex; + }; + }; + } forEach _nlos; + _c = _c + 1; + }; + + // player sideChat format["c: %1", count _buckets]; + _explosions = []; + { + _blist = _x select 1; + _avgX = 0; + _avgY = 0; + _avgZ = 0; + + { + _avgX = _avgX + (_x select 0); + _avgY = _avgY + (_x select 1); + _avgZ = _avgZ + (_x select 2); + } forEach _blist; + _c = count _blist; + _bpos = [_avgX/_c, _avgY/_c, _avgZ/_c]; + + _distance = _pos vectorDistance _bpos; + _hitFactor = 1-(((_distance/(_indirectHitRange*4)) min 1) max 0); + // _hitFactor = 1/(_distance^2); + _hit = _indirectHit*_hitFactor; + _hit = (floor (_hit/4)) min 500; + _hit = _hit - (_hit%10); + _range = (floor (_indirectHitRange-(_distance/4))) min 100; + _range = _range - (_range%2); + + if(_hit >= 10 && _range > 0) then { + // TEST_ICONS pushBack [_bpos, format["h: %1, r: %2, hf: %3 d: %4 ihr: %5", _hit, _range, _hitFactor, _distance, _indirectHitRange*4]]; + // TEST_PAIRS pushBack [_pos, _bpos, [1,0,0,1]]; + _refExp = format["ace_explosion_reflection_%1_%2", _range, _hit]; + // _refExp createVehicle (ASLtoATL _bpos); + // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _bpos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; + + _explosions pushBack [_refExp, _bpos, _hit, _distance, _indirectHitRange/4, _depth]; + + }; + if(count _explosions > (_radi*2)/_depth) exitWith {}; + } forEach _buckets; + // _can = "Land_Bricks_V4_F" createVehicle (ASLtoATL _pos); + // _dirvec = _pos vectorFromTo ((ATLtoASL (player modelToWorldVisual (player selectionPosition "Spine3")))); + // _dirvec = _dirvec vectorMultiply 100; + // _can setVelocity _dirvec; + [DFUNC(doExplosions), 0, [_explosions, 0]] call cba_fnc_addPerFrameHandler; + [(_this select 1)] call cba_fnc_removePerFrameHandler; +}; diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index 1b737dc70d..8c97baa209 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -111,8 +111,9 @@ _fragArcs set[360, 0]; player sideChat format["_fragRange: %1", _fragRange]; player sideChat format["_objects: %1", _objects]; #endif -_doRandom = false; +_doRandom = true; if(_isArmed && (count _objects) > 0) then { + [_lastPos, _shellType] call FUNC(doReflections); { //if(random(1) > 0.5) then { _target = _x; @@ -189,7 +190,7 @@ if(_isArmed && (count _objects) > 0) then { if(_fragCount > MAX_FRAG_COUNT) exitWith {}; } forEach _objects; if(_fragCount > MAX_FRAG_COUNT) exitWith {}; - _randomCount = (ceil((MAX_FRAG_COUNT-_fragCount)*0.1)) max 0; + _randomCount = ((ceil((MAX_FRAG_COUNT-_fragCount)*0.1)) max 0)+20; _sectorSize = 360 / (_randomCount max 1); // _doRandom = false; if(_doRandom) then { @@ -222,6 +223,7 @@ if(_isArmed && (count _objects) > 0) then { _fragCount = _fragCount + 1; }; }; + }; // #ifdef DEBUG_MODE_FULL // player sideChat format["total frags: %1", GVAR(TOTALFRAGS)]; From 114d66af7e375fc248c92bb769ebb22e3a2b5e86 Mon Sep 17 00:00:00 2001 From: Nou Date: Tue, 14 Apr 2015 13:00:57 -0700 Subject: [PATCH 003/664] Do it every frame, no need for delay. --- addons/frag/functions/fnc_doReflections.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/frag/functions/fnc_doReflections.sqf b/addons/frag/functions/fnc_doReflections.sqf index 844ccb4c9b..911203dc5f 100644 --- a/addons/frag/functions/fnc_doReflections.sqf +++ b/addons/frag/functions/fnc_doReflections.sqf @@ -18,5 +18,5 @@ if(_depth <= 2) then { _testParams = [_pos, [_indirectHitRange, _indirectHit], [], [], -4, _depth, 0]; - [DFUNC(findReflections), 0.005, _testParams] call cba_fnc_addPerFrameHandler; + [DFUNC(findReflections), 0, _testParams] call cba_fnc_addPerFrameHandler; }; From 15ac5ec7b8ad71dff640c0164c7453c068472605 Mon Sep 17 00:00:00 2001 From: Nou Date: Tue, 14 Apr 2015 16:33:47 -0700 Subject: [PATCH 004/664] Two explosions processed per-frame. --- addons/frag/functions/fnc_doExplosions.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/frag/functions/fnc_doExplosions.sqf b/addons/frag/functions/fnc_doExplosions.sqf index f2c20c2f1e..749c4bd2ec 100644 --- a/addons/frag/functions/fnc_doExplosions.sqf +++ b/addons/frag/functions/fnc_doExplosions.sqf @@ -5,7 +5,7 @@ private ["_params", "_explosions", "_index", "_i", "_exp", "_refExp", "_bpos", " _params = _this select 0; _explosions = _params select 0; _index = _params select 1; -for "_i" from _index to ((_index+1) min (count _explosions)) do { +for "_i" from _index to ((_index+2) min (count _explosions)) do { _exp = _explosions select _i; _refExp = _exp select 0; _bpos = _exp select 1; @@ -18,7 +18,7 @@ for "_i" from _index to ((_index+1) min (count _explosions)) do { // [_bpos, _refExp, _depth] call FUNC(doReflections); // }; }; -_index = _index + 1; +_index = _index + 2; if(_index >= (count _explosions)) then { [(_this select 1)] call cba_fnc_removePerFrameHandler; } else { From c2388aa80ce72fa4ebf2a1a7a8721fa93169b67d Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 4 May 2015 00:02:39 +0200 Subject: [PATCH 005/664] Initial work on medical extension --- extensions/CMakeLists.txt | 1 + extensions/medical/CMakeLists.txt | 13 ++++ extensions/medical/DamageType.cpp | 13 ++++ extensions/medical/DamageType.h | 26 ++++++++ extensions/medical/InjuryType.cpp | 14 +++++ extensions/medical/InjuryType.h | 27 +++++++++ extensions/medical/OpenWound.cpp | 19 ++++++ extensions/medical/OpenWound.h | 23 +++++++ extensions/medical/handleDamage.cpp | 94 +++++++++++++++++++++++++++++ extensions/medical/handleDamage.h | 66 ++++++++++++++++++++ extensions/medical/medical.cpp | 57 +++++++++++++++++ 11 files changed, 353 insertions(+) create mode 100644 extensions/medical/CMakeLists.txt create mode 100644 extensions/medical/DamageType.cpp create mode 100644 extensions/medical/DamageType.h create mode 100644 extensions/medical/InjuryType.cpp create mode 100644 extensions/medical/InjuryType.h create mode 100644 extensions/medical/OpenWound.cpp create mode 100644 extensions/medical/OpenWound.h create mode 100644 extensions/medical/handleDamage.cpp create mode 100644 extensions/medical/handleDamage.h create mode 100644 extensions/medical/medical.cpp diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 9f4a8a29fa..bcef05d810 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -58,5 +58,6 @@ add_subdirectory(fcs) add_subdirectory(break_line) add_subdirectory(clipboard) add_subdirectory(advanced_ballistics) +add_subdirectory(medical) message("Build Type: ${CMAKE_BUILD_TYPE}") \ No newline at end of file diff --git a/extensions/medical/CMakeLists.txt b/extensions/medical/CMakeLists.txt new file mode 100644 index 0000000000..63d7105810 --- /dev/null +++ b/extensions/medical/CMakeLists.txt @@ -0,0 +1,13 @@ +set(ACE_EXTENSION_NAME "ace_medical") + +file(GLOB SOURCES *.h *.hpp *.c *.cpp) + +add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES} ${GLOBAL_SOURCES}) +target_link_libraries(${ACE_EXTENSION_NAME} ace_common) +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES FOLDER Extensions) + +if(CMAKE_COMPILER_IS_GNUCXX) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_END_STATIC 1) +endif() \ No newline at end of file diff --git a/extensions/medical/DamageType.cpp b/extensions/medical/DamageType.cpp new file mode 100644 index 0000000000..5fb9a4846d --- /dev/null +++ b/extensions/medical/DamageType.cpp @@ -0,0 +1,13 @@ +#include "DamageType.h" + +using namespace ace::medical; + +injuries::DamageType::DamageType(std::string aTypeName, unsigned int minimalLethalDamage, unsigned int minDamage, unsigned int maxDamage) + : typeName(aTypeName), minLethalDamage(minimalLethalDamage), minDamageThreshold(minDamage), maxDamageThreshold(maxDamage) +{ +} + + +injuries::DamageType::~DamageType() +{ +} diff --git a/extensions/medical/DamageType.h b/extensions/medical/DamageType.h new file mode 100644 index 0000000000..7106588f03 --- /dev/null +++ b/extensions/medical/DamageType.h @@ -0,0 +1,26 @@ +#include +#include +#include + + +namespace ace { + namespace medical { + namespace injuries { + class InjuryType; + + class DamageType + { + public: + DamageType(std::string aTypeName, unsigned int minimalLethalDamage, unsigned int minDamageThreshold, unsigned int maxDamageThreshold); + ~DamageType(); + + std::string typeName; + unsigned int minLethalDamage; + unsigned int minDamageThreshold; + unsigned int maxDamageThreshold; + + std::vector> possibleInjuries; + }; + } + } +} diff --git a/extensions/medical/InjuryType.cpp b/extensions/medical/InjuryType.cpp new file mode 100644 index 0000000000..07f902816f --- /dev/null +++ b/extensions/medical/InjuryType.cpp @@ -0,0 +1,14 @@ +#include "InjuryType.h" +#include "DamageType.h" + +using namespace ace::medical; + +injuries::InjuryType::InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, signed int theBloodLoss, signed int thePain, signed int minimumDamage, signed int maximumDamage, std::vector& possibleCauses, std::string& aDisplayname) + : ID(anId), className(aClassname), selections(allowedSelections), bloodLoss(theBloodLoss), pain(thePain), minDamage(minimumDamage), maxDamage(maximumDamage), causes(possibleCauses), displayName(aDisplayname) +{ +} + + +injuries::InjuryType::~InjuryType() +{ +} diff --git a/extensions/medical/InjuryType.h b/extensions/medical/InjuryType.h new file mode 100644 index 0000000000..92766dd315 --- /dev/null +++ b/extensions/medical/InjuryType.h @@ -0,0 +1,27 @@ +#include +#include + +namespace ace { + namespace medical { + namespace injuries { + class DamageType; + + class InjuryType + { + public: + InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, signed int theBloodLoss, signed int thePain, signed int minimumDamage, signed int maximumDamage, std::vector& possibleCauses, std::string& aDisplayname); + ~InjuryType(); + + signed int ID; + std::string className; + std::vector selections; + signed int bloodLoss; + signed int pain; + signed int minDamage; + signed int maxDamage; + std::vector causes; + std::string displayName; + }; + } + } +} \ No newline at end of file diff --git a/extensions/medical/OpenWound.cpp b/extensions/medical/OpenWound.cpp new file mode 100644 index 0000000000..77e38a9359 --- /dev/null +++ b/extensions/medical/OpenWound.cpp @@ -0,0 +1,19 @@ +#include "OpenWound.h" +#include + +using namespace ace::medical; + +injuries::OpenWound::OpenWound(unsigned int anID, unsigned int aBodyPart, unsigned int bloodloss) : classID(anID), bodyPart(aBodyPart), bloodlossRate(bloodloss) +{ +} + +injuries::OpenWound::~OpenWound() +{ +} + +std::string injuries::OpenWound::AsString() +{ + std::stringstream stream; + stream << classID << "," << bodyPart << "," << 1 << "," << bloodlossRate; + return stream.str(); +} diff --git a/extensions/medical/OpenWound.h b/extensions/medical/OpenWound.h new file mode 100644 index 0000000000..770004d917 --- /dev/null +++ b/extensions/medical/OpenWound.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +namespace ace { + namespace medical { + namespace injuries { + class OpenWound + { + public: + OpenWound(unsigned int anID, unsigned int aBodyPart, unsigned int bloodloss); + ~OpenWound(); + + std::string AsString(); + + unsigned int classID; + unsigned int bodyPart; + unsigned int bloodlossRate; + }; + + } + } +} diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp new file mode 100644 index 0000000000..6695c5c50c --- /dev/null +++ b/extensions/medical/handleDamage.cpp @@ -0,0 +1,94 @@ +#include "handleDamage.h" +#include "OpenWound.h" +#include "DamageType.h" +#include "InjuryType.h" +#include + +using namespace ace::medical; + +handleDamage::handleDamage() +{ +} + + +handleDamage::~handleDamage() +{ +} + +/* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, signed int amountOfDamage, const std::string& typeOfDamage) +{ + std::vector wounds; + int selectionN = SelectionToNumber(selectionName); + if (selectionN >= 0) + { + std::vector> injuryTypeInfo = GetInjuryInfoFor(typeOfDamage); + } + + return wounds; +} + +/* static */ void handleDamage::AddDamageType(const std::vector& input) +{ + if (input.size() == 4) + { + std::string typeName = input[0]; + unsigned int minimalLethalDamage = std::stod(input[1]); + unsigned int minDamageThreshold = std::stod(input[2]); + unsigned int maxDamageThreshold = std::stod(input[3]); + + std::shared_ptr type(new injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, maxDamageThreshold)); + damageTypes.push_back(type); + } +} + +/* static */ void handleDamage::AddInjuryType(const std::vector& input) +{ + if (input.size() == 9) + { + // TODO parse arrays from string input + + int ID = std::stod(input[0]); + std::string className = input[1]; + std::vector allowedSelections; // input[2]; + unsigned int bloodLoss = std::stod(input[3]); + unsigned int pain = std::stod(input[4]); + + unsigned int minDamage = std::stod(input[5]); + unsigned int maxDamage = std::stod(input[6]); + std::vector possibleCauses; // input[7]; + std::string displayName = input[8]; + + std::shared_ptr type(new injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); + injuryTypes.push_back(type); + } +} + +/* static */ void handleDamage::FinalizeDefinitions() +{ + // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. + for each (std::shared_ptr damageType in damageTypes) + { + for each (std::shared_ptr injuryType in injuryTypes) + { + if (find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName) != injuryType->causes.end()) + { + damageType->possibleInjuries.push_back(injuryType); + } + } + } +} + +/* static */ int SelectionToNumber(const std::string& selectionName) +{ + // TODO use dynamic selections instead + std::vector selections = {"head", "body", "hand_l", "hand_r", "leg_l", "leg_r"}; + std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); + if (it != selections.end()) + { + return it - selections.begin(); + } + else + { + return -1; // TODO throw exception + } +} diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h new file mode 100644 index 0000000000..16aba8d791 --- /dev/null +++ b/extensions/medical/handleDamage.h @@ -0,0 +1,66 @@ +#pragma once + +#include +#include +#include + +namespace ace { + namespace medical { + + namespace injuries { + class DamageType; + class InjuryType; + class OpenWound; + } + + class handleDamage + { + public: + ~handleDamage(); + + /** + * + */ + static std::vector HandleDamageWounds(const std::string& selectionName, signed int amountOfDamage, const std::string& typeOfDamage); + + /** + * + */ + static void AddDamageType(const std::vector& sqfDamageTypeDefinition); + + /** + * + */ + static void AddInjuryType(const std::vector& sqfInjuryDefinition); + + /** + * + */ + static std::string SetInjuryTypeData(const std::string& data); + + + /** + * + */ + static int SelectionToNumber(const std::string& selectionName); + + /** + * + */ + static std::vector> GetInjuryInfoFor(const std::string& damageType); + + /** + * + */ + static void FinalizeDefinitions(); + + private: + handleDamage(); + + static std::vector> damageTypes; + static std::vector> injuryTypes; + static std::vector selections; + static std::vector hitPoints; + }; + } +} diff --git a/extensions/medical/medical.cpp b/extensions/medical/medical.cpp new file mode 100644 index 0000000000..4531db475a --- /dev/null +++ b/extensions/medical/medical.cpp @@ -0,0 +1,57 @@ +/* +* ace_medical.cpp +* +* Author: +* Glowbal +*/ + +#include "ace_common.h" +#include +#include +#include +#include "handleDamage.h" + +extern "C" { + __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); +}; + +std::vector parseExtensionInput(const std::string& input) +{ + std::istringstream ss(input); + std::string token; + + std::vector output; + while (std::getline(ss, token, ',')) { + output.push_back(token); + } + return output; +} + + +void __stdcall RVExtension(char *output, int outputSize, const char *function) { + if (!strcmp(function, "version")) { + strncpy(output, ACE_FULL_VERSION_STR, outputSize); + } + else + { + std::vector arguments = parseExtensionInput(function); + if (arguments.size > 0) + { + std::string command = arguments.at(0); + // can we not just use C++11? + if (command == "addInjuryType") { + + } + else if (command == "addDamageType") { + + } + else if (command == "getInjury") { + // ace::medical::handleDamage(); + } + } + std::string returnValue = ""; + strncpy(output, returnValue.c_str(), outputSize); + output[outputSize - 1] = '\0'; + } +} + From 92bca1f857ed9f45700b078108eeace749665c8e Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 4 May 2015 00:32:44 +0200 Subject: [PATCH 006/664] tabs --- extensions/medical/DamageType.cpp | 2 +- extensions/medical/DamageType.h | 32 ++++----- extensions/medical/InjuryType.cpp | 2 +- extensions/medical/InjuryType.h | 40 +++++------ extensions/medical/OpenWound.cpp | 6 +- extensions/medical/OpenWound.h | 28 ++++---- extensions/medical/handleDamage.cpp | 106 ++++++++++++++-------------- extensions/medical/handleDamage.h | 94 ++++++++++++------------ extensions/medical/medical.cpp | 60 ++++++++-------- 9 files changed, 185 insertions(+), 185 deletions(-) diff --git a/extensions/medical/DamageType.cpp b/extensions/medical/DamageType.cpp index 5fb9a4846d..5434d79e98 100644 --- a/extensions/medical/DamageType.cpp +++ b/extensions/medical/DamageType.cpp @@ -3,7 +3,7 @@ using namespace ace::medical; injuries::DamageType::DamageType(std::string aTypeName, unsigned int minimalLethalDamage, unsigned int minDamage, unsigned int maxDamage) - : typeName(aTypeName), minLethalDamage(minimalLethalDamage), minDamageThreshold(minDamage), maxDamageThreshold(maxDamage) + : typeName(aTypeName), minLethalDamage(minimalLethalDamage), minDamageThreshold(minDamage), maxDamageThreshold(maxDamage) { } diff --git a/extensions/medical/DamageType.h b/extensions/medical/DamageType.h index 7106588f03..449060070b 100644 --- a/extensions/medical/DamageType.h +++ b/extensions/medical/DamageType.h @@ -4,23 +4,23 @@ namespace ace { - namespace medical { - namespace injuries { - class InjuryType; + namespace medical { + namespace injuries { + class InjuryType; - class DamageType - { - public: - DamageType(std::string aTypeName, unsigned int minimalLethalDamage, unsigned int minDamageThreshold, unsigned int maxDamageThreshold); - ~DamageType(); + class DamageType + { + public: + DamageType(std::string aTypeName, unsigned int minimalLethalDamage, unsigned int minDamageThreshold, unsigned int maxDamageThreshold); + ~DamageType(); - std::string typeName; - unsigned int minLethalDamage; - unsigned int minDamageThreshold; - unsigned int maxDamageThreshold; + std::string typeName; + unsigned int minLethalDamage; + unsigned int minDamageThreshold; + unsigned int maxDamageThreshold; - std::vector> possibleInjuries; - }; - } - } + std::vector> possibleInjuries; + }; + } + } } diff --git a/extensions/medical/InjuryType.cpp b/extensions/medical/InjuryType.cpp index 07f902816f..22c04c4126 100644 --- a/extensions/medical/InjuryType.cpp +++ b/extensions/medical/InjuryType.cpp @@ -4,7 +4,7 @@ using namespace ace::medical; injuries::InjuryType::InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, signed int theBloodLoss, signed int thePain, signed int minimumDamage, signed int maximumDamage, std::vector& possibleCauses, std::string& aDisplayname) - : ID(anId), className(aClassname), selections(allowedSelections), bloodLoss(theBloodLoss), pain(thePain), minDamage(minimumDamage), maxDamage(maximumDamage), causes(possibleCauses), displayName(aDisplayname) + : ID(anId), className(aClassname), selections(allowedSelections), bloodLoss(theBloodLoss), pain(thePain), minDamage(minimumDamage), maxDamage(maximumDamage), causes(possibleCauses), displayName(aDisplayname) { } diff --git a/extensions/medical/InjuryType.h b/extensions/medical/InjuryType.h index 92766dd315..c03760b568 100644 --- a/extensions/medical/InjuryType.h +++ b/extensions/medical/InjuryType.h @@ -2,26 +2,26 @@ #include namespace ace { - namespace medical { - namespace injuries { - class DamageType; + namespace medical { + namespace injuries { + class DamageType; - class InjuryType - { - public: - InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, signed int theBloodLoss, signed int thePain, signed int minimumDamage, signed int maximumDamage, std::vector& possibleCauses, std::string& aDisplayname); - ~InjuryType(); + class InjuryType + { + public: + InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, signed int theBloodLoss, signed int thePain, signed int minimumDamage, signed int maximumDamage, std::vector& possibleCauses, std::string& aDisplayname); + ~InjuryType(); - signed int ID; - std::string className; - std::vector selections; - signed int bloodLoss; - signed int pain; - signed int minDamage; - signed int maxDamage; - std::vector causes; - std::string displayName; - }; - } - } + signed int ID; + std::string className; + std::vector selections; + signed int bloodLoss; + signed int pain; + signed int minDamage; + signed int maxDamage; + std::vector causes; + std::string displayName; + }; + } + } } \ No newline at end of file diff --git a/extensions/medical/OpenWound.cpp b/extensions/medical/OpenWound.cpp index 77e38a9359..b0d614e6be 100644 --- a/extensions/medical/OpenWound.cpp +++ b/extensions/medical/OpenWound.cpp @@ -13,7 +13,7 @@ injuries::OpenWound::~OpenWound() std::string injuries::OpenWound::AsString() { - std::stringstream stream; - stream << classID << "," << bodyPart << "," << 1 << "," << bloodlossRate; - return stream.str(); + std::stringstream stream; + stream << classID << "," << bodyPart << "," << 1 << "," << bloodlossRate; + return stream.str(); } diff --git a/extensions/medical/OpenWound.h b/extensions/medical/OpenWound.h index 770004d917..478e54a597 100644 --- a/extensions/medical/OpenWound.h +++ b/extensions/medical/OpenWound.h @@ -3,21 +3,21 @@ #include namespace ace { - namespace medical { - namespace injuries { - class OpenWound - { - public: - OpenWound(unsigned int anID, unsigned int aBodyPart, unsigned int bloodloss); - ~OpenWound(); + namespace medical { + namespace injuries { + class OpenWound + { + public: + OpenWound(unsigned int anID, unsigned int aBodyPart, unsigned int bloodloss); + ~OpenWound(); - std::string AsString(); + std::string AsString(); - unsigned int classID; - unsigned int bodyPart; - unsigned int bloodlossRate; - }; + unsigned int classID; + unsigned int bodyPart; + unsigned int bloodlossRate; + }; - } - } + } + } } diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 6695c5c50c..60fbe83012 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -17,78 +17,78 @@ handleDamage::~handleDamage() /* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, signed int amountOfDamage, const std::string& typeOfDamage) { - std::vector wounds; - int selectionN = SelectionToNumber(selectionName); - if (selectionN >= 0) - { - std::vector> injuryTypeInfo = GetInjuryInfoFor(typeOfDamage); - } + std::vector wounds; + int selectionN = SelectionToNumber(selectionName); + if (selectionN >= 0) + { + std::vector> injuryTypeInfo = GetInjuryInfoFor(typeOfDamage); + } - return wounds; + return wounds; } /* static */ void handleDamage::AddDamageType(const std::vector& input) { - if (input.size() == 4) - { - std::string typeName = input[0]; - unsigned int minimalLethalDamage = std::stod(input[1]); - unsigned int minDamageThreshold = std::stod(input[2]); - unsigned int maxDamageThreshold = std::stod(input[3]); + if (input.size() == 4) + { + std::string typeName = input[0]; + unsigned int minimalLethalDamage = std::stod(input[1]); + unsigned int minDamageThreshold = std::stod(input[2]); + unsigned int maxDamageThreshold = std::stod(input[3]); - std::shared_ptr type(new injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, maxDamageThreshold)); - damageTypes.push_back(type); - } + std::shared_ptr type(new injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, maxDamageThreshold)); + damageTypes.push_back(type); + } } /* static */ void handleDamage::AddInjuryType(const std::vector& input) { - if (input.size() == 9) - { - // TODO parse arrays from string input + if (input.size() == 9) + { + // TODO parse arrays from string input - int ID = std::stod(input[0]); - std::string className = input[1]; - std::vector allowedSelections; // input[2]; - unsigned int bloodLoss = std::stod(input[3]); - unsigned int pain = std::stod(input[4]); + int ID = std::stod(input[0]); + std::string className = input[1]; + std::vector allowedSelections; // input[2]; + unsigned int bloodLoss = std::stod(input[3]); + unsigned int pain = std::stod(input[4]); - unsigned int minDamage = std::stod(input[5]); - unsigned int maxDamage = std::stod(input[6]); - std::vector possibleCauses; // input[7]; - std::string displayName = input[8]; + unsigned int minDamage = std::stod(input[5]); + unsigned int maxDamage = std::stod(input[6]); + std::vector possibleCauses; // input[7]; + std::string displayName = input[8]; - std::shared_ptr type(new injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); - injuryTypes.push_back(type); - } + std::shared_ptr type(new injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); + injuryTypes.push_back(type); + } } /* static */ void handleDamage::FinalizeDefinitions() { - // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. - for each (std::shared_ptr damageType in damageTypes) - { - for each (std::shared_ptr injuryType in injuryTypes) - { - if (find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName) != injuryType->causes.end()) - { - damageType->possibleInjuries.push_back(injuryType); - } - } - } + // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. + for each (std::shared_ptr damageType in damageTypes) + { + for each (std::shared_ptr injuryType in injuryTypes) + { + if (find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName) != injuryType->causes.end()) + { + damageType->possibleInjuries.push_back(injuryType); + } + } + } } /* static */ int SelectionToNumber(const std::string& selectionName) { - // TODO use dynamic selections instead - std::vector selections = {"head", "body", "hand_l", "hand_r", "leg_l", "leg_r"}; - std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); - if (it != selections.end()) - { - return it - selections.begin(); - } - else - { - return -1; // TODO throw exception - } + // TODO use dynamic selections instead + std::vector selections = {"head", "body", "hand_l", "hand_r", "leg_l", "leg_r"}; + std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); + if (it != selections.end()) + { + return it - selections.begin(); + } + else + { + return -1; // TODO throw exception + } } diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h index 16aba8d791..c62aa88e5f 100644 --- a/extensions/medical/handleDamage.h +++ b/extensions/medical/handleDamage.h @@ -5,62 +5,62 @@ #include namespace ace { - namespace medical { + namespace medical { - namespace injuries { - class DamageType; - class InjuryType; - class OpenWound; - } + namespace injuries { + class DamageType; + class InjuryType; + class OpenWound; + } - class handleDamage - { - public: - ~handleDamage(); + class handleDamage + { + public: + ~handleDamage(); - /** - * - */ - static std::vector HandleDamageWounds(const std::string& selectionName, signed int amountOfDamage, const std::string& typeOfDamage); + /** + * + */ + static std::vector HandleDamageWounds(const std::string& selectionName, signed int amountOfDamage, const std::string& typeOfDamage); - /** - * - */ - static void AddDamageType(const std::vector& sqfDamageTypeDefinition); + /** + * + */ + static void AddDamageType(const std::vector& sqfDamageTypeDefinition); - /** - * - */ - static void AddInjuryType(const std::vector& sqfInjuryDefinition); + /** + * + */ + static void AddInjuryType(const std::vector& sqfInjuryDefinition); - /** - * - */ - static std::string SetInjuryTypeData(const std::string& data); + /** + * + */ + static std::string SetInjuryTypeData(const std::string& data); - /** - * - */ - static int SelectionToNumber(const std::string& selectionName); + /** + * + */ + static int SelectionToNumber(const std::string& selectionName); - /** - * - */ - static std::vector> GetInjuryInfoFor(const std::string& damageType); + /** + * + */ + static std::vector> GetInjuryInfoFor(const std::string& damageType); - /** - * - */ - static void FinalizeDefinitions(); + /** + * + */ + static void FinalizeDefinitions(); - private: - handleDamage(); - - static std::vector> damageTypes; - static std::vector> injuryTypes; - static std::vector selections; - static std::vector hitPoints; - }; - } + private: + handleDamage(); + + static std::vector> damageTypes; + static std::vector> injuryTypes; + static std::vector selections; + static std::vector hitPoints; + }; + } } diff --git a/extensions/medical/medical.cpp b/extensions/medical/medical.cpp index 4531db475a..3e452b751f 100644 --- a/extensions/medical/medical.cpp +++ b/extensions/medical/medical.cpp @@ -12,46 +12,46 @@ #include "handleDamage.h" extern "C" { - __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); + __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); }; std::vector parseExtensionInput(const std::string& input) { - std::istringstream ss(input); - std::string token; + std::istringstream ss(input); + std::string token; - std::vector output; - while (std::getline(ss, token, ',')) { - output.push_back(token); - } - return output; + std::vector output; + while (std::getline(ss, token, ',')) { + output.push_back(token); + } + return output; } void __stdcall RVExtension(char *output, int outputSize, const char *function) { - if (!strcmp(function, "version")) { - strncpy(output, ACE_FULL_VERSION_STR, outputSize); - } - else - { - std::vector arguments = parseExtensionInput(function); - if (arguments.size > 0) - { - std::string command = arguments.at(0); - // can we not just use C++11? - if (command == "addInjuryType") { + if (!strcmp(function, "version")) { + strncpy(output, ACE_FULL_VERSION_STR, outputSize); + } + else + { + std::vector arguments = parseExtensionInput(function); + if (arguments.size > 0) + { + std::string command = arguments.at(0); + // can we not just use C++11? + if (command == "addInjuryType") { - } - else if (command == "addDamageType") { + } + else if (command == "addDamageType") { - } - else if (command == "getInjury") { - // ace::medical::handleDamage(); - } - } - std::string returnValue = ""; - strncpy(output, returnValue.c_str(), outputSize); - output[outputSize - 1] = '\0'; - } + } + else if (command == "getInjury") { + // ace::medical::handleDamage(); + } + } + std::string returnValue = ""; + strncpy(output, returnValue.c_str(), outputSize); + output[outputSize - 1] = '\0'; + } } From f7ff4a2f36de32b107d7a0a1ce9b7d1d07f107c8 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 10 May 2015 14:59:53 -0500 Subject: [PATCH 007/664] Base Device Handler Framework Multiple devices share Home/Ctrl-home keys --- addons/common/XEH_postInit.sqf | 36 +++++++++++++++++++ addons/common/XEH_preInit.sqf | 2 ++ .../functions/fnc_deviceKeyFindValidIndex.sqf | 13 +++++++ .../functions/fnc_deviceKeyRegisterNew.sqf | 6 ++++ addons/microdagr/XEH_clientInit.sqf | 21 +++++++++-- 5 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 addons/common/functions/fnc_deviceKeyFindValidIndex.sqf create mode 100644 addons/common/functions/fnc_deviceKeyRegisterNew.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 696aa16f9b..d19958bd57 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -249,3 +249,39 @@ if(isMultiplayer && { time > 0 || isNull player } ) then { }; }, 0, []] call cba_fnc_addPerFrameHandler; }; + +//Device Handler: +GVAR(deviceKeyHandlingArray) = []; +GVAR(deviceKeyCurrentIndex) = -1; + +["ACE3 Equipment", QGVAR(openDevice), "Open Device", //(localize "STR_ACE_microdagr_toggleUnit"), +{ + [] call FUNC(deviceKeyFindValidIndex); + if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; + [] call ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 3); + true; +}, +{false}, +[0xC7, [false, false, false]], false] call cba_fnc_addKeybind; //Home Key + +["ACE3 Equipment", QGVAR(closeDevice), "Close Device", //(localize "STR_ACE_microdagr_toggleUnit"), +{ + [] call FUNC(deviceKeyFindValidIndex); + if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; + [] call ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 4); +}, +{false}, +[0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key + +["ACE3 Equipment", QGVAR(cycleDevice), "Cycle Devices", //(localize "STR_ACE_microdagr_toggleUnit"), +{ + systemChat "here"; + [1] call FUNC(deviceKeyFindValidIndex); + if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; + _displayName = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 0); + _iconImage = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 1); + systemChat str [_displayName, _iconImage]; + [_displayName, _iconImage] call FUNC(displayTextPicture); +}, +{false}, +[0xC7, [true, false, false]], false] call cba_fnc_addKeybind; //SHIFT + Home Key diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 5c2ad1e592..4bedd36513 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -33,6 +33,8 @@ PREP(currentChannel); PREP(debug); PREP(debugModule); PREP(defineVariable); +PREP(deviceKeyFindValidIndex); +PREP(deviceKeyRegisterNew); PREP(disableAI); PREP(disableUserInput); PREP(displayIcon); diff --git a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf new file mode 100644 index 0000000000..19069b1821 --- /dev/null +++ b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf @@ -0,0 +1,13 @@ + +#include "script_component.hpp" + +DEFAULT_PARAM(0,_offsetBy,0); + +_validIndex = -1; +for "_offset" from _offsetBy to ((count GVAR(deviceKeyHandlingArray)) - 1 + _offsetBy) do { + _realIndex = (GVAR(deviceKeyCurrentIndex) + _offset) % (count GVAR(deviceKeyHandlingArray)); + if ([] call ((GVAR(deviceKeyHandlingArray) select _realIndex) select 2)) exitWith { + _validIndex = _realIndex; + }; +}; +GVAR(deviceKeyCurrentIndex) = _validIndex; diff --git a/addons/common/functions/fnc_deviceKeyRegisterNew.sqf b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf new file mode 100644 index 0000000000..0b8ab0761c --- /dev/null +++ b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf @@ -0,0 +1,6 @@ + +#include "script_component.hpp" +PARAMS_5(_displayName,_iconImage,_conditionCode,_toggleCode,_closeCode); + +GVAR(deviceKeyHandlingArray) pushBack [_displayName,_iconImage,_conditionCode,_toggleCode,_closeCode]; +[] call FUNC(deviceKeyFindValidIndex); diff --git a/addons/microdagr/XEH_clientInit.sqf b/addons/microdagr/XEH_clientInit.sqf index 587bf85ef5..339e0bf112 100644 --- a/addons/microdagr/XEH_clientInit.sqf +++ b/addons/microdagr/XEH_clientInit.sqf @@ -3,7 +3,24 @@ if (!hasInterface) exitWith {}; -//Add Keybinds: +_conditonCode = { +("ACE_microDAGR" in (items ace_player)) +}; +_toggleCode = { + if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + [] call FUNC(openDisplay); //toggle display mode + true +}; +_closeCode = { + if (GVAR(currentShowMode) == DISPLAY_MODE_CLOSED) exitWith {false}; + [DISPLAY_MODE_CLOSED] call FUNC(openDisplay); + true +}; + +["Mdagr", "", _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); + + +/* //Add Keybinds: ["ACE3 Equipment", QGVAR(openGPS), (localize "STR_ACE_microdagr_toggleUnit"), { // canInteractWith (can use on map) @@ -29,7 +46,7 @@ if (!hasInterface) exitWith {}; true; }, {false}, -[0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key +[0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key */ //Add Eventhandler: ["RangerfinderData", {_this call FUNC(recieveRangefinderData)}] call EFUNC(common,addEventHandler); From 05f1b884fac792df117947ab6fce4c238d5099e9 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 10 May 2015 15:17:50 -0500 Subject: [PATCH 008/664] Localization/ headers --- addons/common/XEH_postInit.sqf | 8 ++--- .../functions/fnc_deviceKeyFindValidIndex.sqf | 16 ++++++++- .../functions/fnc_deviceKeyRegisterNew.sqf | 21 ++++++++++- addons/common/stringtable.xml | 11 +++++- addons/microdagr/XEH_clientInit.sqf | 36 +++---------------- 5 files changed, 52 insertions(+), 40 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index d19958bd57..ade35855ea 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -254,7 +254,7 @@ if(isMultiplayer && { time > 0 || isNull player } ) then { GVAR(deviceKeyHandlingArray) = []; GVAR(deviceKeyCurrentIndex) = -1; -["ACE3 Equipment", QGVAR(openDevice), "Open Device", //(localize "STR_ACE_microdagr_toggleUnit"), +["ACE3 Equipment", QGVAR(openDevice), (localize "STR_ACE_Common_toggleHandheldDevice"), { [] call FUNC(deviceKeyFindValidIndex); if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; @@ -264,7 +264,7 @@ GVAR(deviceKeyCurrentIndex) = -1; {false}, [0xC7, [false, false, false]], false] call cba_fnc_addKeybind; //Home Key -["ACE3 Equipment", QGVAR(closeDevice), "Close Device", //(localize "STR_ACE_microdagr_toggleUnit"), +["ACE3 Equipment", QGVAR(closeDevice), (localize "STR_ACE_Common_closeHandheldDevice"), { [] call FUNC(deviceKeyFindValidIndex); if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; @@ -273,14 +273,12 @@ GVAR(deviceKeyCurrentIndex) = -1; {false}, [0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key -["ACE3 Equipment", QGVAR(cycleDevice), "Cycle Devices", //(localize "STR_ACE_microdagr_toggleUnit"), +["ACE3 Equipment", QGVAR(cycleDevice), (localize "STR_ACE_Common_cycleHandheldDevices"), { - systemChat "here"; [1] call FUNC(deviceKeyFindValidIndex); if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; _displayName = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 0); _iconImage = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 1); - systemChat str [_displayName, _iconImage]; [_displayName, _iconImage] call FUNC(displayTextPicture); }, {false}, diff --git a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf index 19069b1821..431761bae1 100644 --- a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf +++ b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf @@ -1,4 +1,18 @@ - +/* + * Author: PabstMirror + * Finds next valid index for the device array. + * + * Arguments: + * 0: Offset from currentIndex (use 1 to find next valid) + * + * Return Value: + * Nothing + * + * Example: + * [] call ace_common_fnc_deviceKeyFindValidIndex + * + * Public: No + */ #include "script_component.hpp" DEFAULT_PARAM(0,_offsetBy,0); diff --git a/addons/common/functions/fnc_deviceKeyRegisterNew.sqf b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf index 0b8ab0761c..6a15c3c340 100644 --- a/addons/common/functions/fnc_deviceKeyRegisterNew.sqf +++ b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf @@ -1,5 +1,24 @@ - +/* + * Author: PabstMirror + * Finds next valid index for the device array. + * + * Arguments: + * 0: Localized Device Display Name + * 1: Image + * 2: Condtion Code (do they have the device) + * 3: Toggle Code (on home press) + * 4: Close Code (on ctrl-home press) + * + * Return Value: + * Nothing + * + * Example: + * [(localize "STR_ACE_microdagr_itemName"), QUOTE(PATHTOF(images\microDAGR_item.paa)), _conditonCode, _toggleCode, _closeCode] call ace_common_fnc_deviceKeyRegisterNew + * + * Public: No + */ #include "script_component.hpp" + PARAMS_5(_displayName,_iconImage,_conditionCode,_toggleCode,_closeCode); GVAR(deviceKeyHandlingArray) pushBack [_displayName,_iconImage,_conditionCode,_toggleCode,_closeCode]; diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 8d28704362..3b1e5dbc76 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -470,5 +470,14 @@ Une banane est un fruit qui, d'un point de vue botanique, fait partie du groupe des baies. Produite par plusieurs sortes de grandes plantes à fleurs herbacées du type Musa. A banana é uma fruta comestível, botanicamente uma baga, produzida por vários tipos de plantas herbáceas grandes do genero Musa. + + Toggle Device + + + Close Device + + + Cycle Devices + - + \ No newline at end of file diff --git a/addons/microdagr/XEH_clientInit.sqf b/addons/microdagr/XEH_clientInit.sqf index 339e0bf112..0569256df3 100644 --- a/addons/microdagr/XEH_clientInit.sqf +++ b/addons/microdagr/XEH_clientInit.sqf @@ -3,8 +3,10 @@ if (!hasInterface) exitWith {}; +//Add deviceKey entry: +private ["_conditonCode", "_toggleCode", "_closeCode"]; _conditonCode = { -("ACE_microDAGR" in (items ace_player)) + ("ACE_microDAGR" in (items ace_player)) }; _toggleCode = { if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -16,37 +18,7 @@ _closeCode = { [DISPLAY_MODE_CLOSED] call FUNC(openDisplay); true }; - -["Mdagr", "", _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); - - -/* //Add Keybinds: -["ACE3 Equipment", QGVAR(openGPS), (localize "STR_ACE_microdagr_toggleUnit"), -{ - // canInteractWith (can use on map) - if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!("ACE_microDAGR" in (items ace_player))) exitWith {false}; - - [] call FUNC(openDisplay); //toggle display mode - true; -}, -{false}, -[0xC7, [false, false, false]], false] call cba_fnc_addKeybind; //Home Key - -["ACE3 Equipment", QGVAR(closeGPS), (localize "STR_ACE_microdagr_closeUnit"), -{ - // canInteractWith (can use on map) - if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!("ACE_microDAGR" in (items ace_player))) exitWith {false}; - if (GVAR(currentShowMode) == DISPLAY_MODE_CLOSED) exitWith {false}; - - [DISPLAY_MODE_CLOSED] call FUNC(openDisplay); //close unit - true; -}, -{false}, -[0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key */ +[(localize "STR_ACE_microdagr_itemName"), QUOTE(PATHTOF(images\microDAGR_item.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); //Add Eventhandler: ["RangerfinderData", {_this call FUNC(recieveRangefinderData)}] call EFUNC(common,addEventHandler); From 57d6ad988b1c85846c4dffbb853fd116cdd14227 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 10 May 2015 16:54:24 -0500 Subject: [PATCH 009/664] Kestral WIP --- .../functions/fnc_deviceKeyFindValidIndex.sqf | 15 ++++++++----- addons/kestrel4500/initKeybinds.sqf | 21 +++++++++---------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf index 431761bae1..f9ac89a30b 100644 --- a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf +++ b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf @@ -6,7 +6,7 @@ * 0: Offset from currentIndex (use 1 to find next valid) * * Return Value: - * Nothing + * The new index (-1 if no valid) * * Example: * [] call ace_common_fnc_deviceKeyFindValidIndex @@ -18,10 +18,15 @@ DEFAULT_PARAM(0,_offsetBy,0); _validIndex = -1; -for "_offset" from _offsetBy to ((count GVAR(deviceKeyHandlingArray)) - 1 + _offsetBy) do { - _realIndex = (GVAR(deviceKeyCurrentIndex) + _offset) % (count GVAR(deviceKeyHandlingArray)); - if ([] call ((GVAR(deviceKeyHandlingArray) select _realIndex) select 2)) exitWith { - _validIndex = _realIndex; +if ((count GVAR(deviceKeyHandlingArray)) > 0) then { + if (GVAR(deviceKeyCurrentIndex) == -1) then {GVAR(deviceKeyCurrentIndex) = 0;}; + for "_offset" from _offsetBy to ((count GVAR(deviceKeyHandlingArray)) - 1 + _offsetBy) do { + _realIndex = (GVAR(deviceKeyCurrentIndex) + _offset) % (count GVAR(deviceKeyHandlingArray)); + if ([] call ((GVAR(deviceKeyHandlingArray) select _realIndex) select 2)) exitWith { + _validIndex = _realIndex; + }; }; }; + GVAR(deviceKeyCurrentIndex) = _validIndex; +_validIndex diff --git a/addons/kestrel4500/initKeybinds.sqf b/addons/kestrel4500/initKeybinds.sqf index f910bdf552..9096b7c897 100644 --- a/addons/kestrel4500/initKeybinds.sqf +++ b/addons/kestrel4500/initKeybinds.sqf @@ -1,5 +1,9 @@ -["ACE3 Equipment", QGVAR(KestrelDialogKey), localize "STR_ACE_Kestrel4500_KestrelDialogKey", -{ +//Add deviceKey entry: +private ["_conditonCode", "_toggleCode", "_closeCode"]; +_conditonCode = { + [] call FUNC(canShow); +}; +_toggleCode = { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; if(GVAR(Kestrel4500)) exitWith { false }; @@ -7,18 +11,13 @@ // Statement [] call FUNC(createKestrelDialog); false -}, -{false}, -[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) - -["ACE3 Equipment", QGVAR(DisplayKestrelKey), localize "STR_ACE_Kestrel4500_DisplayKestrelKey", -{ +}; +_closeCode = { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement [] call FUNC(displayKestrel); false -}, -{false}, -[0, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) +}; +[(localize "STR_ACE_Kestrel_Name"), QUOTE(PATHTOF(UI\Kestrel4500.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); \ No newline at end of file From ffce1f6386b0f23cd89845d3843b7cd72fab0572 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 11 May 2015 21:49:13 -0500 Subject: [PATCH 010/664] Condense mDagr interactions - intergrate kestral --- .../functions/fnc_deviceKeyFindValidIndex.sqf | 31 +++++++++---- .../functions/fnc_deviceKeyRegisterNew.sqf | 2 +- addons/kestrel4500/initKeybinds.sqf | 25 +++++++--- addons/microdagr/CfgVehicles.hpp | 46 ++++++++++--------- 4 files changed, 66 insertions(+), 38 deletions(-) diff --git a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf index f9ac89a30b..a8418cd4cd 100644 --- a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf +++ b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf @@ -3,30 +3,43 @@ * Finds next valid index for the device array. * * Arguments: - * 0: Offset from currentIndex (use 1 to find next valid) + * 0: Offset from currentIndex (use 1 to find next valid after current) or a displayName string or * * Return Value: * The new index (-1 if no valid) * * Example: * [] call ace_common_fnc_deviceKeyFindValidIndex + * ["kestral4500"] call ace_common_fnc_deviceKeyFindValidIndex * * Public: No */ #include "script_component.hpp" -DEFAULT_PARAM(0,_offsetBy,0); +DEFAULT_PARAM(0,_searchOffsetOrName,0); + +private ["_validIndex", "_offsetBy", "_realIndex", "_offset"]; _validIndex = -1; -if ((count GVAR(deviceKeyHandlingArray)) > 0) then { - if (GVAR(deviceKeyCurrentIndex) == -1) then {GVAR(deviceKeyCurrentIndex) = 0;}; - for "_offset" from _offsetBy to ((count GVAR(deviceKeyHandlingArray)) - 1 + _offsetBy) do { - _realIndex = (GVAR(deviceKeyCurrentIndex) + _offset) % (count GVAR(deviceKeyHandlingArray)); - if ([] call ((GVAR(deviceKeyHandlingArray) select _realIndex) select 2)) exitWith { - _validIndex = _realIndex; + +if ((typeName _searchOffsetOrName) == "STRING") then { + { + if ((_x select 0) == _searchOffsetOrName) exitWith { + _validIndex = _forEachIndex; + }; + } forEach GVAR(deviceKeyHandlingArray); +} else { + if ((count GVAR(deviceKeyHandlingArray)) > 0) then { + _baseIndex = if (GVAR(deviceKeyCurrentIndex) == -1) then {0} else {GVAR(deviceKeyCurrentIndex) + _searchOffsetOrName}; + for "_offset" from _baseIndex to ((count GVAR(deviceKeyHandlingArray)) - 1 + _baseIndex) do { + _realIndex = _offset % (count GVAR(deviceKeyHandlingArray)); + if ([] call ((GVAR(deviceKeyHandlingArray) select _realIndex) select 2)) exitWith { + _validIndex = _realIndex; + }; }; }; }; GVAR(deviceKeyCurrentIndex) = _validIndex; -_validIndex + +GVAR(deviceKeyCurrentIndex) diff --git a/addons/common/functions/fnc_deviceKeyRegisterNew.sqf b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf index 6a15c3c340..88ffa84af7 100644 --- a/addons/common/functions/fnc_deviceKeyRegisterNew.sqf +++ b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf @@ -13,7 +13,7 @@ * Nothing * * Example: - * [(localize "STR_ACE_microdagr_itemName"), QUOTE(PATHTOF(images\microDAGR_item.paa)), _conditonCode, _toggleCode, _closeCode] call ace_common_fnc_deviceKeyRegisterNew + * [(localize "STR_ACE_microdagr_itemName"), QUOTE(PATHTOF(images\microDAGR_item.paa)), _conditionCode, _toggleCode, _closeCode] call ace_common_fnc_deviceKeyRegisterNew * * Public: No */ diff --git a/addons/kestrel4500/initKeybinds.sqf b/addons/kestrel4500/initKeybinds.sqf index 9096b7c897..c9c8d1b69b 100644 --- a/addons/kestrel4500/initKeybinds.sqf +++ b/addons/kestrel4500/initKeybinds.sqf @@ -6,18 +6,31 @@ _conditonCode = { _toggleCode = { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; - if(GVAR(Kestrel4500)) exitWith { false }; // Statement - [] call FUNC(createKestrelDialog); - false + if (!GVAR(Overlay)) then { + //If no overlay, show it: + [] call FUNC(displayKestrel); + } else { + //If overlay is up, switch to dialog: + [] call FUNC(createKestrelDialog); + }; }; _closeCode = { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; - + // Statement - [] call FUNC(displayKestrel); + if (GVAR(Overlay)) then { + //If dispaly is open, close it: + GVAR(Overlay) = false; + }; + if (dialog && {!isNull (uiNamespace getVariable ["Kestrel4500_Display", displayNull])}) then { + //If dialog is open, close it: + GVAR(Kestrel4500) = false; + closeDialog 0; + }; false }; -[(localize "STR_ACE_Kestrel_Name"), QUOTE(PATHTOF(UI\Kestrel4500.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); \ No newline at end of file + +[(localize "STR_ACE_Kestrel_Name"), QUOTE(PATHTOF(UI\Kestrel4500.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); diff --git a/addons/microdagr/CfgVehicles.hpp b/addons/microdagr/CfgVehicles.hpp index 833f7bd2f6..fe803a2ae4 100644 --- a/addons/microdagr/CfgVehicles.hpp +++ b/addons/microdagr/CfgVehicles.hpp @@ -3,34 +3,36 @@ class CfgVehicles { class CAManBase: Man { class ACE_SelfActions { class ACE_Equipment { - class GVAR(show) { - //Opens the mini map - displayName = "$STR_ACE_microdagr_show"; - condition = QUOTE(([DISPLAY_MODE_DISPLAY] call FUNC(canShow)) && {GVAR(currentShowMode) != DISPLAY_MODE_DISPLAY}); - statement = QUOTE([DISPLAY_MODE_DISPLAY] call FUNC(openDisplay)); - showDisabled = 0; - priority = 0.2; - icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; - }; class GVAR(configure) { - //Opens the dialog + //Opens the interactive dialog displayName = "$STR_ACE_microdagr_configure"; - condition = QUOTE(([DISPLAY_MODE_DIALOG] call FUNC(canShow)) && {GVAR(currentShowMode) != DISPLAY_MODE_DIALOG}); + condition = QUOTE([DISPLAY_MODE_DIALOG] call FUNC(canShow)); statement = QUOTE([DISPLAY_MODE_DIALOG] call FUNC(openDisplay)); showDisabled = 0; priority = 0.1; icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); exceptions[] = {"notOnMap", "isNotInside"}; - }; - class GVAR(close) { - displayName = "$STR_ACE_microdagr_closeUnit"; - condition = QUOTE(GVAR(currentShowMode) != DISPLAY_MODE_CLOSED); - statement = QUOTE([DISPLAY_MODE_CLOSED] call FUNC(openDisplay)); - showDisabled = 0; - priority = 0.3; - icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; + + //Sub Actions: + class GVAR(show) { + //Opens the background display (minimap) + displayName = "$STR_ACE_microdagr_show"; + condition = QUOTE(([DISPLAY_MODE_DISPLAY] call FUNC(canShow)) && {GVAR(currentShowMode) != DISPLAY_MODE_DISPLAY}); + statement = QUOTE([DISPLAY_MODE_DISPLAY] call FUNC(openDisplay)); + showDisabled = 0; + priority = 0.2; + icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); + exceptions[] = {"notOnMap", "isNotInside"}; + }; + class GVAR(close) { + displayName = "$STR_ACE_microdagr_closeUnit"; + condition = QUOTE(GVAR(currentShowMode) != DISPLAY_MODE_CLOSED); + statement = QUOTE([DISPLAY_MODE_CLOSED] call FUNC(openDisplay)); + showDisabled = 0; + priority = 0.3; + icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); + exceptions[] = {"notOnMap", "isNotInside"}; + }; }; }; }; @@ -66,7 +68,7 @@ class CfgVehicles { description = "Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap.
Source: microDAGR.pbo"; }; }; - + class Box_NATO_Support_F; class ACE_Box_Misc: Box_NATO_Support_F { class TransportItems { From de2a89613ce69ce9ff160943ac47a1d1776f31a4 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 11 May 2015 22:22:24 -0500 Subject: [PATCH 011/664] ATragMX --- addons/atragmx/initKeybinds.sqf | 19 +++++++++++----- addons/common/stringtable.xml | 6 ++--- addons/kestrel4500/CfgVehicles.hpp | 36 +++++++++++++++--------------- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/addons/atragmx/initKeybinds.sqf b/addons/atragmx/initKeybinds.sqf index 8bc37752f3..64802997d9 100644 --- a/addons/atragmx/initKeybinds.sqf +++ b/addons/atragmx/initKeybinds.sqf @@ -1,11 +1,20 @@ -["ACE3 Equipment", QGVAR(ATragMXDialogKey), localize "STR_ACE_ATragMX_ATragMXDialogKey", -{ +//Add deviceKey entry: +private ["_conditonCode", "_toggleCode", "_closeCode"]; +_conditonCode = { + ("ACE_ATragMX" in (uniformItems ACE_player)) || {"ACE_ATragMX" in (vestItems ACE_player)} +}; +_toggleCode = { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; if (GVAR(active)) exitWith {false}; // Statement [] call FUNC(create_dialog); false -}, -{false}, -[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) \ No newline at end of file +}; +_closeCode = { + if (dialog && {!isNull (uiNamespace getVariable ["ATragMX_Display", displayNull])}) then { + closeDialog 0; + }; +}; + +[(localize "STR_ACE_ATragMX_Name"), QUOTE(PATHTOF(UI\ATRAG_Icon.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 3b1e5dbc76..0f05274109 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -471,13 +471,13 @@ A banana é uma fruta comestível, botanicamente uma baga, produzida por vários tipos de plantas herbáceas grandes do genero Musa. - Toggle Device + Toggle Handheld Device - Close Device + Close Handheld Device - Cycle Devices + Cycle Handheld Devices \ No newline at end of file diff --git a/addons/kestrel4500/CfgVehicles.hpp b/addons/kestrel4500/CfgVehicles.hpp index 20d8bf5b62..ab7fefa3a5 100644 --- a/addons/kestrel4500/CfgVehicles.hpp +++ b/addons/kestrel4500/CfgVehicles.hpp @@ -10,25 +10,25 @@ class CfgVehicles { showDisabled = 0; priority = 0.1; icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); - exceptions[] = {"notOnMap"}; - }; - class GVAR(show) { - displayName = "$STR_ACE_Kestrel4500_ShowKestrel"; - condition = QUOTE(call FUNC(canShow) && !GVAR(Overlay)); - statement = QUOTE(call FUNC(displayKestrel)); - showDisabled = 0; - priority = 0.2; - icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; - }; - class GVAR(hide) { - displayName = "$STR_ACE_Kestrel4500_HideKestrel"; - condition = QUOTE(GVAR(Overlay)); - statement = QUOTE(call FUNC(displayKestrel)); - showDisabled = 0; - priority = 0.3; - icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); exceptions[] = {"notOnMap", "isNotInside"}; + class GVAR(show) { + displayName = "$STR_ACE_Kestrel4500_ShowKestrel"; + condition = QUOTE(call FUNC(canShow) && !GVAR(Overlay)); + statement = QUOTE(call FUNC(displayKestrel)); + showDisabled = 0; + priority = 0.2; + icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); + exceptions[] = {"notOnMap", "isNotInside"}; + }; + class GVAR(hide) { + displayName = "$STR_ACE_Kestrel4500_HideKestrel"; + condition = QUOTE(GVAR(Overlay)); + statement = QUOTE(call FUNC(displayKestrel)); + showDisabled = 0; + priority = 0.3; + icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); + exceptions[] = {"notOnMap", "isNotInside"}; + }; }; }; }; From 043fee03bdf7d7a3227bf9fa6e247a246636becb Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 11 May 2015 22:48:03 -0500 Subject: [PATCH 012/664] Return Valid bool for keybind --- addons/common/XEH_postInit.sqf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index ade35855ea..aa5e6ba5d8 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -259,7 +259,7 @@ GVAR(deviceKeyCurrentIndex) = -1; [] call FUNC(deviceKeyFindValidIndex); if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; [] call ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 3); - true; + true }, {false}, [0xC7, [false, false, false]], false] call cba_fnc_addKeybind; //Home Key @@ -269,6 +269,7 @@ GVAR(deviceKeyCurrentIndex) = -1; [] call FUNC(deviceKeyFindValidIndex); if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; [] call ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 4); + true }, {false}, [0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key @@ -280,6 +281,7 @@ GVAR(deviceKeyCurrentIndex) = -1; _displayName = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 0); _iconImage = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 1); [_displayName, _iconImage] call FUNC(displayTextPicture); + true }, {false}, [0xC7, [true, false, false]], false] call cba_fnc_addKeybind; //SHIFT + Home Key From 54dcbb9ef4287fc1814b2556028021f769151369 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 12 May 2015 22:15:52 -0500 Subject: [PATCH 013/664] FCS - Privates --- addons/fcs/functions/fnc_getAngle.sqf | 4 ++-- addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf | 3 +++ addons/fcs/functions/fnc_keyUp.sqf | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/fcs/functions/fnc_getAngle.sqf b/addons/fcs/functions/fnc_getAngle.sqf index 03024d8b98..91150c110d 100644 --- a/addons/fcs/functions/fnc_getAngle.sqf +++ b/addons/fcs/functions/fnc_getAngle.sqf @@ -19,7 +19,7 @@ #include "script_component.hpp" #define PRECISION 0.1 -private ["_distance","_angleTarget","_maxElev","_initSpeed","_airFriction","_timeToLive","_timeToLive","_simulationStep","_angle","_posTargetX","_posTargetY","_posX","_posY","_velocityX","_velocityY","_velocityMagnitude"]; +private ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle1", "_angle2", "_it2", "_f1", "_f2", "_temp", "_it1", "_angle"]; _distance = _this select 0; _angleTarget = _this select 1; @@ -32,7 +32,7 @@ _simulationStep = _this select 6; if (_simulationStep == 0) exitWith {_angleTarget}; FUNC(traceBullet) = { - private ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle", "_posTargetX", "_posTargetY", "_posX", "_posY", "_velocityX", "_velocityY", "_velocityMagnitude"]; + private ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle", "_posTargetX", "_posTargetY", "_posX", "_posY", "_velocityX", "_velocityY", "_velocityMagnitude", "_i"]; _distance = _this select 0; _angleTarget = _this select 1; diff --git a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf index 31c2540790..899cf0da76 100644 --- a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf +++ b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf @@ -1,4 +1,7 @@ // by commy2 +#include "script_component.hpp" + +private ["_vehicle", "_projectile", "_zeroing", "_position", "_subMunition"]; _vehicle = _this select 0 select 0; _projectile = _this select 0 select 1; diff --git a/addons/fcs/functions/fnc_keyUp.sqf b/addons/fcs/functions/fnc_keyUp.sqf index a7bf8defe5..4e28f26a20 100644 --- a/addons/fcs/functions/fnc_keyUp.sqf +++ b/addons/fcs/functions/fnc_keyUp.sqf @@ -12,7 +12,7 @@ #include "script_component.hpp" -private ["_vehicle", "_turret", "_turretConfig", "_distance", "_weapons", "_magazines", "_showHint", "_playSound"]; +private ["_vehicle", "_turret", "_turretConfig", "_distance", "_weapons", "_magazines", "_showHint", "_playSound", "_i"]; _vehicle = _this select 0; _turret = _this select 1; From 8e842c694bafbdf273d622483706ecb9c910377c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 13 May 2015 14:05:13 -0500 Subject: [PATCH 014/664] Show Version and HTML on main menu --- addons/optionsmenu/gui/define.hpp | 3 + addons/optionsmenu/gui/pauseMenu.hpp | 65 ++++++++++++++++++- addons/optionsmenu/script_loadMainMenuBox.sqf | 25 +++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 addons/optionsmenu/script_loadMainMenuBox.sqf diff --git a/addons/optionsmenu/gui/define.hpp b/addons/optionsmenu/gui/define.hpp index cb4fe1b509..2a3fffc736 100644 --- a/addons/optionsmenu/gui/define.hpp +++ b/addons/optionsmenu/gui/define.hpp @@ -7,6 +7,9 @@ class ACE_gui_staticBase; class ACE_gui_listNBox; class ACE_gui_comboBoxBase; class RscXSliderH; +class RscControlsGroupNoScrollbars; +class RscHTML; +class RscText; #ifndef ACE_DEFINE_H diff --git a/addons/optionsmenu/gui/pauseMenu.hpp b/addons/optionsmenu/gui/pauseMenu.hpp index c4cbae9916..f85e6811c4 100644 --- a/addons/optionsmenu/gui/pauseMenu.hpp +++ b/addons/optionsmenu/gui/pauseMenu.hpp @@ -98,12 +98,75 @@ class RscDisplayInterruptEditor3D: RscStandardDisplay { class RscDisplayMain: RscStandardDisplay { //Hide the button if there is no world (-world=empty) //Seems odd to use onMouseMoving, but I don't want to overload onLoad - onMouseMoving = "((_this select 0) displayCtrl 80085) ctrlShow (missionName != '');"; + onMouseMoving = QUOTE(((_this select 0) displayCtrl 80085) ctrlShow (missionName != ''); _this execVM QUOTE(QUOTE(PATHTOF(script_loadMainMenuBox.sqf)));); + class controls { class ACE_Open_settingsMenu_Btn : ACE_Open_SettingsMenu_BtnBase { action = "if (missionName != '') then {createDialog 'ACE_settingsMenu';};"; y = "4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; idc = 80085; }; + + class ACE_news: RscControlsGroupNoScrollbars { + x = "safezoneX + safezoneW - (48 * ( ((safezoneW / safezoneH) min 1.2) / 40))"; + y = "safezoneY + (1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25))"; + idc = -1; + w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h = "20 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + class controls + { + class ACE_NewsTitle: RscText { + text = "ACE News"; + colorBackground[] = {(162/255),(28/255),(28/255),0.8}; + idc = -1; + x = "0 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + y = "0 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + }; + class ACE_NewsBackgroundDate: RscText + { + idc = 68; + x = "0 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + y = "1.1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + colorBackground[] = {0,0,0,0.4}; + }; + class ACE_NewsBackground: RscText { + idc = -1; + x = "0 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + y = "2.2 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h = "17.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + colorBackground[] = {0,0,0,0.4}; + }; + class ACE_NewsText: RscHTML { + idc = 69; + x = "0 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + y = "2.2 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h = "17.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + + shadow = 0; + class H1 { + font = "PuristaMedium"; + fontBold = "PuristaLight"; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; + }; + class H2: H1 { + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)"; + font = "PuristaLight"; + }; + class P: H1 { + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + fontBold = "PuristaLight"; + }; + colorBold[] = {0.6,0.6,0.6,1}; + colorLink[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + colorLinkActive[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + }; + }; + }; }; }; diff --git a/addons/optionsmenu/script_loadMainMenuBox.sqf b/addons/optionsmenu/script_loadMainMenuBox.sqf new file mode 100644 index 0000000000..7583fccc2d --- /dev/null +++ b/addons/optionsmenu/script_loadMainMenuBox.sqf @@ -0,0 +1,25 @@ +/* + * Author: PabstMirror + * Loads the version info HTML box from main menu + * + * Arguments: + * 0: Display (from onMouseMoving) + * + * Return Value: + * None + * + * Example: + * onMouseMovingEvent execVM "script_loadMainMenuBox.sqf"; + * + * Public: No + */ +#include "script_component.hpp" + +if (missionNamespace getVariable [QGVAR(newsLoaded), false]) exitWith {}; +GVAR(newsLoaded) = true; + +private ["_version"]; +_version = getText (configFile >> "CfgPatches" >> "ace_main" >> "versionStr"); + +((_this select 0) displayCtrl 68) ctrlSetText format ["Installed Version: %1", _version]; +((_this select 0) displayCtrl 69) htmlLoad "http://ace3mod.com/"; \ No newline at end of file From 87d258ff050d7a70eb12a7747406b81162a8ef76 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 13 May 2015 14:19:28 -0500 Subject: [PATCH 015/664] Fix Scaling on small resolutions --- addons/optionsmenu/gui/pauseMenu.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/optionsmenu/gui/pauseMenu.hpp b/addons/optionsmenu/gui/pauseMenu.hpp index f85e6811c4..c6f9cf4304 100644 --- a/addons/optionsmenu/gui/pauseMenu.hpp +++ b/addons/optionsmenu/gui/pauseMenu.hpp @@ -108,11 +108,11 @@ class RscDisplayMain: RscStandardDisplay { }; class ACE_news: RscControlsGroupNoScrollbars { - x = "safezoneX + safezoneW - (48 * ( ((safezoneW / safezoneH) min 1.2) / 40))"; - y = "safezoneY + (1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25))"; idc = -1; - w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; - h = "20 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + x = "safezoneX + safezoneW - (31 * (((safezoneW / safezoneH) min 1.2) / 40))"; + y = "safezoneY + (1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))"; + w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "16.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; class controls { class ACE_NewsTitle: RscText { @@ -124,7 +124,7 @@ class RscDisplayMain: RscStandardDisplay { w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; }; - class ACE_NewsBackgroundDate: RscText + class ACE_VersionInfo: RscText { idc = 68; x = "0 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; @@ -138,15 +138,15 @@ class RscDisplayMain: RscStandardDisplay { x = "0 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; y = "2.2 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; - h = "17.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + h = "14 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; colorBackground[] = {0,0,0,0.4}; }; class ACE_NewsText: RscHTML { idc = 69; x = "0 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; - y = "2.2 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + y = "2.1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; w = "15 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; - h = "17.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + h = "14.2 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; shadow = 0; class H1 { From 553942bbc7b523b93b3c580183d0f2517192303b Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 13 May 2015 14:33:14 -0700 Subject: [PATCH 016/664] Initial commit of frag/spalling optimization rewrite. Now tracks in single PFH, with index-based referencing instead of searches. TODO: Break spall calculation up to multiple frames. Needs testing. --- addons/frag/ACE_Settings.hpp | 11 ++- addons/frag/XEH_postInit.sqf | 4 +- addons/frag/XEH_preInit.sqf | 12 +++- addons/frag/functions/fnc_addPfhRound.sqf | 71 +++++++++++++++++++ addons/frag/functions/fnc_doSpall.sqf | 2 + addons/frag/functions/fnc_fired.sqf | 53 +------------- addons/frag/functions/fnc_masterPFH.sqf | 46 ++++++++++++ ...nc_trackFragRound.sqf => fnc_pfhRound.sqf} | 23 +++--- addons/frag/functions/fnc_removePfhRound.sqf | 9 +++ addons/frag/stringtable.xml | 26 ++++--- 10 files changed, 175 insertions(+), 82 deletions(-) create mode 100644 addons/frag/functions/fnc_addPfhRound.sqf create mode 100644 addons/frag/functions/fnc_masterPFH.sqf rename addons/frag/functions/{fnc_trackFragRound.sqf => fnc_pfhRound.sqf} (54%) create mode 100644 addons/frag/functions/fnc_removePfhRound.sqf diff --git a/addons/frag/ACE_Settings.hpp b/addons/frag/ACE_Settings.hpp index b160a127f3..6a782de2f9 100644 --- a/addons/frag/ACE_Settings.hpp +++ b/addons/frag/ACE_Settings.hpp @@ -1,7 +1,14 @@ class ACE_Settings { class GVAR(enabled) { - displayName = "Frag System"; - description = "Enables the shrapnel system for explosives"; + displayName = "$STR_ACE_frag_EnableFrag"; + description = "$STR_ACE_frag_EnableFrag_Desc"; + typeName = "BOOL"; + value = 1; + }; + + class GVAR(spallEnabled) { + displayName = "$STR_ACE_frag_EnableSpall"; + description = "$STR_ACE_frag_EnableSpall_Desc"; typeName = "BOOL"; value = 1; }; diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf index 6c8d64d1fb..0c6a1845b6 100644 --- a/addons/frag/XEH_postInit.sqf +++ b/addons/frag/XEH_postInit.sqf @@ -2,4 +2,6 @@ if(isServer) then { [QGVAR(frag_eh), { _this call FUNC(frago); }] call ace_common_fnc_addEventHandler; -}; \ No newline at end of file +}; + +[FUNC(masterPFH), 0, []] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/frag/XEH_preInit.sqf b/addons/frag/XEH_preInit.sqf index 906a696ebf..4d1afcc385 100644 --- a/addons/frag/XEH_preInit.sqf +++ b/addons/frag/XEH_preInit.sqf @@ -6,11 +6,9 @@ PREP(doSpall); PREP(fired); PREP(frago); PREP(spallTrack); -PREP(trackFragRound); GVAR(blackList) = []; GVAR(traceFrags) = false; -GVAR(trackedObjects) = []; GVAR(TOTALFRAGS) = 0; @@ -32,4 +30,14 @@ PREP(startTracing); PREP(stopTracing); PREP(trackTrace); +// New tracking mechanisms +PREP(masterPFH); +PREP(pfhRound); +PREP(addPfhRound); +PREP(removePfhRound); // THIS SHOULD ABE USED SPARINGLY + +GVAR(objects) = []; +GVAR(objectTypes) = []; +GVAR(arguments) = []; + ADDON = true; diff --git a/addons/frag/functions/fnc_addPfhRound.sqf b/addons/frag/functions/fnc_addPfhRound.sqf new file mode 100644 index 0000000000..81454edf97 --- /dev/null +++ b/addons/frag/functions/fnc_addPfhRound.sqf @@ -0,0 +1,71 @@ +#include "script_component.hpp" + +private ["_enabled", "_gun", "_type", "_round", "_doFragTrack", "_doSpall", "_spallTrack", "_spallTrackID"]; + +if (!GVAR(enabled)) exitWith {}; + +_gun = _this select 0; +_type = _this select 1; +_round = _this select 2; + +_enabled = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(enabled)); +if(_enabled < 1) exitWith {}; + +if(_round in GVAR(blackList)) exitWith { + GVAR(blackList) = GVAR(blackList) - [_round]; +}; + +_doFragTrack = false; +if(_gun == ACE_player) then { + _doFragTrack = true; +} else { + if((gunner _gun) == ACE_player) then { + _doFragTrack = true; + } else { + if(local _gun && {!(isPlayer (gunner _gun))} && {!(isPlayer _gun)}) then { + _doFragTrack = true; + }; + }; +}; +if(GVAR(spallEnabled)) then { + if(GVAR(spallIsTrackingCount) <= 0) then { + GVAR(spallHPData) = []; + }; + if(GVAR(spallIsTrackingCount) > 5) then { + // ACE_player sideChat "LIMT!"; + _doSpall = false; + } else { + GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) + 1; + }; +}; +// ACE_player sideChat format["c: %1", GVAR(spallIsTrackingCount)]; + +#ifdef DEBUG_MODE_FULL +[ACE_player, _round, [1,0,0,1]] call FUNC(addTrack); +#endif + +// We only do the single track object check here. +if(_doFragTrack && alive _round && {!(_round in GVAR(objects))} ) then { + _spallTrack = []; + _spallTrackID = []; + + private["_args"]; + _args = [_round, (getPosASL _round), (velocity _round), _type, time, _gun, _doSpall, _spallTrack, _spallTrackID, + (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip))), + (getNumber (configFile >> "CfgAmmo" >> _type >> "explosive")), + (getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange")), + (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force))), + (getNumber(configFile >> "CfgAmmo" >> _type >> "indirecthit")*(sqrt((getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"))))) + ]; + + GVAR(objects) pushBack _round; + GVAR(arguments) pushBack _args; + + if(_doSpall) then { + [_round, 2, _spallTrack, _spallTrackID] call FUNC(spallTrack); + }; + // ACE_player sideChat "WTF2"; +}; + + + diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf index d2e64dbbfb..717b629e53 100644 --- a/addons/frag/functions/fnc_doSpall.sqf +++ b/addons/frag/functions/fnc_doSpall.sqf @@ -124,6 +124,7 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; _fragment setPosASL _spallPos; _fragment setVelocity _spallFragVect; + if(GVAR(traceFrags)) then { [ACE_player, _fragment, [1,0.5,0,1]] call FUNC(addTrack); }; @@ -145,6 +146,7 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; _fragment setPosASL _spallPos; _fragment setVelocity _spallFragVect; + if(GVAR(traceFrags)) then { [ACE_player, _fragment, [1,0,0,1]] call FUNC(addTrack); }; diff --git a/addons/frag/functions/fnc_fired.sqf b/addons/frag/functions/fnc_fired.sqf index 9b89e40897..15a878d112 100644 --- a/addons/frag/functions/fnc_fired.sqf +++ b/addons/frag/functions/fnc_fired.sqf @@ -1,58 +1,9 @@ #include "script_component.hpp" - -private ["_enabled", "_gun", "_type", "_round", "_doFragTrack", "_doSpall", "_spallTrack", "_spallTrackID"]; - -if (!GVAR(enabled)) exitWith {}; +private["_gun", "_type", "_round"]; _gun = _this select 0; _type = _this select 4; _round = _this select 6; -_enabled = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(enabled)); -if(_enabled < 1) exitWith {}; +[_gun, _type, _round] call FUNC(addPfhRound); -if(_round in GVAR(blackList)) exitWith { - GVAR(blackList) = GVAR(blackList) - [_round]; -}; - - -_doFragTrack = false; -if(_gun == ACE_player) then { - _doFragTrack = true; -} else { - if((gunner _gun) == ACE_player) then { - _doFragTrack = true; - } else { - if(local _gun && {!(isPlayer (gunner _gun))} && {!(isPlayer _gun)}) then { - _doFragTrack = true; - }; - }; -}; -_doSpall = false; -if(_doSpall) then { - if(GVAR(spallIsTrackingCount) <= 0) then { - GVAR(spallHPData) = []; - }; - if(GVAR(spallIsTrackingCount) > 5) then { - // ACE_player sideChat "LIMT!"; - _doSpall = false; - } else { - GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) + 1; - }; -}; -// ACE_player sideChat format["c: %1", GVAR(spallIsTrackingCount)]; - -#ifdef DEBUG_MODE_FULL -[ACE_player, _round, [1,0,0,1]] call FUNC(addTrack); -#endif - -if(_doFragTrack && alive _round) then { - GVAR(trackedObjects) pushBack _round; - _spallTrack = []; - _spallTrackID = []; - [DFUNC(trackFragRound), 0, [_round, (getPosASL _round), (velocity _round), _type, time, _gun, _doSpall, _spallTrack, _spallTrackID]] call cba_fnc_addPerFrameHandler; - if(_doSpall) then { - [_round, 2, _spallTrack, _spallTrackID] call FUNC(spallTrack); - }; - // ACE_player sideChat "WTF2"; -}; diff --git a/addons/frag/functions/fnc_masterPFH.sqf b/addons/frag/functions/fnc_masterPFH.sqf new file mode 100644 index 0000000000..d511325e15 --- /dev/null +++ b/addons/frag/functions/fnc_masterPFH.sqf @@ -0,0 +1,46 @@ +/* + * Author: jaynus + * + * Master single PFH abstraction for all rounds being tracked by frag/spall + * + * Arguments: + * + * + * Return Value: + * None + */ +#include "script_component.hpp" +PARAMS_2(_pfhArgs,_handle); + +if (!GVAR(enabled)) exitWith {}; + +private["_gcIndex"]; +_gcIndex = []; +{ + private["_object", "_args"]; + _object = _x; + if(!isNil "_object") then { + if(isNull _object) then { + _gcIndex pushBack _forEachIndex; + } else { + _args = GVAR(arguments) select _forEachIndex; + + _args call FUNC(pfhRound); + }; + + if(!alive _object) then { + _gcIndex pushBack _forEachIndex; + }; + }; +} forEach GVAR(objects); + +// clean up dead object references +private["_deletionCount", "_deleteIndex"]; +_deletionCount = 0; +{ + _deleteIndex = _gcIndex - _deletionCount; + GVAR(objects) deleteAt _deleteIndex; + GVAR(arguments) deleteAt _deleteIndex; + + _deletionCount = _deletionCount + 1; +} forEach _gcIndex; \ No newline at end of file diff --git a/addons/frag/functions/fnc_trackFragRound.sqf b/addons/frag/functions/fnc_pfhRound.sqf similarity index 54% rename from addons/frag/functions/fnc_trackFragRound.sqf rename to addons/frag/functions/fnc_pfhRound.sqf index 8db68c99e8..df6f618ac5 100644 --- a/addons/frag/functions/fnc_trackFragRound.sqf +++ b/addons/frag/functions/fnc_pfhRound.sqf @@ -1,4 +1,3 @@ -//fnc_trackFragRound.sqf #include "script_component.hpp" private ["_params", "_round", "_lastPos", "_lastVel", "_type", "_time", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; _params = _this select 0; @@ -10,20 +9,17 @@ _time = _params select 4; _doSpall = _params select 6; _spallTrack = _params select 7; _foundObjectHPIds = _params select 8; +_skip = _params select 9; +_explosive = _params select 10; +_indirectRange = _params select 11; +_force = _params select 12; +_fragPower = _params select 13; if (!alive _round) then { - [_this select 1] call cba_fnc_removePerFrameHandler; - if(_time != time && {_round in GVAR(trackedObjects)} && {!(_round in GVAR(blackList))}) then { - GVAR(trackedObjects) = GVAR(trackedObjects) - [_round]; - _skip = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip)); + if(_time != time && {!(_round in GVAR(blackList))}) then { if(_skip == 0) then { - _explosive = getNumber (configFile >> "CfgAmmo" >> _type >> "explosive"); - _indirectRange = getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"); - _force = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force)); - _fragPower = getNumber(configFile >> "CfgAmmo" >> _type >> "indirecthit")*(sqrt(_indirectRange)); if((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1} ) then { [QGVAR(frag_eh), _params] call ace_common_fnc_serverEvent; - GVAR(trackedObjects) = GVAR(trackedObjects) - [_round]; }; }; }; @@ -37,11 +33,8 @@ if (!alive _round) then { } forEach _spallTrack; }; } else { - if(!(_round in GVAR(trackedObjects)) || {_round in GVAR(blackList)}) then { - [_this select 1] call cba_fnc_removePerFrameHandler; - if(_round in GVAR(blackList)) then { - GVAR(blackList) = GVAR(blackList) - [_round]; - }; + if(_round in GVAR(blackList)) exitWith { + [_round] call FUNC(removePfhRound); }; _params set[1, (getPosASL _round)]; diff --git a/addons/frag/functions/fnc_removePfhRound.sqf b/addons/frag/functions/fnc_removePfhRound.sqf new file mode 100644 index 0000000000..7fe3994d55 --- /dev/null +++ b/addons/frag/functions/fnc_removePfhRound.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +// THIS FUNCTION SHOULD NOT BE USED BECAUSE IT CAUSES AN SEARCH AND REBUILD + +if(_round in GVAR(blackList)) then { + GVAR(blackList) = GVAR(blackList) - [_round]; +}; + +GVAR(objects) = GVAR(objects) - [_round]; \ No newline at end of file diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index e7ebb7c1bf..e267685869 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -1,17 +1,21 @@  - - Disable Fragmentation - Keine Schrapnelle - Zakázat fragmentaci granátů - Desactivar fragmentación - Wyłącz fragmentację odłamków - Выключить разлёт осколков - Désactive la fragmentation - Repeszek letiltása - Disattiva la frammentazione - Desabilitar Fragmentação + + Fragmentation Simulation + + + + Enable the ACE Fragmentation Simulation + + + + Spalling Simulation + + + + Enable the ACE Spalling Simulation + From 58a55313cdc89fb481d9146995312ffa7bb5fd11 Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 13 May 2015 17:06:10 -0700 Subject: [PATCH 017/664] Changed: Entire frag system re-optimized to a single tracking/GC index-based PFH. Changed: Spalling calculations now throttled across frames and limited; accurate but performant Changed: All lookups are now index-based on a global projectiles array. This reduced runtime dramatically for all fragmentation. --- addons/frag/ACE_Settings.hpp | 24 ++++++++++-- addons/frag/CfgAmmo.hpp | 4 +- addons/frag/CfgAmmoReflections.hpp | 1 - addons/frag/XEH_postInit.sqf | 5 +++ addons/frag/XEH_preInit.sqf | 3 +- addons/frag/functions/fnc_addPfhRound.sqf | 32 ++++++++------- addons/frag/functions/fnc_doSpall.sqf | 4 -- addons/frag/functions/fnc_frago.sqf | 11 ++---- addons/frag/functions/fnc_masterPFH.sqf | 36 +++++++++++------ addons/frag/functions/fnc_pfhRound.sqf | 48 ++++++++++++----------- addons/frag/functions/fnc_spallTrack.sqf | 2 +- addons/frag/stringtable.xml | 22 +++++++++-- 12 files changed, 120 insertions(+), 72 deletions(-) diff --git a/addons/frag/ACE_Settings.hpp b/addons/frag/ACE_Settings.hpp index 6a782de2f9..bbf0398cfb 100644 --- a/addons/frag/ACE_Settings.hpp +++ b/addons/frag/ACE_Settings.hpp @@ -1,15 +1,33 @@ class ACE_Settings { - class GVAR(enabled) { + class GVAR(Enabled) { displayName = "$STR_ACE_frag_EnableFrag"; description = "$STR_ACE_frag_EnableFrag_Desc"; typeName = "BOOL"; value = 1; }; - - class GVAR(spallEnabled) { + class GVAR(SpallEnabled) { displayName = "$STR_ACE_frag_EnableSpall"; description = "$STR_ACE_frag_EnableSpall_Desc"; typeName = "BOOL"; value = 1; }; + class GVAR(maxTrack) { + displayName = "$STR_ACE_frag_MaxTrack"; + description = "$STR_ACE_frag_MaxTrack_Desc"; + typeName = "SCALAR"; + value = 500; + }; + class GVAR(MaxTrackPerFrame) { + displayName = "$STR_ACE_frag_MaxTrackPerFrame"; + description = "$STR_ACE_frag_MaxTrackPerFrame_Desc"; + typeName = "SCALAR"; + value = 50; + }; + + class GVAR(EnableDebugTrace) { + displayName = "$STR_ACE_frag_EnableDebugTrace"; + description = "$STR_ACE_frag_EnableDebugTrace_Desc"; + typeName = "BOOL"; + value = 0; + }; }; diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp index 7f4c4b38b3..41734d2806 100644 --- a/addons/frag/CfgAmmo.hpp +++ b/addons/frag/CfgAmmo.hpp @@ -9,8 +9,6 @@ class CfgAmmo { // GVAR(skip) = 1; //}; - #include "CfgAmmoReflections.hpp" - class Bo_GBU12_LGB; class ACE_GBU12 : Bo_GBU12_LGB { GVAR(enabled) = 1; @@ -473,4 +471,6 @@ class CfgAmmo { class ACE_frag_spall_huge: ACE_frag_huge { timeToLive = 0.3; }; + + #include "CfgAmmoReflections.hpp" }; diff --git a/addons/frag/CfgAmmoReflections.hpp b/addons/frag/CfgAmmoReflections.hpp index 8e481a9cd0..f59d67f89a 100644 --- a/addons/frag/CfgAmmoReflections.hpp +++ b/addons/frag/CfgAmmoReflections.hpp @@ -1,7 +1,6 @@ //CfgAmmoReflections.hpp #define ACE_EXPLOSION_REFLECTION(range, hit) class ace_explosion_reflection_##range##_##hit : ace_explosion_reflection_base { indirectHitRange = range; indirectHit = hit; dangerRadiusHit = range*3; suppressionRadiusHit = range*2; }; -class Sh_120mm_HE; class ace_explosion_reflection_base : Sh_120mm_HE { CraterWaterEffects = ""; CraterEffects = ""; diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf index 0c6a1845b6..95c921df64 100644 --- a/addons/frag/XEH_postInit.sqf +++ b/addons/frag/XEH_postInit.sqf @@ -1,5 +1,10 @@ #include "script_component.hpp" +if(GVAR(EnableDebugTrace) && !isMultiplayer) then { + GVAR(traceFrags) = true; + GVAR(autoTrace) = true; +}; + if(isServer) then { [QGVAR(frag_eh), { _this call FUNC(frago); }] call ace_common_fnc_addEventHandler; }; diff --git a/addons/frag/XEH_preInit.sqf b/addons/frag/XEH_preInit.sqf index a2d1e38c1b..cdd9342ffd 100644 --- a/addons/frag/XEH_preInit.sqf +++ b/addons/frag/XEH_preInit.sqf @@ -15,7 +15,7 @@ GVAR(TOTALFRAGS) = 0; GVAR(spallHPData) = []; GVAR(spallIsTrackingCount) = 0; -GVAR(autoTrace) = true; +GVAR(autoTrace) = false; GVAR(traceID) = -1; GVAR(traces) = []; GVAR(tracesStarted) = false; @@ -43,6 +43,7 @@ PREP(doExplosions); PREP(doReflections); +GVAR(lastIterationIndex) = 0; GVAR(objects) = []; GVAR(objectTypes) = []; GVAR(arguments) = []; diff --git a/addons/frag/functions/fnc_addPfhRound.sqf b/addons/frag/functions/fnc_addPfhRound.sqf index 81454edf97..7530b8f062 100644 --- a/addons/frag/functions/fnc_addPfhRound.sqf +++ b/addons/frag/functions/fnc_addPfhRound.sqf @@ -1,20 +1,21 @@ +//#define DEBUG_MODE_FULL #include "script_component.hpp" -private ["_enabled", "_gun", "_type", "_round", "_doFragTrack", "_doSpall", "_spallTrack", "_spallTrackID"]; +private ["_enabled","_doFragTrack", "_doSpall", "_spallTrack", "_spallTrackID"]; +PARAMS_3(_gun,_type,_round); if (!GVAR(enabled)) exitWith {}; -_gun = _this select 0; -_type = _this select 1; -_round = _this select 2; - -_enabled = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(enabled)); -if(_enabled < 1) exitWith {}; +//_enabled = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(enabled)); +//if(_enabled < 1) exitWith {}; if(_round in GVAR(blackList)) exitWith { GVAR(blackList) = GVAR(blackList) - [_round]; }; +// Exit on max track +if( (count GVAR(objects)) > GVAR(MaxTrack)) exitWith { }; + _doFragTrack = false; if(_gun == ACE_player) then { _doFragTrack = true; @@ -27,7 +28,7 @@ if(_gun == ACE_player) then { }; }; }; -if(GVAR(spallEnabled)) then { +if(GVAR(SpallEnabled)) then { if(GVAR(spallIsTrackingCount) <= 0) then { GVAR(spallHPData) = []; }; @@ -40,12 +41,15 @@ if(GVAR(spallEnabled)) then { }; // ACE_player sideChat format["c: %1", GVAR(spallIsTrackingCount)]; -#ifdef DEBUG_MODE_FULL -[ACE_player, _round, [1,0,0,1]] call FUNC(addTrack); -#endif +if(GVAR(autoTrace)) then { + [ACE_player, _round, [1,0,0,1]] call FUNC(addTrack); +}; // We only do the single track object check here. -if(_doFragTrack && alive _round && {!(_round in GVAR(objects))} ) then { +// We should do an {!(_round in GVAR(objects))} +// But we leave that out here for optimization. So this cannot be a framework function +// Otherwise, it should only be added once and from the FiredEH +if(_doFragTrack && alive _round) then { _spallTrack = []; _spallTrackID = []; @@ -57,12 +61,12 @@ if(_doFragTrack && alive _round && {!(_round in GVAR(objects))} ) then { (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force))), (getNumber(configFile >> "CfgAmmo" >> _type >> "indirecthit")*(sqrt((getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"))))) ]; - + TRACE_1("Initializing track", _round); GVAR(objects) pushBack _round; GVAR(arguments) pushBack _args; if(_doSpall) then { - [_round, 2, _spallTrack, _spallTrackID] call FUNC(spallTrack); + [_round, 1, _spallTrack, _spallTrackID] call FUNC(spallTrack); }; // ACE_player sideChat "WTF2"; }; diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf index 717b629e53..1e8e87bcb3 100644 --- a/addons/frag/functions/fnc_doSpall.sqf +++ b/addons/frag/functions/fnc_doSpall.sqf @@ -1,14 +1,10 @@ //fnc_doSpall.sqf #include "script_component.hpp" -#ifdef DEBUG_MODE_FULL - GVAR(traceFrags) = true; -#endif // ACE_player sideChat "WAAAAAAAAAAAAAAAAAAAAA"; private ["_params", "_hitData", "_initialData", "_hpData", "_object", "_foundObjects", "_index", "_foundObjecsts", "_roundType", "_round", "_caliber", "_explosive", "_idh", "_alive", "_exit", "_vm", "_velocity", "_oldVelocity", "_curVelocity", "_diff", "_polar", "_unitDir", "_spallPos", "_pos1", "_i", "_pos2", "_blah", "_data", "_spallPolar", "_warn", "_c", "_m", "_k", "_gC", "_fragPower", "_fragTypes", "_spread", "_spallCount", "_elev", "_dir", "_vel", "_spallFragVect", "_fragType", "_fragment", "_pos"]; _params = _this select 0; -[(_this select 1)] call cba_fnc_removePerFrameHandler; _hitData = _params select 0; _initialData = GVAR(spallHPData) select (_hitData select 0); _hpData = (_hitData select 1) select (_params select 1); diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index 415b75e790..5b5cf89bbe 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -163,11 +163,8 @@ if(_isArmed && (count _objects) > 0) then { _fragObj setPosASL _lastPos; _fragObj setVectorDir _vec; _fragObj setVelocity _vel; - #ifdef DEBUG_MODE_FULL - GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; - GVAR(traceFrags) = true; - #endif if(GVAR(traceFrags)) then { + GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; [ACE_player, _fragObj, [1,0,0,1]] call FUNC(addTrack); }; _fragCount = _fragCount + 1; @@ -200,11 +197,9 @@ if(_isArmed && (count _objects) > 0) then { _fragObj setPosASL _lastPos; _fragObj setVectorDir _vec; _fragObj setVelocity _vel; - #ifdef DEBUG_MODE_FULL - GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; - GVAR(traceFrags) = true; - #endif + if(GVAR(traceFrags)) then { + GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; [ACE_player, _fragObj, [1,0.5,0,1]] call FUNC(addTrack); }; _fragCount = _fragCount + 1; diff --git a/addons/frag/functions/fnc_masterPFH.sqf b/addons/frag/functions/fnc_masterPFH.sqf index d511325e15..4e81c4c609 100644 --- a/addons/frag/functions/fnc_masterPFH.sqf +++ b/addons/frag/functions/fnc_masterPFH.sqf @@ -9,36 +9,48 @@ * Return Value: * None */ +//#define DEBUG_MODE_FULL #include "script_component.hpp" -PARAMS_2(_pfhArgs,_handle); +//PARAMS_2(_pfhArgs,_handle); if (!GVAR(enabled)) exitWith {}; private["_gcIndex"]; _gcIndex = []; -{ + +_iter = 0; +while { (count GVAR(objects)) > 0 && { _iter < GVAR(MaxTrackPerFrame) } } do { private["_object", "_args"]; - _object = _x; + if(GVAR(lastIterationIndex) >= (count GVAR(objects))) then { + GVAR(lastIterationIndex) = 0; + }; + _object = GVAR(objects) select GVAR(lastIterationIndex); + if(!isNil "_object") then { if(isNull _object) then { - _gcIndex pushBack _forEachIndex; + _gcIndex pushBack GVAR(lastIterationIndex); } else { - _args = GVAR(arguments) select _forEachIndex; + _args = GVAR(arguments) select GVAR(lastIterationIndex); - _args call FUNC(pfhRound); - }; - - if(!alive _object) then { - _gcIndex pushBack _forEachIndex; + if(!(_args call FUNC(pfhRound))) then { + _gcIndex pushBack GVAR(lastIterationIndex); // Add it to the GC if it returns false + }; + // If its not alive anymore, remove it from the queue, it already ran once on dead + if(!alive _object) then { + _gcIndex pushBack GVAR(lastIterationIndex); + }; }; }; -} forEach GVAR(objects); + _iter = _iter + 1; + GVAR(lastIterationIndex) = GVAR(lastIterationIndex) + 1; +}; // clean up dead object references private["_deletionCount", "_deleteIndex"]; _deletionCount = 0; { - _deleteIndex = _gcIndex - _deletionCount; + TRACE_1("GC Projectile", _x); + _deleteIndex = _x - _deletionCount; GVAR(objects) deleteAt _deleteIndex; GVAR(arguments) deleteAt _deleteIndex; diff --git a/addons/frag/functions/fnc_pfhRound.sqf b/addons/frag/functions/fnc_pfhRound.sqf index df6f618ac5..8cc9457842 100644 --- a/addons/frag/functions/fnc_pfhRound.sqf +++ b/addons/frag/functions/fnc_pfhRound.sqf @@ -1,25 +1,28 @@ #include "script_component.hpp" -private ["_params", "_round", "_lastPos", "_lastVel", "_type", "_time", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; -_params = _this select 0; -_round = _params select 0; -_lastPos = _params select 1; -_lastVel = _params select 2; -_type = _params select 3; -_time = _params select 4; -_doSpall = _params select 6; -_spallTrack = _params select 7; -_foundObjectHPIds = _params select 8; -_skip = _params select 9; -_explosive = _params select 10; -_indirectRange = _params select 11; -_force = _params select 12; -_fragPower = _params select 13; +private ["_round", "_lastPos", "_lastVel", "_type", "_time", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; +_round = _this select 0; +_lastPos = _this select 1; +_lastVel = _this select 2; +_type = _this select 3; +_time = _this select 4; +_doSpall = _this select 6; +_spallTrack = _this select 7; +_foundObjectHPIds = _this select 8; +_skip = _this select 9; +_explosive = _this select 10; +_indirectRange = _this select 11; +_force = _this select 12; +_fragPower = _this select 13; + +if(_round in GVAR(blackList)) exitWith { + false +}; if (!alive _round) then { - if(_time != time && {!(_round in GVAR(blackList))}) then { + if(_time != time) then { if(_skip == 0) then { if((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1} ) then { - [QGVAR(frag_eh), _params] call ace_common_fnc_serverEvent; + [QGVAR(frag_eh), _this] call ace_common_fnc_serverEvent; }; }; }; @@ -33,13 +36,14 @@ if (!alive _round) then { } forEach _spallTrack; }; } else { - if(_round in GVAR(blackList)) exitWith { - [_round] call FUNC(removePfhRound); - }; - + _params set[1, (getPosASL _round)]; _params set[2, (velocity _round)]; if(_doSpall) then { - [_round, 1, _spallTrack, _foundObjectHPIds] call FUNC(spallTrack); + private["_scale"]; + _scale = ( (count GVAR(objects)) / GVAR(MaxTrackPerFrame) ) max 0.1; + [_round, _scale, _spallTrack, _foundObjectHPIds] call FUNC(spallTrack); }; }; + +true \ No newline at end of file diff --git a/addons/frag/functions/fnc_spallTrack.sqf b/addons/frag/functions/fnc_spallTrack.sqf index 4b7a06bc65..afe4bc1931 100644 --- a/addons/frag/functions/fnc_spallTrack.sqf +++ b/addons/frag/functions/fnc_spallTrack.sqf @@ -22,7 +22,7 @@ if (count _intersectsWith > 0) then { if(!(_x in _foundObjects)) then { // diag_log text format["Adding HP: %1", _x]; _index = (count GVAR(spallHPData)); - _hpId = _x addEventHandler ["hitPart", format["[%1, _this] call " + QUOTE(FUNC(spallHP)), _index]]; + _hpId = _x addEventHandler ["hitPart", compile format["[%1, _this] call " + QUOTE(FUNC(spallHP)), _index]]; _foundObjects set[(count _foundObjects), _x]; _foundObjectHPIds set[(count _foundObjectHPIds), _hpId]; _data = [_hpId, _x, typeOf _round, _round, _curPos, _velocity, 0, _foundObjects, _foundObjectHPIds]; diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index e267685869..5b49b0e192 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -3,19 +3,33 @@ Fragmentation Simulation - Enable the ACE Fragmentation Simulation - Spalling Simulation - Enable the ACE Spalling Simulation - + + + Maximum Projectiles Tracked + + + This setting controls the maximum amount of projectiles the fragmentation & spalling system will track at any given time. If more projectiles are fired, they will not be tracked. Lower this setting if you do not want FPS drops at high-count projectile scenarios ( >200 rounds in the air at once) + + + Maximum Projectiles Per Frame + + + The number of spall track calculations to perform in any given frame. This helps spread the FPS impact of tracking spall rounds across multiple frames, limiting its impact even further. + + + (SP Only) Frag/Spall Debug Tracing + + + (SP Only) Requires a mission/editor restart. Enables visual tracing of fragmentation and spalling rounds in SP game mode only. From 7c03ec913be7899fa1a9aa5c2f028e0621343fda Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 14 May 2015 16:23:01 +0200 Subject: [PATCH 018/664] double all the things (ints) --- extensions/medical/DamageType.cpp | 2 +- extensions/medical/DamageType.h | 8 ++++---- extensions/medical/InjuryType.cpp | 2 +- extensions/medical/InjuryType.h | 10 +++++----- extensions/medical/OpenWound.cpp | 2 +- extensions/medical/OpenWound.h | 8 ++++---- extensions/medical/handleDamage.cpp | 16 ++++++++-------- extensions/medical/handleDamage.h | 2 +- extensions/medical/medical.cpp | 2 +- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/extensions/medical/DamageType.cpp b/extensions/medical/DamageType.cpp index 5434d79e98..2b3a5b2e61 100644 --- a/extensions/medical/DamageType.cpp +++ b/extensions/medical/DamageType.cpp @@ -2,7 +2,7 @@ using namespace ace::medical; -injuries::DamageType::DamageType(std::string aTypeName, unsigned int minimalLethalDamage, unsigned int minDamage, unsigned int maxDamage) +injuries::DamageType::DamageType(std::string aTypeName, double minimalLethalDamage, double minDamage, double maxDamage) : typeName(aTypeName), minLethalDamage(minimalLethalDamage), minDamageThreshold(minDamage), maxDamageThreshold(maxDamage) { } diff --git a/extensions/medical/DamageType.h b/extensions/medical/DamageType.h index 449060070b..b690c46627 100644 --- a/extensions/medical/DamageType.h +++ b/extensions/medical/DamageType.h @@ -11,13 +11,13 @@ namespace ace { class DamageType { public: - DamageType(std::string aTypeName, unsigned int minimalLethalDamage, unsigned int minDamageThreshold, unsigned int maxDamageThreshold); + DamageType(std::string aTypeName, double minimalLethalDamage, double minDamageThreshold, double maxDamageThreshold); ~DamageType(); std::string typeName; - unsigned int minLethalDamage; - unsigned int minDamageThreshold; - unsigned int maxDamageThreshold; + double minLethalDamage; + double minDamageThreshold; + double maxDamageThreshold; std::vector> possibleInjuries; }; diff --git a/extensions/medical/InjuryType.cpp b/extensions/medical/InjuryType.cpp index 22c04c4126..cca9b20fd3 100644 --- a/extensions/medical/InjuryType.cpp +++ b/extensions/medical/InjuryType.cpp @@ -3,7 +3,7 @@ using namespace ace::medical; -injuries::InjuryType::InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, signed int theBloodLoss, signed int thePain, signed int minimumDamage, signed int maximumDamage, std::vector& possibleCauses, std::string& aDisplayname) +injuries::InjuryType::InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, double theBloodLoss, double thePain, double minimumDamage, double maximumDamage, std::vector& possibleCauses, std::string& aDisplayname) : ID(anId), className(aClassname), selections(allowedSelections), bloodLoss(theBloodLoss), pain(thePain), minDamage(minimumDamage), maxDamage(maximumDamage), causes(possibleCauses), displayName(aDisplayname) { } diff --git a/extensions/medical/InjuryType.h b/extensions/medical/InjuryType.h index c03760b568..ad99518252 100644 --- a/extensions/medical/InjuryType.h +++ b/extensions/medical/InjuryType.h @@ -9,16 +9,16 @@ namespace ace { class InjuryType { public: - InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, signed int theBloodLoss, signed int thePain, signed int minimumDamage, signed int maximumDamage, std::vector& possibleCauses, std::string& aDisplayname); + InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, double theBloodLoss, double thePain, double minimumDamage, double maximumDamage, std::vector& possibleCauses, std::string& aDisplayname); ~InjuryType(); signed int ID; std::string className; std::vector selections; - signed int bloodLoss; - signed int pain; - signed int minDamage; - signed int maxDamage; + double bloodLoss; + double pain; + double minDamage; + double maxDamage; std::vector causes; std::string displayName; }; diff --git a/extensions/medical/OpenWound.cpp b/extensions/medical/OpenWound.cpp index b0d614e6be..268929fc92 100644 --- a/extensions/medical/OpenWound.cpp +++ b/extensions/medical/OpenWound.cpp @@ -3,7 +3,7 @@ using namespace ace::medical; -injuries::OpenWound::OpenWound(unsigned int anID, unsigned int aBodyPart, unsigned int bloodloss) : classID(anID), bodyPart(aBodyPart), bloodlossRate(bloodloss) +injuries::OpenWound::OpenWound(double anID, double aBodyPart, double bloodloss) : classID(anID), bodyPart(aBodyPart), bloodlossRate(bloodloss) { } diff --git a/extensions/medical/OpenWound.h b/extensions/medical/OpenWound.h index 478e54a597..b2a9baccb8 100644 --- a/extensions/medical/OpenWound.h +++ b/extensions/medical/OpenWound.h @@ -8,14 +8,14 @@ namespace ace { class OpenWound { public: - OpenWound(unsigned int anID, unsigned int aBodyPart, unsigned int bloodloss); + OpenWound(double anID, double aBodyPart, double bloodloss); ~OpenWound(); std::string AsString(); - unsigned int classID; - unsigned int bodyPart; - unsigned int bloodlossRate; + double classID; + double bodyPart; + double bloodlossRate; }; } diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 60fbe83012..1a6612c107 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -15,7 +15,7 @@ handleDamage::~handleDamage() { } -/* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, signed int amountOfDamage, const std::string& typeOfDamage) +/* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage) { std::vector wounds; int selectionN = SelectionToNumber(selectionName); @@ -32,9 +32,9 @@ handleDamage::~handleDamage() if (input.size() == 4) { std::string typeName = input[0]; - unsigned int minimalLethalDamage = std::stod(input[1]); - unsigned int minDamageThreshold = std::stod(input[2]); - unsigned int maxDamageThreshold = std::stod(input[3]); + double minimalLethalDamage = std::stod(input[1]); + double minDamageThreshold = std::stod(input[2]); + double maxDamageThreshold = std::stod(input[3]); std::shared_ptr type(new injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, maxDamageThreshold)); damageTypes.push_back(type); @@ -50,11 +50,11 @@ handleDamage::~handleDamage() int ID = std::stod(input[0]); std::string className = input[1]; std::vector allowedSelections; // input[2]; - unsigned int bloodLoss = std::stod(input[3]); - unsigned int pain = std::stod(input[4]); + double bloodLoss = std::stod(input[3]); + double pain = std::stod(input[4]); - unsigned int minDamage = std::stod(input[5]); - unsigned int maxDamage = std::stod(input[6]); + double minDamage = std::stod(input[5]); + double maxDamage = std::stod(input[6]); std::vector possibleCauses; // input[7]; std::string displayName = input[8]; diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h index c62aa88e5f..7e030f2b84 100644 --- a/extensions/medical/handleDamage.h +++ b/extensions/medical/handleDamage.h @@ -21,7 +21,7 @@ namespace ace { /** * */ - static std::vector HandleDamageWounds(const std::string& selectionName, signed int amountOfDamage, const std::string& typeOfDamage); + static std::vector HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage); /** * diff --git a/extensions/medical/medical.cpp b/extensions/medical/medical.cpp index 3e452b751f..ae0b549613 100644 --- a/extensions/medical/medical.cpp +++ b/extensions/medical/medical.cpp @@ -35,7 +35,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { else { std::vector arguments = parseExtensionInput(function); - if (arguments.size > 0) + if (arguments.size() > 0) { std::string command = arguments.at(0); // can we not just use C++11? From 035277aafcd817ef25ff9e9b5e8f0d3206074c3c Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 14 May 2015 08:11:08 -0700 Subject: [PATCH 019/664] removed illegal character --- addons/frag/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 5b49b0e192..a3a91b92d9 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -17,7 +17,7 @@ Maximum Projectiles Tracked - This setting controls the maximum amount of projectiles the fragmentation & spalling system will track at any given time. If more projectiles are fired, they will not be tracked. Lower this setting if you do not want FPS drops at high-count projectile scenarios ( >200 rounds in the air at once) + This setting controls the maximum amount of projectiles the fragmentation and spalling system will track at any given time. If more projectiles are fired, they will not be tracked. Lower this setting if you do not want FPS drops at high-count projectile scenarios ( >200 rounds in the air at once) Maximum Projectiles Per Frame From 92799719b64ef05a9c516de86d43d5c22c12341a Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 14 May 2015 08:30:06 -0700 Subject: [PATCH 020/664] Spall off by default. --- addons/frag/ACE_Settings.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/frag/ACE_Settings.hpp b/addons/frag/ACE_Settings.hpp index bbf0398cfb..5efba45057 100644 --- a/addons/frag/ACE_Settings.hpp +++ b/addons/frag/ACE_Settings.hpp @@ -9,7 +9,7 @@ class ACE_Settings { displayName = "$STR_ACE_frag_EnableSpall"; description = "$STR_ACE_frag_EnableSpall_Desc"; typeName = "BOOL"; - value = 1; + value = 0; }; class GVAR(maxTrack) { displayName = "$STR_ACE_frag_MaxTrack"; From a48b6c94266f87c7889c44ea864a63f1de4beab8 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 14 May 2015 17:36:58 +0200 Subject: [PATCH 021/664] Fixed namespace issues. Removed static --- extensions/medical/DamageType.cpp | 6 +- extensions/medical/InjuryType.cpp | 5 +- extensions/medical/OpenWound.cpp | 8 +- extensions/medical/handleDamage.cpp | 175 ++++++++++++++-------------- extensions/medical/handleDamage.h | 22 ++-- 5 files changed, 107 insertions(+), 109 deletions(-) diff --git a/extensions/medical/DamageType.cpp b/extensions/medical/DamageType.cpp index 2b3a5b2e61..aeccfa6896 100644 --- a/extensions/medical/DamageType.cpp +++ b/extensions/medical/DamageType.cpp @@ -1,13 +1,11 @@ #include "DamageType.h" -using namespace ace::medical; - -injuries::DamageType::DamageType(std::string aTypeName, double minimalLethalDamage, double minDamage, double maxDamage) +ace::medical::injuries::DamageType::DamageType(std::string aTypeName, double minimalLethalDamage, double minDamage, double maxDamage) : typeName(aTypeName), minLethalDamage(minimalLethalDamage), minDamageThreshold(minDamage), maxDamageThreshold(maxDamage) { } -injuries::DamageType::~DamageType() +ace::medical::injuries::DamageType::~DamageType() { } diff --git a/extensions/medical/InjuryType.cpp b/extensions/medical/InjuryType.cpp index cca9b20fd3..a959e5dd70 100644 --- a/extensions/medical/InjuryType.cpp +++ b/extensions/medical/InjuryType.cpp @@ -1,14 +1,13 @@ #include "InjuryType.h" #include "DamageType.h" -using namespace ace::medical; -injuries::InjuryType::InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, double theBloodLoss, double thePain, double minimumDamage, double maximumDamage, std::vector& possibleCauses, std::string& aDisplayname) +ace::medical::injuries::InjuryType::InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, double theBloodLoss, double thePain, double minimumDamage, double maximumDamage, std::vector& possibleCauses, std::string& aDisplayname) : ID(anId), className(aClassname), selections(allowedSelections), bloodLoss(theBloodLoss), pain(thePain), minDamage(minimumDamage), maxDamage(maximumDamage), causes(possibleCauses), displayName(aDisplayname) { } -injuries::InjuryType::~InjuryType() +ace::medical::injuries::InjuryType::~InjuryType() { } diff --git a/extensions/medical/OpenWound.cpp b/extensions/medical/OpenWound.cpp index 268929fc92..6675704f03 100644 --- a/extensions/medical/OpenWound.cpp +++ b/extensions/medical/OpenWound.cpp @@ -1,17 +1,15 @@ #include "OpenWound.h" #include -using namespace ace::medical; - -injuries::OpenWound::OpenWound(double anID, double aBodyPart, double bloodloss) : classID(anID), bodyPart(aBodyPart), bloodlossRate(bloodloss) +ace::medical::injuries::OpenWound::OpenWound(double anID, double aBodyPart, double bloodloss) : classID(anID), bodyPart(aBodyPart), bloodlossRate(bloodloss) { } -injuries::OpenWound::~OpenWound() +ace::medical::injuries::OpenWound::~OpenWound() { } -std::string injuries::OpenWound::AsString() +std::string ace::medical::injuries::OpenWound::AsString() { std::stringstream stream; stream << classID << "," << bodyPart << "," << 1 << "," << bloodlossRate; diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 1a6612c107..8ee929165e 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -4,91 +4,94 @@ #include "InjuryType.h" #include -using namespace ace::medical; +namespace ace { + namespace medical { -handleDamage::handleDamage() -{ -} - - -handleDamage::~handleDamage() -{ -} - -/* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage) -{ - std::vector wounds; - int selectionN = SelectionToNumber(selectionName); - if (selectionN >= 0) - { - std::vector> injuryTypeInfo = GetInjuryInfoFor(typeOfDamage); - } - - return wounds; -} - -/* static */ void handleDamage::AddDamageType(const std::vector& input) -{ - if (input.size() == 4) - { - std::string typeName = input[0]; - double minimalLethalDamage = std::stod(input[1]); - double minDamageThreshold = std::stod(input[2]); - double maxDamageThreshold = std::stod(input[3]); - - std::shared_ptr type(new injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, maxDamageThreshold)); - damageTypes.push_back(type); - } -} - -/* static */ void handleDamage::AddInjuryType(const std::vector& input) -{ - if (input.size() == 9) - { - // TODO parse arrays from string input - - int ID = std::stod(input[0]); - std::string className = input[1]; - std::vector allowedSelections; // input[2]; - double bloodLoss = std::stod(input[3]); - double pain = std::stod(input[4]); - - double minDamage = std::stod(input[5]); - double maxDamage = std::stod(input[6]); - std::vector possibleCauses; // input[7]; - std::string displayName = input[8]; - - std::shared_ptr type(new injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); - injuryTypes.push_back(type); - } -} - -/* static */ void handleDamage::FinalizeDefinitions() -{ - // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. - for each (std::shared_ptr damageType in damageTypes) - { - for each (std::shared_ptr injuryType in injuryTypes) - { - if (find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName) != injuryType->causes.end()) - { - damageType->possibleInjuries.push_back(injuryType); - } - } - } -} - -/* static */ int SelectionToNumber(const std::string& selectionName) -{ - // TODO use dynamic selections instead - std::vector selections = {"head", "body", "hand_l", "hand_r", "leg_l", "leg_r"}; - std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); - if (it != selections.end()) - { - return it - selections.begin(); - } - else - { - return -1; // TODO throw exception - } + handleDamage::handleDamage() + { + } + + + handleDamage::~handleDamage() + { + } + + /* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage) + { + std::vector wounds; + int selectionN = SelectionToNumber(selectionName); + if (selectionN >= 0) + { + // std::vector> injuryTypeInfo = GetInjuryInfoFor(typeOfDamage); + } + + return wounds; + } + + /* static */ void handleDamage::AddDamageType(const std::vector& input) + { + if (input.size() == 4) + { + std::string typeName = input[0]; + double minimalLethalDamage = std::stod(input[1]); + double minDamageThreshold = std::stod(input[2]); + double maxDamageThreshold = std::stod(input[3]); + + std::shared_ptr type(new ace::medical::injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, maxDamageThreshold)); + damageTypes.push_back(type); + } + } + + void handleDamage::AddInjuryType(const std::vector& input) + { + if (input.size() == 9) + { + // TODO parse arrays from string input + + int ID = std::stod(input[0]); + std::string className = input[1]; + std::vector allowedSelections; // input[2]; + double bloodLoss = std::stod(input[3]); + double pain = std::stod(input[4]); + + double minDamage = std::stod(input[5]); + double maxDamage = std::stod(input[6]); + std::vector possibleCauses; // input[7]; + std::string displayName = input[8]; + + std::shared_ptr type(new ace::medical::injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); + injuryTypes.push_back(type); + } + } + + void handleDamage::FinalizeDefinitions() + { + // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. + for each (std::shared_ptr damageType in damageTypes) + { + for each (std::shared_ptr injuryType in injuryTypes) + { + if (find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName) != injuryType->causes.end()) + { + damageType->possibleInjuries.push_back(injuryType); + } + } + } + } + + int handleDamage::SelectionToNumber(const std::string& selectionName) + { + // TODO use dynamic selections instead + std::vector selections = { "head", "body", "hand_l", "hand_r", "leg_l", "leg_r" }; + std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); + if (it != selections.end()) + { + return it - selections.begin(); + } + else + { + return -1; // TODO throw exception + } + } + } } diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h index 7e030f2b84..a74941c605 100644 --- a/extensions/medical/handleDamage.h +++ b/extensions/medical/handleDamage.h @@ -21,46 +21,46 @@ namespace ace { /** * */ - static std::vector HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage); + std::vector HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage); /** * */ - static void AddDamageType(const std::vector& sqfDamageTypeDefinition); + void AddDamageType(const std::vector& sqfDamageTypeDefinition); /** * */ - static void AddInjuryType(const std::vector& sqfInjuryDefinition); + void AddInjuryType(const std::vector& sqfInjuryDefinition); /** * */ - static std::string SetInjuryTypeData(const std::string& data); + //static std::string SetInjuryTypeData(const std::string& data); /** * */ - static int SelectionToNumber(const std::string& selectionName); + int SelectionToNumber(const std::string& selectionName); /** * */ - static std::vector> GetInjuryInfoFor(const std::string& damageType); + //static std::vector> GetInjuryInfoFor(const std::string& damageType); /** * */ - static void FinalizeDefinitions(); + void FinalizeDefinitions(); private: handleDamage(); - static std::vector> damageTypes; - static std::vector> injuryTypes; - static std::vector selections; - static std::vector hitPoints; + std::vector> damageTypes; + std::vector> injuryTypes; + std::vector selections; + std::vector hitPoints; }; } } From e98c7cd1b736ef7e7c846be842028a68400adcb2 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 14 May 2015 17:41:50 +0200 Subject: [PATCH 022/664] Made handleDamage a singleton --- extensions/medical/handleDamage.cpp | 6 ++++++ extensions/medical/handleDamage.h | 10 +++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 8ee929165e..93094ab2bb 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -12,6 +12,12 @@ namespace ace { } + handleDamage& handleDamage::GetInstance() + { + static handleDamage instance; + return instance; + } + handleDamage::~handleDamage() { } diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h index a74941c605..5959e58653 100644 --- a/extensions/medical/handleDamage.h +++ b/extensions/medical/handleDamage.h @@ -16,6 +16,11 @@ namespace ace { class handleDamage { public: + /** + * + */ + static handleDamage& GetInstance(); + ~handleDamage(); /** @@ -56,7 +61,10 @@ namespace ace { private: handleDamage(); - + + handleDamage(handleDamage const&) = delete; + void operator=(handleDamage const&) = delete; + std::vector> damageTypes; std::vector> injuryTypes; std::vector selections; From 5756c8530f28a920817b615b12fbc4084a551d52 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 14 May 2015 18:52:12 +0200 Subject: [PATCH 023/664] Ported over handleDamage_wounds --- extensions/medical/DamageType.cpp | 4 +- extensions/medical/DamageType.h | 8 ++-- extensions/medical/OpenWound.cpp | 3 +- extensions/medical/OpenWound.h | 6 ++- extensions/medical/handleDamage.cpp | 72 ++++++++++++++++++++++++++--- extensions/medical/handleDamage.h | 2 + 6 files changed, 81 insertions(+), 14 deletions(-) diff --git a/extensions/medical/DamageType.cpp b/extensions/medical/DamageType.cpp index aeccfa6896..3e6b08e507 100644 --- a/extensions/medical/DamageType.cpp +++ b/extensions/medical/DamageType.cpp @@ -1,7 +1,7 @@ #include "DamageType.h" -ace::medical::injuries::DamageType::DamageType(std::string aTypeName, double minimalLethalDamage, double minDamage, double maxDamage) - : typeName(aTypeName), minLethalDamage(minimalLethalDamage), minDamageThreshold(minDamage), maxDamageThreshold(maxDamage) +ace::medical::injuries::DamageType::DamageType(std::string aTypeName, double minimalLethalDamage, std::vector minDamage, std::vector amountOfInjuresOnDamage, bool specificOnly) + : typeName(aTypeName), minLethalDamage(minimalLethalDamage), minDamageThreshold(minDamage), amountOfInjuresOnDamage(amountOfInjuresOnDamage), selectionSpecific(specificOnly) { } diff --git a/extensions/medical/DamageType.h b/extensions/medical/DamageType.h index b690c46627..de8e73a07d 100644 --- a/extensions/medical/DamageType.h +++ b/extensions/medical/DamageType.h @@ -11,13 +11,15 @@ namespace ace { class DamageType { public: - DamageType(std::string aTypeName, double minimalLethalDamage, double minDamageThreshold, double maxDamageThreshold); + DamageType(std::string aTypeName, double minimalLethalDamage, std::vector minDamageThreshold, std::vector amountOfInjuresOnDamage, bool specificOnly); ~DamageType(); std::string typeName; double minLethalDamage; - double minDamageThreshold; - double maxDamageThreshold; + std::vector minDamageThreshold; + std::vector amountOfInjuresOnDamage; + + bool selectionSpecific; std::vector> possibleInjuries; }; diff --git a/extensions/medical/OpenWound.cpp b/extensions/medical/OpenWound.cpp index 6675704f03..b28cf79df5 100644 --- a/extensions/medical/OpenWound.cpp +++ b/extensions/medical/OpenWound.cpp @@ -1,7 +1,8 @@ #include "OpenWound.h" #include -ace::medical::injuries::OpenWound::OpenWound(double anID, double aBodyPart, double bloodloss) : classID(anID), bodyPart(aBodyPart), bloodlossRate(bloodloss) +ace::medical::injuries::OpenWound::OpenWound(int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount) : + classID(aClassID), bodyPart(aBodyPartId), percentage(aPercentage), bloodlossRate(aBl), pain(painAmount) { } diff --git a/extensions/medical/OpenWound.h b/extensions/medical/OpenWound.h index b2a9baccb8..4d2d7892eb 100644 --- a/extensions/medical/OpenWound.h +++ b/extensions/medical/OpenWound.h @@ -8,14 +8,16 @@ namespace ace { class OpenWound { public: - OpenWound(double anID, double aBodyPart, double bloodloss); + OpenWound(int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount); ~OpenWound(); std::string AsString(); - double classID; + int classID; + int percentage; double bodyPart; double bloodlossRate; + double pain; }; } diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 93094ab2bb..6fbc53e071 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -28,22 +28,82 @@ namespace ace { int selectionN = SelectionToNumber(selectionName); if (selectionN >= 0) { - // std::vector> injuryTypeInfo = GetInjuryInfoFor(typeOfDamage); + wounds = GetInjuryInfoFor(typeOfDamage, amountOfDamage, selectionN); } - return wounds; } + std::vector handleDamage::GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection) + { + std::vector injuriesToAdd; + std::vector> information; + std::shared_ptr highestSpot; + + for each (std::shared_ptr damageType in damageTypes) + { + if (damageType->typeName == typeOfDamage) + { + for each (std::shared_ptr possibleInjury in damageType->possibleInjuries) + { + if (amountOfDamage >= possibleInjury->minDamage && (amountOfDamage <= possibleInjury->maxDamage || possibleInjury->maxDamage == 0)) + { + if (highestSpot == NULL) + highestSpot = possibleInjury; + + if (possibleInjury->minDamage > highestSpot->minDamage) + highestSpot = possibleInjury; + + information.push_back(possibleInjury); + } + } + + int c = 0; + for each (double threshold in damageType->minDamageThreshold) + { + if (threshold >= amountOfDamage) + { + double amountOfInjuriesOnDamage = damageType->amountOfInjuresOnDamage.at(c); + for (double injuryAmount = 0; injuryAmount < amountOfInjuriesOnDamage; ++injuryAmount) + { + std::shared_ptr injuryToAdd; + if (rand() % 1 >= 0.85) + { + injuryToAdd = highestSpot; + } + else + { + injuryToAdd = information.at(0); + } + + int bodyPartID = selection; + if (!damageType->selectionSpecific) + { + bodyPartID = rand() % 6; + } + + injuries::OpenWound newWound(injuryToAdd->ID, bodyPartID, 1, injuryToAdd->bloodLoss, injuryToAdd->pain); + injuriesToAdd.push_back(newWound); + } + } + ++c; + } + return injuriesToAdd; + } + } + return injuriesToAdd; + } + /* static */ void handleDamage::AddDamageType(const std::vector& input) { - if (input.size() == 4) + if (input.size() == 5) { std::string typeName = input[0]; double minimalLethalDamage = std::stod(input[1]); - double minDamageThreshold = std::stod(input[2]); - double maxDamageThreshold = std::stod(input[3]); + std::vector minDamageThreshold;// = std::stod(input[2]); + std::vector amountOfInjuresOnDamage; //= std::stod(input[3]); + bool selectionSpecific = std::stod(input[4]) > 0; - std::shared_ptr type(new ace::medical::injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, maxDamageThreshold)); + std::shared_ptr type(new ace::medical::injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, amountOfInjuresOnDamage, selectionSpecific)); damageTypes.push_back(type); } } diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h index 5959e58653..fdaa952bfd 100644 --- a/extensions/medical/handleDamage.h +++ b/extensions/medical/handleDamage.h @@ -28,6 +28,8 @@ namespace ace { */ std::vector HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage); + std::vector GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection); + /** * */ From eb2383a6f076d07287ab2c2e3367166b849d1f5c Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 14 May 2015 18:56:23 +0200 Subject: [PATCH 024/664] tabs --- extensions/medical/DamageType.h | 4 +- extensions/medical/InjuryType.h | 2 +- extensions/medical/OpenWound.cpp | 2 +- extensions/medical/OpenWound.h | 4 +- extensions/medical/handleDamage.cpp | 272 ++++++++++++++-------------- extensions/medical/handleDamage.h | 16 +- 6 files changed, 150 insertions(+), 150 deletions(-) diff --git a/extensions/medical/DamageType.h b/extensions/medical/DamageType.h index de8e73a07d..3cd9fb41d0 100644 --- a/extensions/medical/DamageType.h +++ b/extensions/medical/DamageType.h @@ -17,9 +17,9 @@ namespace ace { std::string typeName; double minLethalDamage; std::vector minDamageThreshold; - std::vector amountOfInjuresOnDamage; + std::vector amountOfInjuresOnDamage; - bool selectionSpecific; + bool selectionSpecific; std::vector> possibleInjuries; }; diff --git a/extensions/medical/InjuryType.h b/extensions/medical/InjuryType.h index ad99518252..2790917468 100644 --- a/extensions/medical/InjuryType.h +++ b/extensions/medical/InjuryType.h @@ -9,7 +9,7 @@ namespace ace { class InjuryType { public: - InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, double theBloodLoss, double thePain, double minimumDamage, double maximumDamage, std::vector& possibleCauses, std::string& aDisplayname); + InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, double theBloodLoss, double thePain, double minimumDamage, double maximumDamage, std::vector& possibleCauses, std::string& aDisplayname); ~InjuryType(); signed int ID; diff --git a/extensions/medical/OpenWound.cpp b/extensions/medical/OpenWound.cpp index b28cf79df5..62eadfdfe9 100644 --- a/extensions/medical/OpenWound.cpp +++ b/extensions/medical/OpenWound.cpp @@ -2,7 +2,7 @@ #include ace::medical::injuries::OpenWound::OpenWound(int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount) : - classID(aClassID), bodyPart(aBodyPartId), percentage(aPercentage), bloodlossRate(aBl), pain(painAmount) + classID(aClassID), bodyPart(aBodyPartId), percentage(aPercentage), bloodlossRate(aBl), pain(painAmount) { } diff --git a/extensions/medical/OpenWound.h b/extensions/medical/OpenWound.h index 4d2d7892eb..00e6c1fe7a 100644 --- a/extensions/medical/OpenWound.h +++ b/extensions/medical/OpenWound.h @@ -14,10 +14,10 @@ namespace ace { std::string AsString(); int classID; - int percentage; + int percentage; double bodyPart; double bloodlossRate; - double pain; + double pain; }; } diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 6fbc53e071..1e2cf53e84 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -5,159 +5,159 @@ #include namespace ace { - namespace medical { + namespace medical { - handleDamage::handleDamage() - { - } + handleDamage::handleDamage() + { + } - handleDamage& handleDamage::GetInstance() - { - static handleDamage instance; - return instance; - } + handleDamage& handleDamage::GetInstance() + { + static handleDamage instance; + return instance; + } - handleDamage::~handleDamage() - { - } + handleDamage::~handleDamage() + { + } - /* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage) - { - std::vector wounds; - int selectionN = SelectionToNumber(selectionName); - if (selectionN >= 0) - { - wounds = GetInjuryInfoFor(typeOfDamage, amountOfDamage, selectionN); - } - return wounds; - } + /* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage) + { + std::vector wounds; + int selectionN = SelectionToNumber(selectionName); + if (selectionN >= 0) + { + wounds = GetInjuryInfoFor(typeOfDamage, amountOfDamage, selectionN); + } + return wounds; + } - std::vector handleDamage::GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection) - { - std::vector injuriesToAdd; - std::vector> information; - std::shared_ptr highestSpot; + std::vector handleDamage::GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection) + { + std::vector injuriesToAdd; + std::vector> information; + std::shared_ptr highestSpot; - for each (std::shared_ptr damageType in damageTypes) - { - if (damageType->typeName == typeOfDamage) - { - for each (std::shared_ptr possibleInjury in damageType->possibleInjuries) - { - if (amountOfDamage >= possibleInjury->minDamage && (amountOfDamage <= possibleInjury->maxDamage || possibleInjury->maxDamage == 0)) - { - if (highestSpot == NULL) - highestSpot = possibleInjury; + for each (std::shared_ptr damageType in damageTypes) + { + if (damageType->typeName == typeOfDamage) + { + for each (std::shared_ptr possibleInjury in damageType->possibleInjuries) + { + if (amountOfDamage >= possibleInjury->minDamage && (amountOfDamage <= possibleInjury->maxDamage || possibleInjury->maxDamage == 0)) + { + if (highestSpot == NULL) + highestSpot = possibleInjury; - if (possibleInjury->minDamage > highestSpot->minDamage) - highestSpot = possibleInjury; + if (possibleInjury->minDamage > highestSpot->minDamage) + highestSpot = possibleInjury; - information.push_back(possibleInjury); - } - } + information.push_back(possibleInjury); + } + } - int c = 0; - for each (double threshold in damageType->minDamageThreshold) - { - if (threshold >= amountOfDamage) - { - double amountOfInjuriesOnDamage = damageType->amountOfInjuresOnDamage.at(c); - for (double injuryAmount = 0; injuryAmount < amountOfInjuriesOnDamage; ++injuryAmount) - { - std::shared_ptr injuryToAdd; - if (rand() % 1 >= 0.85) - { - injuryToAdd = highestSpot; - } - else - { - injuryToAdd = information.at(0); - } + int c = 0; + for each (double threshold in damageType->minDamageThreshold) + { + if (threshold >= amountOfDamage) + { + double amountOfInjuriesOnDamage = damageType->amountOfInjuresOnDamage.at(c); + for (double injuryAmount = 0; injuryAmount < amountOfInjuriesOnDamage; ++injuryAmount) + { + std::shared_ptr injuryToAdd; + if (rand() % 1 >= 0.85) + { + injuryToAdd = highestSpot; + } + else + { + injuryToAdd = information.at(0); + } - int bodyPartID = selection; - if (!damageType->selectionSpecific) - { - bodyPartID = rand() % 6; - } - - injuries::OpenWound newWound(injuryToAdd->ID, bodyPartID, 1, injuryToAdd->bloodLoss, injuryToAdd->pain); - injuriesToAdd.push_back(newWound); - } - } - ++c; - } - return injuriesToAdd; - } - } - return injuriesToAdd; - } + int bodyPartID = selection; + if (!damageType->selectionSpecific) + { + bodyPartID = rand() % 6; + } + + injuries::OpenWound newWound(injuryToAdd->ID, bodyPartID, 1, injuryToAdd->bloodLoss, injuryToAdd->pain); + injuriesToAdd.push_back(newWound); + } + } + ++c; + } + return injuriesToAdd; + } + } + return injuriesToAdd; + } - /* static */ void handleDamage::AddDamageType(const std::vector& input) - { - if (input.size() == 5) - { - std::string typeName = input[0]; - double minimalLethalDamage = std::stod(input[1]); - std::vector minDamageThreshold;// = std::stod(input[2]); - std::vector amountOfInjuresOnDamage; //= std::stod(input[3]); - bool selectionSpecific = std::stod(input[4]) > 0; + /* static */ void handleDamage::AddDamageType(const std::vector& input) + { + if (input.size() == 5) + { + std::string typeName = input[0]; + double minimalLethalDamage = std::stod(input[1]); + std::vector minDamageThreshold;// = std::stod(input[2]); + std::vector amountOfInjuresOnDamage; //= std::stod(input[3]); + bool selectionSpecific = std::stod(input[4]) > 0; - std::shared_ptr type(new ace::medical::injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, amountOfInjuresOnDamage, selectionSpecific)); - damageTypes.push_back(type); - } - } + std::shared_ptr type(new ace::medical::injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, amountOfInjuresOnDamage, selectionSpecific)); + damageTypes.push_back(type); + } + } - void handleDamage::AddInjuryType(const std::vector& input) - { - if (input.size() == 9) - { - // TODO parse arrays from string input + void handleDamage::AddInjuryType(const std::vector& input) + { + if (input.size() == 9) + { + // TODO parse arrays from string input - int ID = std::stod(input[0]); - std::string className = input[1]; - std::vector allowedSelections; // input[2]; - double bloodLoss = std::stod(input[3]); - double pain = std::stod(input[4]); + int ID = std::stod(input[0]); + std::string className = input[1]; + std::vector allowedSelections; // input[2]; + double bloodLoss = std::stod(input[3]); + double pain = std::stod(input[4]); - double minDamage = std::stod(input[5]); - double maxDamage = std::stod(input[6]); - std::vector possibleCauses; // input[7]; - std::string displayName = input[8]; + double minDamage = std::stod(input[5]); + double maxDamage = std::stod(input[6]); + std::vector possibleCauses; // input[7]; + std::string displayName = input[8]; - std::shared_ptr type(new ace::medical::injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); - injuryTypes.push_back(type); - } - } + std::shared_ptr type(new ace::medical::injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); + injuryTypes.push_back(type); + } + } - void handleDamage::FinalizeDefinitions() - { - // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. - for each (std::shared_ptr damageType in damageTypes) - { - for each (std::shared_ptr injuryType in injuryTypes) - { - if (find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName) != injuryType->causes.end()) - { - damageType->possibleInjuries.push_back(injuryType); - } - } - } - } + void handleDamage::FinalizeDefinitions() + { + // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. + for each (std::shared_ptr damageType in damageTypes) + { + for each (std::shared_ptr injuryType in injuryTypes) + { + if (find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName) != injuryType->causes.end()) + { + damageType->possibleInjuries.push_back(injuryType); + } + } + } + } - int handleDamage::SelectionToNumber(const std::string& selectionName) - { - // TODO use dynamic selections instead - std::vector selections = { "head", "body", "hand_l", "hand_r", "leg_l", "leg_r" }; - std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); - if (it != selections.end()) - { - return it - selections.begin(); - } - else - { - return -1; // TODO throw exception - } - } - } + int handleDamage::SelectionToNumber(const std::string& selectionName) + { + // TODO use dynamic selections instead + std::vector selections = { "head", "body", "hand_l", "hand_r", "leg_l", "leg_r" }; + std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); + if (it != selections.end()) + { + return it - selections.begin(); + } + else + { + return -1; // TODO throw exception + } + } + } } diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h index fdaa952bfd..16b9cb6783 100644 --- a/extensions/medical/handleDamage.h +++ b/extensions/medical/handleDamage.h @@ -16,10 +16,10 @@ namespace ace { class handleDamage { public: - /** - * - */ - static handleDamage& GetInstance(); + /** + * + */ + static handleDamage& GetInstance(); ~handleDamage(); @@ -28,7 +28,7 @@ namespace ace { */ std::vector HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage); - std::vector GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection); + std::vector GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection); /** * @@ -63,9 +63,9 @@ namespace ace { private: handleDamage(); - - handleDamage(handleDamage const&) = delete; - void operator=(handleDamage const&) = delete; + + handleDamage(handleDamage const&) = delete; + void operator=(handleDamage const&) = delete; std::vector> damageTypes; std::vector> injuryTypes; From 77e13ca5be0f40ecd507c777c8cd46886fc2d4b8 Mon Sep 17 00:00:00 2001 From: jonpas Date: Thu, 14 May 2015 23:18:38 +0200 Subject: [PATCH 025/664] Seperated ACE_Settings --- addons/nametags/ACE_Settings.hpp | 57 ++++++++++++++++++++++++++++++ addons/nametags/config.cpp | 59 +------------------------------- 2 files changed, 58 insertions(+), 58 deletions(-) create mode 100644 addons/nametags/ACE_Settings.hpp diff --git a/addons/nametags/ACE_Settings.hpp b/addons/nametags/ACE_Settings.hpp new file mode 100644 index 0000000000..986b5c187b --- /dev/null +++ b/addons/nametags/ACE_Settings.hpp @@ -0,0 +1,57 @@ +class ACE_Settings { + class GVAR(defaultNametagColor) { + value[] = {0.77, 0.51, 0.08, 1}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = "$STR_ACE_NameTags_DefaultNametagColor"; + }; + class GVAR(showPlayerNames) { + value = 1; + typeName = "SCALAR"; + isClientSettable = 1; + displayName = "$STR_ACE_NameTags_ShowPlayerNames"; + description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; + values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_Enabled", "$STR_ACE_Common_OnlyCursor", "$STR_ACE_Common_OnlyOnKeypress", "$STR_ACE_Common_OnlyCursorAndKeyPress"}; + }; + class GVAR(showPlayerRanks) { + value = 1; + typeName = "BOOL"; + isClientSettable = 1; + displayName = "$STR_ACE_NameTags_ShowPlayerRanks"; + }; + class GVAR(showVehicleCrewInfo) { + value = 1; + typeName = "BOOL"; + isClientSettable = 1; + displayName = "$STR_ACE_NameTags_ShowVehicleCrewInfo"; + }; + class GVAR(showNamesForAI) { + value = 0; + typeName = "BOOL"; + isClientSettable = 1; + displayName = "$STR_ACE_NameTags_ShowNamesForAI"; + }; + class GVAR(showCursorTagForVehicles) { + value = 0; + typeName = "BOOL"; + isClientSettable = 0; + }; + class GVAR(showSoundWaves) { + value = 1; + typeName = "SCALAR"; + isClientSettable = 1; + displayName = "$STR_ACE_NameTags_ShowSoundWaves"; + description = "$STR_ACE_NameTags_ShowSoundWaves_Desc"; + values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_NameTagSettings", "$STR_ACE_Common_AlwaysShowAll"}; + }; + class GVAR(PlayerNamesViewDistance) { + value = 5; + typeName = "SCALAR"; + isClientSettable = 0; + }; + class GVAR(PlayerNamesMaxAlpha) { + value = 0.8; + typeName = "SCALAR"; + isClientSettable = 0; + }; +}; diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index b14873779c..a2d38254f1 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -13,64 +13,7 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" +#include "ACE_Settings.hpp" #include "CfgVehicles.hpp" -class ACE_Settings { - class GVAR(defaultNametagColor) { - value[] = {0.77, 0.51, 0.08, 1}; - typeName = "COLOR"; - isClientSettable = 1; - displayName = "$STR_ACE_NameTags_DefaultNametagColor"; - }; - class GVAR(showPlayerNames) { - value = 1; - typeName = "SCALAR"; - isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowPlayerNames"; - description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; - values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_Enabled", "$STR_ACE_Common_OnlyCursor", "$STR_ACE_Common_OnlyOnKeypress", "$STR_ACE_Common_OnlyCursorAndKeyPress"}; - }; - class GVAR(showPlayerRanks) { - value = 1; - typeName = "BOOL"; - isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowPlayerRanks"; - }; - class GVAR(showVehicleCrewInfo) { - value = 1; - typeName = "BOOL"; - isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowVehicleCrewInfo"; - }; - class GVAR(showNamesForAI) { - value = 0; - typeName = "BOOL"; - isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowNamesForAI"; - }; - class GVAR(showCursorTagForVehicles) { - value = 0; - typeName = "BOOL"; - isClientSettable = 0; - }; - class GVAR(showSoundWaves) { - value = 1; - typeName = "SCALAR"; - isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowSoundWaves"; - description = "$STR_ACE_NameTags_ShowSoundWaves_Desc"; - values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_NameTagSettings", "$STR_ACE_Common_AlwaysShowAll"}; - }; - class GVAR(PlayerNamesViewDistance) { - value = 5; - typeName = "SCALAR"; - isClientSettable = 0; - }; - class GVAR(PlayerNamesMaxAlpha) { - value = 0.8; - typeName = "SCALAR"; - isClientSettable = 0; - }; -}; - #include From 8a2a53ddac43ce53b981a7c6636cade69130ffdc Mon Sep 17 00:00:00 2001 From: jonpas Date: Thu, 14 May 2015 23:26:37 +0200 Subject: [PATCH 026/664] Show player names module option added --- addons/nametags/ACE_Settings.hpp | 2 +- addons/nametags/CfgVehicles.hpp | 29 +++++++++++++++++++ addons/nametags/XEH_postInit.sqf | 8 +++-- .../nametags/functions/fnc_moduleNameTags.sqf | 3 +- addons/nametags/stringtable.xml | 16 +++++----- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/addons/nametags/ACE_Settings.hpp b/addons/nametags/ACE_Settings.hpp index 986b5c187b..3aecd650b4 100644 --- a/addons/nametags/ACE_Settings.hpp +++ b/addons/nametags/ACE_Settings.hpp @@ -11,7 +11,7 @@ class ACE_Settings { isClientSettable = 1; displayName = "$STR_ACE_NameTags_ShowPlayerNames"; description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; - values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_Enabled", "$STR_ACE_Common_OnlyCursor", "$STR_ACE_Common_OnlyOnKeypress", "$STR_ACE_Common_OnlyCursorAndKeyPress"}; + values[] = {"$STR_ACE_NameTags_Disabled", "$STR_ACE_NameTags_Enabled", "$STR_ACE_NameTags_OnlyCursor", "$STR_ACE_NameTags_OnlyOnKeypress", "$STR_ACE_NameTags_OnlyCursorAndKeypress"}; }; class GVAR(showPlayerRanks) { value = 1; diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index fabd3b09cb..ad93cc1c27 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -12,6 +12,35 @@ class CfgVehicles { isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_NameTags_ca.paa)); class Arguments { + class showPlayerNames { + displayName = "$STR_ACE_NameTags_ShowPlayerNames"; + description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; + typeName = "SCALAR"; + defaultValue = 1; + class values { + class Disabled { + name = "$STR_ACE_NameTags_Disabled"; + value = 0; + }; + class Enabled { + default = 1; + name = "$STR_ACE_NameTags_Enabled"; + value = 1; + }; + class OnlyCursor { + name = "$STR_ACE_NameTags_OnlyCursor"; + value = 2; + }; + class OnlyOnKeypress { + name = "$STR_ACE_NameTags_OnlyOnKeypress"; + value = 3; + }; + class OnlyCursorAndKeypress { + name = "$STR_ACE_NameTags_OnlyCursorAndKeypress"; + value = 4; + }; + }; + }; class PlayerNamesViewDistance { displayName = "$STR_ACE_NameTags_PlayerNamesViewDistance_DisplayName"; description = "$STR_ACE_NameTags_PlayerNamesViewDistance_Description"; diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index cea2025dcc..1b649ac8a6 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -1,7 +1,9 @@ // by commy2 and esteldunedain #include "script_component.hpp" -[] call FUNC(initIsSpeaking); +if (QGVAR(showPlayerNames) > 0) then { + [] call FUNC(initIsSpeaking); +}; if (!hasInterface) exitWith {}; @@ -24,4 +26,6 @@ GVAR(ShowNamesTime) = -10; // Draw handle -addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; +if (QGVAR(showPlayerNames) > 0 || QGVAR(showVehicleCrewInfo)) then { + addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; +}; diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index 1bbd4d8efb..0bee0e1a9c 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -20,9 +20,10 @@ if !(_activated) exitWith {}; GVAR(Module) = true; +[_logic, QGVAR(showPlayerNames), "showPlayerNames" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(PlayerNamesViewDistance), "PlayerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(ShowNamesForAI), "ShowNamesForAI" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showVehicleCrewInfo), "showVehicleCrewInfo" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); diag_log text "[ACE]: NameTags Module Initialized."; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index ef94140510..74b8372dc6 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -161,31 +161,31 @@ Moduł ten pozwala dostosować ustawienia i zasięg wyświetlania imion. - + Disabled Wyłączone - + Enabled Włączone - + Only Cursor Tylko pod kursorem - + Only On Keypress Tylko po wciśnięciu klawisza - - Only Cursor and KeyPress + + Only Cursor and Keypress Tylko pod kursorem i po wciśnięciu klawisza - + Use Nametag settings Użyj ustawień imion - + Always Show All Zawsze pokazuj wszystkie From 446ad378caba65feee37e3faceb9c264c03c163a Mon Sep 17 00:00:00 2001 From: jonpas Date: Thu, 14 May 2015 23:27:41 +0200 Subject: [PATCH 027/664] Fixed variable incosistency, string added for new module option --- addons/nametags/ACE_Settings.hpp | 4 ++-- addons/nametags/CfgVehicles.hpp | 2 +- addons/nametags/functions/fnc_moduleNameTags.sqf | 4 ++-- addons/nametags/stringtable.xml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/nametags/ACE_Settings.hpp b/addons/nametags/ACE_Settings.hpp index 3aecd650b4..47d5d00636 100644 --- a/addons/nametags/ACE_Settings.hpp +++ b/addons/nametags/ACE_Settings.hpp @@ -44,12 +44,12 @@ class ACE_Settings { description = "$STR_ACE_NameTags_ShowSoundWaves_Desc"; values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_NameTagSettings", "$STR_ACE_Common_AlwaysShowAll"}; }; - class GVAR(PlayerNamesViewDistance) { + class GVAR(playerNamesViewDistance) { value = 5; typeName = "SCALAR"; isClientSettable = 0; }; - class GVAR(PlayerNamesMaxAlpha) { + class GVAR(playerNamesMaxAlpha) { value = 0.8; typeName = "SCALAR"; isClientSettable = 0; diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index ad93cc1c27..f7d9a78429 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -41,7 +41,7 @@ class CfgVehicles { }; }; }; - class PlayerNamesViewDistance { + class playerNamesViewDistance { displayName = "$STR_ACE_NameTags_PlayerNamesViewDistance_DisplayName"; description = "$STR_ACE_NameTags_PlayerNamesViewDistance_Description"; typeName = "NUMBER"; diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index 0bee0e1a9c..a1d652850d 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -21,9 +21,9 @@ if !(_activated) exitWith {}; GVAR(Module) = true; [_logic, QGVAR(showPlayerNames), "showPlayerNames" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(PlayerNamesViewDistance), "PlayerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(playerNamesViewDistance), "playerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(ShowNamesForAI), "ShowNamesForAI" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showVehicleCrewInfo), "showVehicleCrewInfo" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); diag_log text "[ACE]: NameTags Module Initialized."; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 74b8372dc6..a1c8e4b0c0 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -190,7 +190,7 @@ Zawsze pokazuj wszystkie - + Show player names and its activation. Default: Enabled Opcja ta pozwala dostosować sposób wyświetlania imion nad głowami graczy. Opcja "Tylko po wciśnięciu klawisza" wyświetla imiona tylko przytrzymania klawisza "Modyfikator" dostępnego w menu ustawień addonów -> ACE3. From d7b617f49ebb9c0f31a8180e677a5021ed594a4d Mon Sep 17 00:00:00 2001 From: jonpas Date: Thu, 14 May 2015 23:33:35 +0200 Subject: [PATCH 028/664] Stringtables fixed, variable macro fixed --- addons/nametags/ACE_Settings.hpp | 2 +- addons/nametags/XEH_postInit.sqf | 4 ++-- addons/nametags/stringtable.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/nametags/ACE_Settings.hpp b/addons/nametags/ACE_Settings.hpp index 47d5d00636..56d8556cf8 100644 --- a/addons/nametags/ACE_Settings.hpp +++ b/addons/nametags/ACE_Settings.hpp @@ -42,7 +42,7 @@ class ACE_Settings { isClientSettable = 1; displayName = "$STR_ACE_NameTags_ShowSoundWaves"; description = "$STR_ACE_NameTags_ShowSoundWaves_Desc"; - values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_NameTagSettings", "$STR_ACE_Common_AlwaysShowAll"}; + values[] = {"$STR_ACE_NameTags_Disabled", "$STR_ACE_NameTags_NameTagSettings", "$STR_ACE_NameTags_AlwaysShowAll"}; }; class GVAR(playerNamesViewDistance) { value = 5; diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index 1b649ac8a6..c314a02bad 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -1,7 +1,7 @@ // by commy2 and esteldunedain #include "script_component.hpp" -if (QGVAR(showPlayerNames) > 0) then { +if (GVAR(showPlayerNames) > 0) then { [] call FUNC(initIsSpeaking); }; @@ -26,6 +26,6 @@ GVAR(ShowNamesTime) = -10; // Draw handle -if (QGVAR(showPlayerNames) > 0 || QGVAR(showVehicleCrewInfo)) then { +if (GVAR(showPlayerNames) > 0 || GVAR(showVehicleCrewInfo)) then { addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; }; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index a1c8e4b0c0..e5bc4e9e46 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -190,7 +190,7 @@ Zawsze pokazuj wszystkie - Show player names and its activation. Default: Enabled + Show player names and set their activation. Default: Enabled Opcja ta pozwala dostosować sposób wyświetlania imion nad głowami graczy. Opcja "Tylko po wciśnięciu klawisza" wyświetla imiona tylko przytrzymania klawisza "Modyfikator" dostępnego w menu ustawień addonów -> ACE3. From 22c5c03f6f8b4f000c11feb870d8fd082d588ed8 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 15 May 2015 00:04:20 +0200 Subject: [PATCH 029/664] Removed redundant defaultValue and checks --- addons/nametags/CfgVehicles.hpp | 1 - addons/nametags/XEH_postInit.sqf | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index f7d9a78429..684ded21c9 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -16,7 +16,6 @@ class CfgVehicles { displayName = "$STR_ACE_NameTags_ShowPlayerNames"; description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; typeName = "SCALAR"; - defaultValue = 1; class values { class Disabled { name = "$STR_ACE_NameTags_Disabled"; diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index c314a02bad..d1bd3e932c 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -1,9 +1,7 @@ // by commy2 and esteldunedain #include "script_component.hpp" -if (GVAR(showPlayerNames) > 0) then { - [] call FUNC(initIsSpeaking); -}; +[] call FUNC(initIsSpeaking); if (!hasInterface) exitWith {}; @@ -26,6 +24,6 @@ GVAR(ShowNamesTime) = -10; // Draw handle -if (GVAR(showPlayerNames) > 0 || GVAR(showVehicleCrewInfo)) then { +if (GVAR(showPlayerNames) > 0) then { addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; }; From 5e3b6f389a0abec229e8bfb1738c0a48fb5e16e8 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Thu, 14 May 2015 20:45:53 -0300 Subject: [PATCH 030/664] Reliable settings framework --- addons/common/XEH_postInit.sqf | 20 ++++++++++++++------ addons/common/XEH_preInit.sqf | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 696aa16f9b..7d81c908ad 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -1,12 +1,6 @@ // ACE - Common #include "script_component.hpp" -// Load settings from profile -if (hasInterface) then { - call FUNC(loadSettingsFromProfile); - call FUNC(loadSettingsLocalizedText); -}; - // Listens for global "SettingChanged" events, to update the force status locally ["SettingChanged", { @@ -249,3 +243,17 @@ if(isMultiplayer && { time > 0 || isNull player } ) then { }; }, 0, []] call cba_fnc_addPerFrameHandler; }; + +GVAR(commonPostInited) = true; + +// Create a pfh to wait until all postinits are ready and settings are initialized +[{ + // If post inits are not ready then wait + if !(SLX_XEH_MACHINE select 8) exitWith {}; + // If settings are not initialized then wait + if !(GVAR(SettingsInitialized)) exitWith {}; + + diag_log text format["[ACE] Settings initialized"]; + ["SettingsInitialized", []] call FUNC(localEvent); + +}, 0, []] call cba_fnc_addPerFrameHandler; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 7c8f36163a..2f74cad3a8 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -291,9 +291,22 @@ GVAR(syncedEvents) = HASH_CREATE; //Debug ACE_COUNTERS = []; -// Load settings +// Wait for server settings to arrive +GVAR(SettingsInitialized) = false; +["ServerSettingsReceived", { + // Load user settings from profile + if (hasInterface) then { + call FUNC(loadSettingsFromProfile); + call FUNC(loadSettingsLocalizedText); + }; + GVAR(SettingsInitialized) = true; +}] call FUNC(addEventhandler); + +// Load settings on the server and broadcast them if (isServer) then { call FUNC(loadSettingsOnServer); + // Raise a local event for other modules to listen too + ["SettingsInitialized", []] call FUNC(localEvent); }; ACE_player = player; From 6774739854068b49d86385c4802180220acbaacd Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Thu, 14 May 2015 20:54:11 -0300 Subject: [PATCH 031/664] Fix #1201 --- addons/nametags/XEH_postInit.sqf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index cea2025dcc..4537e07132 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -23,5 +23,8 @@ GVAR(ShowNamesTime) = -10; [29, [false, false, false]], false] call cba_fnc_addKeybind; //LeftControl Key -// Draw handle -addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; +// Wait until the colors are defined before starting to draw the nametags +["SettingsInitialized", { + // Draw handle + addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; +}] call EFUNC(common,addEventHandler); From ca94fd4c787bc28443612098c437ed717753d8ae Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Thu, 14 May 2015 20:58:45 -0300 Subject: [PATCH 032/664] Remove the pfh --- addons/common/XEH_postInit.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 7d81c908ad..0c664c3af5 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -253,6 +253,8 @@ GVAR(commonPostInited) = true; // If settings are not initialized then wait if !(GVAR(SettingsInitialized)) exitWith {}; + [(_this select 1)] call cba_fnc_removePerFrameHandler; + diag_log text format["[ACE] Settings initialized"]; ["SettingsInitialized", []] call FUNC(localEvent); From 62d7ea0b03ab2169ce6e67549ea0b4f08b13896d Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 15 May 2015 16:31:06 +0200 Subject: [PATCH 033/664] Fixed module entry not taking effect --- addons/nametags/CfgVehicles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index 684ded21c9..5d430fdf93 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -15,7 +15,7 @@ class CfgVehicles { class showPlayerNames { displayName = "$STR_ACE_NameTags_ShowPlayerNames"; description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; - typeName = "SCALAR"; + typeName = "NUMBER"; class values { class Disabled { name = "$STR_ACE_NameTags_Disabled"; From a7cd36bc3e200e03f5a08ae04c256c0c3d524d87 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 15 May 2015 16:52:27 +0200 Subject: [PATCH 034/664] Added Force setting --- addons/nametags/ACE_Settings.hpp | 6 ++++++ addons/nametags/CfgVehicles.hpp | 6 ++++++ addons/nametags/functions/fnc_moduleNameTags.sqf | 6 +++++- addons/nametags/stringtable.xml | 6 ++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/addons/nametags/ACE_Settings.hpp b/addons/nametags/ACE_Settings.hpp index 56d8556cf8..41c30b1da4 100644 --- a/addons/nametags/ACE_Settings.hpp +++ b/addons/nametags/ACE_Settings.hpp @@ -13,6 +13,12 @@ class ACE_Settings { description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; values[] = {"$STR_ACE_NameTags_Disabled", "$STR_ACE_NameTags_Enabled", "$STR_ACE_NameTags_OnlyCursor", "$STR_ACE_NameTags_OnlyOnKeypress", "$STR_ACE_NameTags_OnlyCursorAndKeypress"}; }; + class GVAR(showPlayerNamesForce) { + value = 0; + typeName = "BOOL"; + displayName = "$STR_ACE_NameTags_ShowPlayerNamesForce"; + description = "$STR_ACE_NameTags_ShowPlayerNamesForce_Desc"; + }; class GVAR(showPlayerRanks) { value = 1; typeName = "BOOL"; diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index 5d430fdf93..13e3ccc6fd 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -40,6 +40,12 @@ class CfgVehicles { }; }; }; + class showPlayerNamesForce { + displayName = "$STR_ACE_NameTags_ShowPlayerNamesForce"; + description = "$STR_ACE_NameTags_ShowPlayerNamesForce_Desc"; + typeName = "BOOL"; + defaultValue = 0; + }; class playerNamesViewDistance { displayName = "$STR_ACE_NameTags_PlayerNamesViewDistance_DisplayName"; description = "$STR_ACE_NameTags_PlayerNamesViewDistance_Description"; diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index a1d652850d..bc9f6f909f 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -20,10 +20,14 @@ if !(_activated) exitWith {}; GVAR(Module) = true; -[_logic, QGVAR(showPlayerNames), "showPlayerNames" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(playerNamesViewDistance), "playerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(ShowNamesForAI), "ShowNamesForAI" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showVehicleCrewInfo), "showVehicleCrewInfo" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(showPlayerNamesForce), "showPlayerNamesForce" ] call EFUNC(common,readSettingFromModule); + +if (GVAR(showPlayerNamesForce)) then { + [_logic, QGVAR(showPlayerNames), "showPlayerNames" ] call EFUNC(common,readSettingFromModule); +}; diag_log text "[ACE]: NameTags Module Initialized."; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index e5bc4e9e46..5e20f348a8 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -25,6 +25,12 @@ Mostra i nomi dei giocatori Показывать имена игроков (включить имена) + + Force show player names setting + + + Force name tags option, or by default allows players to choose it on their own. Default: Do Not Force + Show player name only on cursor (requires player names) Pokaż imiona graczy tylko pod kursorem (wymagana opcja Pokaż imiona graczy) From 2edbacd15b1af1e0889f41b86e3c6cc6dd4707ac Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 15 May 2015 17:16:55 +0200 Subject: [PATCH 035/664] Added SettingChanged EH and proper handling --- addons/nametags/XEH_postInit.sqf | 20 +++++++++++++++++-- .../nametags/functions/fnc_moduleNameTags.sqf | 2 +- addons/nametags/stringtable.xml | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index d1bd3e932c..73dbd955a8 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -23,7 +23,23 @@ GVAR(ShowNamesTime) = -10; [29, [false, false, false]], false] call cba_fnc_addKeybind; //LeftControl Key -// Draw handle +// Draw handle on start if set if (GVAR(showPlayerNames) > 0) then { - addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; + GVAR(drawHandler) = addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; }; + +// Set the EH which waits for a setting to be changed, so that the effect is shown immediately +if (!GVAR(showPlayerNamesForce)) then { + ["SettingChanged", { + PARAMS_2(_name,_value) + if (_name == QGVAR(showPlayerNames)) then { + if ((GVAR(showPlayerNames) > 0) && (_value == 0)) then { + removeMissionEventHandler ["Draw3D", GVAR(drawHandler)]; + GVAR(drawHandler) = nil; + }; + if ((GVAR(showPlayerNames) == 0) && (_value > 0)) then { + GVAR(drawHandler) = addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; + }; + }; + }] call ace_common_fnc_addEventHandler; +}; \ No newline at end of file diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index bc9f6f909f..12f03e61ca 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -30,4 +30,4 @@ if (GVAR(showPlayerNamesForce)) then { [_logic, QGVAR(showPlayerNames), "showPlayerNames" ] call EFUNC(common,readSettingFromModule); }; -diag_log text "[ACE]: NameTags Module Initialized."; +diag_log format ["[ACE]: NameTags Module Initialized. Forced Name Tags Setting: %1",GVAR(showPlayerNamesForce)]; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 5e20f348a8..df0f42ec79 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -26,7 +26,7 @@ Показывать имена игроков (включить имена) - Force show player names setting + Force names setting Force name tags option, or by default allows players to choose it on their own. Default: Do Not Force From 1ccc7e1e0ace8f2bc6606bfb56e10d3a96d39285 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 15 May 2015 17:44:58 +0200 Subject: [PATCH 036/664] CBA Macro for addEventHandler --- addons/nametags/XEH_postInit.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index 73dbd955a8..b7a28b7f6c 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -41,5 +41,5 @@ if (!GVAR(showPlayerNamesForce)) then { GVAR(drawHandler) = addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; }; }; - }] call ace_common_fnc_addEventHandler; -}; \ No newline at end of file + }] call EFUNC(common,addEventHandler); +}; From 02b9df1bc31e54bee23ac9a0d2825e0ed723b56a Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 15 May 2015 18:13:10 +0200 Subject: [PATCH 037/664] Fixed client setting Draw3D installation/removal handling --- addons/nametags/XEH_postInit.sqf | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index b7a28b7f6c..1cf8b6b800 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -33,12 +33,13 @@ if (!GVAR(showPlayerNamesForce)) then { ["SettingChanged", { PARAMS_2(_name,_value) if (_name == QGVAR(showPlayerNames)) then { - if ((GVAR(showPlayerNames) > 0) && (_value == 0)) then { - removeMissionEventHandler ["Draw3D", GVAR(drawHandler)]; - GVAR(drawHandler) = nil; - }; - if ((GVAR(showPlayerNames) == 0) && (_value > 0)) then { + if (isNil(QGVAR(drawHandler)) && {_value > 0}) then { GVAR(drawHandler) = addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; + } else { + if (_value == 0) then { + removeMissionEventHandler ["Draw3D", GVAR(drawHandler)]; + GVAR(drawHandler) = nil; + }; }; }; }] call EFUNC(common,addEventHandler); From d189cffce63bbabf8958f6092bdd8a3b44ee67fb Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Fri, 15 May 2015 15:49:22 -0300 Subject: [PATCH 038/664] Fix event names --- addons/common/XEH_preInit.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 2f74cad3a8..922b0ed7f9 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -294,6 +294,7 @@ ACE_COUNTERS = []; // Wait for server settings to arrive GVAR(SettingsInitialized) = false; ["ServerSettingsReceived", { + diag_log text format["[ACE] Settings received from server"]; // Load user settings from profile if (hasInterface) then { call FUNC(loadSettingsFromProfile); @@ -306,7 +307,7 @@ GVAR(SettingsInitialized) = false; if (isServer) then { call FUNC(loadSettingsOnServer); // Raise a local event for other modules to listen too - ["SettingsInitialized", []] call FUNC(localEvent); + ["ServerSettingsReceived", []] call FUNC(localEvent); }; ACE_player = player; From 7c96c12bd59574b81e231d605f5cd86de700bdc5 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 16 May 2015 00:07:38 +0200 Subject: [PATCH 039/664] Made forced settings through module in original entry, Reworked Draw3D handling, Some strings cleanup --- addons/nametags/ACE_Settings.hpp | 8 +---- addons/nametags/CfgVehicles.hpp | 32 +++++++++--------- addons/nametags/XEH_postInit.sqf | 33 +++++++------------ addons/nametags/XEH_preInit.sqf | 1 + .../nametags/functions/fnc_moduleNameTags.sqf | 8 ++--- .../nametags/functions/fnc_updateSettings.sqf | 26 +++++++++++++++ addons/nametags/stringtable.xml | 29 ++++++++-------- 7 files changed, 74 insertions(+), 63 deletions(-) create mode 100644 addons/nametags/functions/fnc_updateSettings.sqf diff --git a/addons/nametags/ACE_Settings.hpp b/addons/nametags/ACE_Settings.hpp index 41c30b1da4..72ae5c27df 100644 --- a/addons/nametags/ACE_Settings.hpp +++ b/addons/nametags/ACE_Settings.hpp @@ -11,13 +11,7 @@ class ACE_Settings { isClientSettable = 1; displayName = "$STR_ACE_NameTags_ShowPlayerNames"; description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; - values[] = {"$STR_ACE_NameTags_Disabled", "$STR_ACE_NameTags_Enabled", "$STR_ACE_NameTags_OnlyCursor", "$STR_ACE_NameTags_OnlyOnKeypress", "$STR_ACE_NameTags_OnlyCursorAndKeypress"}; - }; - class GVAR(showPlayerNamesForce) { - value = 0; - typeName = "BOOL"; - displayName = "$STR_ACE_NameTags_ShowPlayerNamesForce"; - description = "$STR_ACE_NameTags_ShowPlayerNamesForce_Desc"; + values[] = {"$STR_ACE_NameTags_Disabled", "$STR_ACE_NameTags_Enabled", "$STR_ACE_NameTags_OnlyCursor", "$STR_ACE_NameTags_OnlyKeypress", "$STR_ACE_NameTags_OnlyCursorAndKeypress"}; }; class GVAR(showPlayerRanks) { value = 1; diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index 13e3ccc6fd..7c2661efbe 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -17,35 +17,33 @@ class CfgVehicles { description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; typeName = "NUMBER"; class values { - class Disabled { - name = "$STR_ACE_NameTags_Disabled"; + class DoNotForce { + default = 1; + name = "$STR_ACE_NameTags_DoNotForce"; + value = -1; + }; + class ForceHide { + name = "$STR_ACE_NameTags_ForceHide"; value = 0; }; - class Enabled { - default = 1; - name = "$STR_ACE_NameTags_Enabled"; + class ForceShow { + name = "$STR_ACE_NameTags_ForceShow"; value = 1; }; - class OnlyCursor { - name = "$STR_ACE_NameTags_OnlyCursor"; + class ForceShowOnlyCursor { + name = "$STR_ACE_NameTags_ForceShowOnlyCursor"; value = 2; }; - class OnlyOnKeypress { - name = "$STR_ACE_NameTags_OnlyOnKeypress"; + class ForceShowOnlyKeypress { + name = "$STR_ACE_NameTags_ForceShowOnlyKeypress"; value = 3; }; - class OnlyCursorAndKeypress { - name = "$STR_ACE_NameTags_OnlyCursorAndKeypress"; + class ForceShowOnlyCursorAndKeypress { + name = "$STR_ACE_NameTags_ForceShowOnlyCursorAndKeypress"; value = 4; }; }; }; - class showPlayerNamesForce { - displayName = "$STR_ACE_NameTags_ShowPlayerNamesForce"; - description = "$STR_ACE_NameTags_ShowPlayerNamesForce_Desc"; - typeName = "BOOL"; - defaultValue = 0; - }; class playerNamesViewDistance { displayName = "$STR_ACE_NameTags_PlayerNamesViewDistance_DisplayName"; description = "$STR_ACE_NameTags_PlayerNamesViewDistance_Description"; diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index 1cf8b6b800..a9ac8195dd 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -5,7 +5,7 @@ if (!hasInterface) exitWith {}; -GVAR(ShowNamesTime) = -10; +GVAR(showNamesTime) = -10; // Add keybinds ["ACE3 Common", QGVAR(showNameTags), localize "STR_ACE_NameTags_ShowNames", @@ -14,7 +14,7 @@ GVAR(ShowNamesTime) = -10; if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement - GVAR(ShowNamesTime) = time; + GVAR(showNamesTime) = time; if (call FUNC(canShow)) then{ call FUNC(doShow); }; // Return false so it doesn't block other actions false @@ -23,24 +23,13 @@ GVAR(ShowNamesTime) = -10; [29, [false, false, false]], false] call cba_fnc_addKeybind; //LeftControl Key -// Draw handle on start if set -if (GVAR(showPlayerNames) > 0) then { - GVAR(drawHandler) = addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; -}; +// Draw handle +call FUNC(updateSettings); -// Set the EH which waits for a setting to be changed, so that the effect is shown immediately -if (!GVAR(showPlayerNamesForce)) then { - ["SettingChanged", { - PARAMS_2(_name,_value) - if (_name == QGVAR(showPlayerNames)) then { - if (isNil(QGVAR(drawHandler)) && {_value > 0}) then { - GVAR(drawHandler) = addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; - } else { - if (_value == 0) then { - removeMissionEventHandler ["Draw3D", GVAR(drawHandler)]; - GVAR(drawHandler) = nil; - }; - }; - }; - }] call EFUNC(common,addEventHandler); -}; +// Change settings accordingly when they are changed +["SettingChanged", { + PARAMS_1(_name); + if (_name == QGVAR(showPlayerNames)) then { + call FUNC(updateSettings); + }; +}] call EFUNC(common,addEventHandler); diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index f3c9a97cba..51b926cbb3 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -10,5 +10,6 @@ PREP(initIsSpeaking); PREP(moduleNameTags); PREP(onDraw3d); PREP(setText); +PREP(updateSettings); ADDON = true; diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index 12f03e61ca..7373d85de1 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -21,13 +21,13 @@ if !(_activated) exitWith {}; GVAR(Module) = true; [_logic, QGVAR(playerNamesViewDistance), "playerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(ShowNamesForAI), "ShowNamesForAI" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(showNamesForAI), "showNamesForAI" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showVehicleCrewInfo), "showVehicleCrewInfo" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(showPlayerNamesForce), "showPlayerNamesForce" ] call EFUNC(common,readSettingFromModule); -if (GVAR(showPlayerNamesForce)) then { +// Do Not Force - read module setting only non-default is set due to using SCALAR +if ((_logic getVariable "showPlayerNames") != -1) then { [_logic, QGVAR(showPlayerNames), "showPlayerNames" ] call EFUNC(common,readSettingFromModule); }; -diag_log format ["[ACE]: NameTags Module Initialized. Forced Name Tags Setting: %1",GVAR(showPlayerNamesForce)]; +diag_log text "[ACE]: NameTags Module Initialized."; diff --git a/addons/nametags/functions/fnc_updateSettings.sqf b/addons/nametags/functions/fnc_updateSettings.sqf new file mode 100644 index 0000000000..237eb438fd --- /dev/null +++ b/addons/nametags/functions/fnc_updateSettings.sqf @@ -0,0 +1,26 @@ +/* + * Author: Jonpas + * Dynamically adds and removes Draw3D based on settings on run-time. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_nametags_fnc_updateSettings + * + * Public: No + */ + +#include "script_component.hpp" + +if (isNil QGVAR(drawHandler) && {GVAR(showPlayerNames) != 0}) then { + GVAR(drawHandler) = addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; +} else { + if (!isNil QGVAR(drawHandler) && {GVAR(showPlayerNames) == 0}) then { + removeMissionEventHandler ["Draw3D", GVAR(drawHandler)]; + GVAR(drawHandler) = nil; + }; +}; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index df0f42ec79..7aa531fc28 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -25,12 +25,6 @@ Mostra i nomi dei giocatori Показывать имена игроков (включить имена) - - Force names setting - - - Force name tags option, or by default allows players to choose it on their own. Default: Do Not Force - Show player name only on cursor (requires player names) Pokaż imiona graczy tylko pod kursorem (wymagana opcja Pokaż imiona graczy) @@ -144,7 +138,7 @@ Wymuś ukrycie - Force show + Force Show Wymuś wyświetlanie @@ -164,7 +158,7 @@ Pokazuj imię dowódcy pojazdu nad pojazdem (tylko jeżeli klient ma włączone imiona graczy). Domyślnie: Nie - + This module allows you to customize settings and range of Name Tags. Moduł ten pozwala dostosować ustawienia i zasięg wyświetlania imion. @@ -176,17 +170,26 @@ Włączone - Only Cursor + Only on Cursor Tylko pod kursorem - - Only On Keypress + + Only on Keypress Tylko po wciśnięciu klawisza - Only Cursor and Keypress + Only on Cursor and Keypress Tylko pod kursorem i po wciśnięciu klawisza + + Force Show Only on Cursor + + + Force Show Only on Keypress + + + Force Show Only on Cursor and Keypress + Use Nametag settings Użyj ustawień imion @@ -200,7 +203,7 @@ Opcja ta pozwala dostosować sposób wyświetlania imion nad głowami graczy. Opcja "Tylko po wciśnięciu klawisza" wyświetla imiona tylko przytrzymania klawisza "Modyfikator" dostępnego w menu ustawień addonów -> ACE3. - + Effect of sound waves above the heads of speaking players after holding the PTT key. This option works with TFAR and ACRE2. Opcja ta pozwala dostosować sposób wyświetlania efektu fal dźwiękowych nad głowami mówiących graczy, wyświetlanych po przytrzymaniu klawisza PTT. Opcja ta współpracuje z TFAR oraz ACRE2. From bffe58efd6a331ca423429e318db4dd5e6665185 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 16 May 2015 00:22:23 +0200 Subject: [PATCH 040/664] Name Tags cleanup --- addons/nametags/functions/common.hpp | 12 ++--- addons/nametags/functions/fnc_canShow.sqf | 29 +++++----- addons/nametags/functions/fnc_doShow.sqf | 26 ++++----- .../functions/fnc_drawNameTagIcon.sqf | 14 +++-- .../nametags/functions/fnc_getVehicleData.sqf | 53 ++++++++----------- .../nametags/functions/fnc_initIsSpeaking.sqf | 6 +-- addons/nametags/functions/fnc_onDraw3d.sqf | 15 ++++++ addons/nametags/functions/fnc_setText.sqf | 33 ++++++------ .../nametags/functions/fnc_updateSettings.sqf | 1 - 9 files changed, 100 insertions(+), 89 deletions(-) diff --git a/addons/nametags/functions/common.hpp b/addons/nametags/functions/common.hpp index caa7a3e982..6aeb24fc5a 100644 --- a/addons/nametags/functions/common.hpp +++ b/addons/nametags/functions/common.hpp @@ -1,12 +1,8 @@ /* - Author: aeroson - - Description: - Images, index in images and order of roles. - Defined number also implies order, lower number shows more on top of the list. -*/ - -#include "script_component.hpp" + * Author: aeroson + * Images, index in images and order of roles. + * Defined number also implies order, lower number shows more on top of the list. + */ #define PILOT 0 #define DRIVER 1 diff --git a/addons/nametags/functions/fnc_canShow.sqf b/addons/nametags/functions/fnc_canShow.sqf index 0e187fee0f..b53f50c93e 100644 --- a/addons/nametags/functions/fnc_canShow.sqf +++ b/addons/nametags/functions/fnc_canShow.sqf @@ -1,19 +1,22 @@ /* - Author: aeroson - - Description: - Might be called several times a second - - Parameters: - None - - Returns: - true if CrewInfo can be shown, false otherwise -*/ - + * Author: aeroson + * Checks if crew info can be shown. + * Might be called several times a second. + * + * Arguments: + * None + * + * Return Value: + * Can show Crew Info + * + * Example: + * call ace_nametags_fnc_doShow + * + * Public: No + */ #include "script_component.hpp" -private["_player"]; +private ["_player"]; _player = ACE_player; diff --git a/addons/nametags/functions/fnc_doShow.sqf b/addons/nametags/functions/fnc_doShow.sqf index 16a6329347..1b7323921f 100644 --- a/addons/nametags/functions/fnc_doShow.sqf +++ b/addons/nametags/functions/fnc_doShow.sqf @@ -1,16 +1,18 @@ /* - Author: aeroson - - Description: - Shows the actual text and sets text the crew info - - Parameters: - None - - Returns: - Nothing -*/ - + * Author: aeroson + * Shows the actual text and sets text the crew info. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_nametags_fnc_doShow + * + * Public: No + */ #include "script_component.hpp" #include "common.hpp"; diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index 6a7db7d5ac..58f5c8e014 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -1,17 +1,21 @@ /* * Author: commy2, esteldunedain - * * Draw the nametag and rank icon. * - * Argument: + * Arguments: * 0: Unit (Player) * 1: Target - * 2: alpha (Number) - * 4: Height offset (Number) + * 2: Alpha + * 4: Height offset * 5: Draw Type * * Return value: - * None. + * None + * + * Example: + * [ACE_player, _target, _alpha, _distance * 0.026, _icon] call ace_nametags_fnc_drawNameTagIcon + * + * Public: No */ #include "script_component.hpp" diff --git a/addons/nametags/functions/fnc_getVehicleData.sqf b/addons/nametags/functions/fnc_getVehicleData.sqf index 1538c345a1..6d83b0f573 100644 --- a/addons/nametags/functions/fnc_getVehicleData.sqf +++ b/addons/nametags/functions/fnc_getVehicleData.sqf @@ -1,46 +1,38 @@ /* - Author: aeroson - - Description: - Gathers and caches data needed by AGM_CrewInfo_fnc_doShow - What really does make difference for the engine is simulation of CfgAmmo - Priority of roles is: driver/pilot, gunner, copilot, commander, ffv, cargo - - Parameters: - None - - Returns: - [ - Is vehicle inherited from Air ? - Array categorizing each vehicle's turret - ] -*/ - + * Author: aeroson + * Gathers and caches data needed by AGM_CrewInfo_fnc_doShow. + * What really does make difference for the engine is simulation of CfgAmmo. + * Priority of roles is: driver/pilot, gunner, copilot, commander, FFV, cargo. + * + * Arguments: + * None + * + * Return Value: + * Data + * 0: Vehicle inherits from Air + * 1: Categorized vehicle's turrets + * + * Example: + * call ace_nametags_fnc_updateSettings + * + * Public: No + */ #include "script_component.hpp" #include "common.hpp"; +private ["_type", "_varName", "_data", "_isAir", "_config", "_fnc_addTurret", "_fnc_addTurretUnit"]; -private ["_type", "_varName", "_data"]; - -_type = _this select 0; +PARAMS_1(_type); _varName = format ["ACE_CrewInfo_Cache_%1", _type]; _data = + (uiNamespace getVariable _varName); -if (!isNil "_data") exitWith { - _data -}; +if (!isNil "_data") exitWith {_data}; _data = []; - - - -private ["_isAir", "_config", "_fnc_addTurret", "_fnc_addTurretUnit"]; - _isAir = _type isKindOf "Air"; _fnc_addTurretUnit = { - private ["_config", "_path", "_role", "_simulationEmpty", "_simulationLaserDesignate", "_simulationOther", "_magazine", "_ammo", "_simulation"]; _config = _this select 0; @@ -83,7 +75,6 @@ _fnc_addTurretUnit = { }; _data pushBack [_path, _role]; - }; @@ -108,9 +99,7 @@ _fnc_addTurret = { } else { _offset = _offset + 1; }; - }; - }; diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index c6087541a8..897d223930 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -4,13 +4,13 @@ * Compatiblity with TFR/ACRE and Arma's VON * * Arguments: - * NONE + * None * * Return Value: - * NONE + * None * * Example: - * [] call ACE_nametags_fnc_initIsSpeaking + * [] call ace_nametags_fnc_initIsSpeaking * * Public: No */ diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index 9efc70aeb9..e88f606c05 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -1,3 +1,18 @@ +/* + * Author: + * Draws names and icons. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_nametags_fnc_onDraw3d + * + * Public: No + */ #include "script_component.hpp" private ["_onKeyPressAlphaMax", "_defaultIcon", "_distance", "_alpha", "_icon", "_targets", "_pos2", "_vecy", "_relPos", "_projDist", "_pos", "_target"]; diff --git a/addons/nametags/functions/fnc_setText.sqf b/addons/nametags/functions/fnc_setText.sqf index e7d1b748b1..33112c31d0 100644 --- a/addons/nametags/functions/fnc_setText.sqf +++ b/addons/nametags/functions/fnc_setText.sqf @@ -1,25 +1,28 @@ -/* - Author: aeroson - - Description: - Sets the text on the dialog - - Parameters: - None - - Returns: - Nothing -*/ - +/* + * Author: aeroson + * Sets the text on the dialog. + * + * Arguments: + * 0: Text + * + * Return Value: + * None + * + * Example: + * call ace_nametags_fnc_setText + * + * Public: No + */ #include "script_component.hpp" #define TextIDC 11123 -private["_text", "_ctrl"]; +PARAMS_1(_text); + +private["_ctrl"]; disableSerialization; -_text = _this select 0; _ctrl = (uiNamespace getVariable QGVAR(dialog)) displayCtrl TextIDC; _ctrl ctrlSetStructuredText parseText _text; _ctrl ctrlCommit 0; diff --git a/addons/nametags/functions/fnc_updateSettings.sqf b/addons/nametags/functions/fnc_updateSettings.sqf index 237eb438fd..76110b4f79 100644 --- a/addons/nametags/functions/fnc_updateSettings.sqf +++ b/addons/nametags/functions/fnc_updateSettings.sqf @@ -13,7 +13,6 @@ * * Public: No */ - #include "script_component.hpp" if (isNil QGVAR(drawHandler) && {GVAR(showPlayerNames) != 0}) then { From cccc741a16f3d3d8ef2aae8e359b7a36026058af Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 16 May 2015 00:54:01 +0200 Subject: [PATCH 041/664] #1123 - Added CheckPBOs to ACE_Settings --- addons/common/CfgVehicles.hpp | 1 + addons/common/config.cpp | 16 ++++++++++++++++ addons/common/functions/fnc_moduleCheckPBOs.sqf | 10 +++++++--- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/addons/common/CfgVehicles.hpp b/addons/common/CfgVehicles.hpp index 1adf622494..ebc65c7394 100644 --- a/addons/common/CfgVehicles.hpp +++ b/addons/common/CfgVehicles.hpp @@ -41,6 +41,7 @@ class CfgVehicles { class Action { displayName = "$STR_ACE_Common_CheckPBO_Action_DisplayName"; description = "$STR_ACE_Common_CheckPBO_Action_Description"; + typeName = "NUMBER"; class values { class WarnOnce { default = 1; diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 3f1e5a6308..0e8286299a 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -88,6 +88,22 @@ class ACE_Settings { value = 0; typeName = "BOOL"; }; + class GVAR(checkPBOsAction) { + value = 0; + typeName = "SCALAR"; + isClientSettable = 0; + values[] = {"$STR_ACE_Common_CheckPBO_Action_WarnOnce", "$STR_ACE_Common_CheckPBO_Action_WarnPerm", "$STR_ACE_Common_CheckPBO_Action_Kick"}; + }; + class GVAR(checkPBOsCheckAll) { + value = 0; + typeName = "BOOL"; + isClientSettable = 0; + }; + class GVAR(checkPBOsWhitelist) { + value = "[]"; + typeName = "STRING"; + isClientSettable = 0; + }; /*class GVAR(enableNumberHotkeys) { value = 1; typeName = "BOOL"; diff --git a/addons/common/functions/fnc_moduleCheckPBOs.sqf b/addons/common/functions/fnc_moduleCheckPBOs.sqf index 05e1037028..aaea9420b7 100644 --- a/addons/common/functions/fnc_moduleCheckPBOs.sqf +++ b/addons/common/functions/fnc_moduleCheckPBOs.sqf @@ -17,9 +17,13 @@ private ["_mode", "_checkAll", "_whitelist"]; if !(_activated) exitWith {}; -_mode = parseNumber (_logic getVariable "Action"); -_checkAll = _logic getVariable ["CheckAll", false]; -_whitelist = call compile (_logic getVariable ["Whitelist", "[]"]); +[_logic, QGVAR(checkPBOsAction), "Action" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(checkPBOsCheckAll), "CheckAll" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(checkPBOsWhitelist), "Whitelist" ] call EFUNC(common,readSettingFromModule); + +_mode = GVAR(checkPBOsAction); +_checkAll = GVAR(checkPBOsCheckAll); +_whitelist = call compile GVAR(checkPBOsWhitelist); if (isNil "_whitelist") then { _whitelist = []; From 1a468cb4fff081ac076b43f743e01df1f1a3394e Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 16 May 2015 01:06:29 +0200 Subject: [PATCH 042/664] Split common ACE_Settings.hpp from config.cpp, shortened sampleSetting --- addons/common/ACE_Settings.hpp | 75 +++++++++++++++++++++++++++++ addons/common/config.cpp | 87 +--------------------------------- 2 files changed, 76 insertions(+), 86 deletions(-) create mode 100644 addons/common/ACE_Settings.hpp diff --git a/addons/common/ACE_Settings.hpp b/addons/common/ACE_Settings.hpp new file mode 100644 index 0000000000..81d4a7b8ed --- /dev/null +++ b/addons/common/ACE_Settings.hpp @@ -0,0 +1,75 @@ +class ACE_Settings { + /* + * class GVAR(sampleSetting) { + * value = 1; // Value + * typeName = "SCALAR"; // Type (SCALAR, BOOL, STRING, ARRAY, COLOR) + * force = 0; // Force the setting? + * isClientSettable = 1; // Does it appear on the options menu? + * + * // The following settings only apply when isClientSettable == 1 + * displayName = "$STR_ACE_Common_SettingName"; // Stringtable entry with the setting name + * description = "$STR_ACE_Common_SettingDescription"; // Stringtable entry with the setting description + * + * // Only applies if typeName == "SCALAR"; + * values[] = {"Disabled", "Enabled", "Only Cursor", "Only On Keypress", "Only Cursor and KeyPress"}; // Stringtable entries that describe the options + * }; + */ + class GVAR(forceAllSettings) { + value = 0; + typeName = "BOOL"; + }; + class GVAR(checkPBOsAction) { + value = 0; + typeName = "SCALAR"; + isClientSettable = 0; + values[] = {"$STR_ACE_Common_CheckPBO_Action_WarnOnce", "$STR_ACE_Common_CheckPBO_Action_WarnPerm", "$STR_ACE_Common_CheckPBO_Action_Kick"}; + }; + class GVAR(checkPBOsCheckAll) { + value = 0; + typeName = "BOOL"; + isClientSettable = 0; + }; + class GVAR(checkPBOsWhitelist) { + value = "[]"; + typeName = "STRING"; + isClientSettable = 0; + }; + /*class GVAR(enableNumberHotkeys) { + value = 1; + typeName = "BOOL"; + isClientSettable = 1; + displayName = "$STR_ACE_Common_EnableNumberHotkeys"; + };*/ + class GVAR(settingFeedbackIcons) { + value = 1; + typeName = "SCALAR"; + force = 0; + isClientSettable = 1; + displayName = "$STR_ACE_Common_SettingFeedbackIconsName"; + description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; + values[] = {"$STR_ACE_Common_Hide", "$STR_ACE_Common_TopRightDown", "$STR_ACE_Common_TopRightLeft", "$STR_ACE_Common_TopLeftDown", "$STR_ACE_Common_TopLeftRight"}; + }; + class GVAR(SettingProgressBarLocation) { + value = 0; + typeName = "SCALAR"; + force = 0; + isClientSettable = 1; + displayName = "$STR_ACE_Common_SettingProgressbarLocationName"; + description = "$STR_ACE_Common_SettingProgressbarLocationDesc"; + values[] = {"$STR_ACE_Common_Top", "$STR_ACE_Common_Bottom"}; + }; + class GVAR(displayTextColor) { + value[] = {0, 0, 0, 0.1}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; + description = "$STR_ACE_Common_SettingDisplayTextColorDesc"; + }; + class GVAR(displayTextFontColor) { + value[] = {1, 1, 1, 1}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = "$STR_ACE_Common_SettingDisplayTextFontColorName"; + description = "$STR_ACE_Common_SettingDisplayTextFontColorDesc"; + }; +}; diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 0e8286299a..190018831a 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -57,92 +57,7 @@ class ACE_Rsc_Control_Base { h = 0; }; -class ACE_Settings { - /* - *class GVAR(sampleSetting) { - * Value - * value = 1; - * - * Type (SCALAR, BOOL, STRING, ARRAY, COLOR) - * typeName = "SCALAR"; - * - * Force the setting? - * force = 0; - * - * Does it appear on the options menu? - * isClientSettable = 1; - * - * The following settings only apply when isClientSettable == 1 - * Stringtable entry with the setting name - * displayName = "$STR_ACE_Common_SettingName"; - * - * Stringtable entry with the setting description - * description = "$STR_ACE_Common_SettingDescription"; - * - * Stringtable entries that describe the options - * Only applies if typeName == "SCALAR"; - * values[] = {"Disabled", "Enabled", "Only Cursor", "Only On Keypress", "Only Cursor and KeyPress"}; - *}; - */ - class GVAR(forceAllSettings) { - value = 0; - typeName = "BOOL"; - }; - class GVAR(checkPBOsAction) { - value = 0; - typeName = "SCALAR"; - isClientSettable = 0; - values[] = {"$STR_ACE_Common_CheckPBO_Action_WarnOnce", "$STR_ACE_Common_CheckPBO_Action_WarnPerm", "$STR_ACE_Common_CheckPBO_Action_Kick"}; - }; - class GVAR(checkPBOsCheckAll) { - value = 0; - typeName = "BOOL"; - isClientSettable = 0; - }; - class GVAR(checkPBOsWhitelist) { - value = "[]"; - typeName = "STRING"; - isClientSettable = 0; - }; - /*class GVAR(enableNumberHotkeys) { - value = 1; - typeName = "BOOL"; - isClientSettable = 1; - displayName = "$STR_ACE_Common_EnableNumberHotkeys"; - };*/ - class GVAR(settingFeedbackIcons) { - value = 1; - typeName = "SCALAR"; - force = 0; - isClientSettable = 1; - displayName = "$STR_ACE_Common_SettingFeedbackIconsName"; - description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; - values[] = {"$STR_ACE_Common_Hide", "$STR_ACE_Common_TopRightDown", "$STR_ACE_Common_TopRightLeft", "$STR_ACE_Common_TopLeftDown", "$STR_ACE_Common_TopLeftRight"}; - }; - class GVAR(SettingProgressBarLocation) { - value = 0; - typeName = "SCALAR"; - force = 0; - isClientSettable = 1; - displayName = "$STR_ACE_Common_SettingProgressbarLocationName"; - description = "$STR_ACE_Common_SettingProgressbarLocationDesc"; - values[] = {"$STR_ACE_Common_Top", "$STR_ACE_Common_Bottom"}; - }; - class GVAR(displayTextColor) { - value[] = {0,0,0,0.1}; - typeName = "COLOR"; - isClientSettable = 1; - displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; - description = "$STR_ACE_Common_SettingDisplayTextColorDesc"; - }; - class GVAR(displayTextFontColor) { - value[] = {1,1,1,1}; - typeName = "COLOR"; - isClientSettable = 1; - displayName = "$STR_ACE_Common_SettingDisplayTextFontColorName"; - description = "$STR_ACE_Common_SettingDisplayTextFontColorDesc"; - }; -}; +#include "ACE_Settings.hpp" #include "define.hpp" #include From c0c4414ec046556c9899489a37328d7d8f603613 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 16 May 2015 01:35:48 +0200 Subject: [PATCH 043/664] Name tags Draw3D variable names consistency --- addons/nametags/functions/fnc_onDraw3d.sqf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index e88f606c05..ae80e7e992 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -21,7 +21,7 @@ private ["_onKeyPressAlphaMax", "_defaultIcon", "_distance", "_alpha", "_icon", if (!alive ACE_player) exitWith {}; _onKeyPressAlphaMax = if ((GVAR(showPlayerNames) in [3,4])) then { - 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 + 2 + (GVAR(showNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 } else { 1 }; @@ -41,10 +41,10 @@ if (GVAR(showCursorTagForVehicles) && {_onKeyPressAlphaMax > 0}) then { if ((!isNull _target) && {(side (group _target)) == (side (group ACE_player))} && {_target != ACE_player} && - {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {GVAR(showNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { _distance = ACE_player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + _alpha = ((1 - 0.2 * (_distance - GVAR(playerNamesViewDistance))) min 1) * GVAR(playerNamesMaxAlpha); _alpha = _alpha min _onKeyPressAlphaMax; [ACE_player, _target, _alpha, _distance * 0.026, _defaultIcon] call FUNC(drawNameTagIcon); }; @@ -58,10 +58,10 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { {_target isKindOf "CAManBase"} && {(side (group _target)) == (side (group ACE_player))} && {_target != ACE_player} && - {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {GVAR(showNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { _distance = ACE_player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + _alpha = ((1 - 0.2 * (_distance - GVAR(playerNamesViewDistance))) min 1) * GVAR(playerNamesMaxAlpha); _alpha = _alpha min _onKeyPressAlphaMax; _icon = ICON_NONE; if (GVAR(showSoundWaves) == 2) then { //icon will be drawn below, so only show name here @@ -76,7 +76,7 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(showSoundWaves) == 2}) then { _pos = positionCameraToWorld [0, 0, 0]; - _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; + _targets = _pos nearObjects ["CAManBase", GVAR(playerNamesViewDistance) + 5]; if (!surfaceIsWater _pos) then { _pos = ATLtoASL _pos; @@ -101,7 +101,7 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho if ((_icon != ICON_NONE) && {(side (group _target)) == (side (group ACE_player))} && {_target != ACE_player} && - {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {GVAR(showNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle ACE_player, _target]) exitWith {}; // Check if there is line of sight @@ -109,7 +109,7 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho _distance = vectorMagnitude _relPos; _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); + _alpha = ((1 - 0.2 * (_distance - GVAR(playerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(playerNamesMaxAlpha); if ((GVAR(showSoundWaves) == 2) && {([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target}}) then { _alpha = 1; From 1dd34199d68e80b453c30eaef8df30c1606556cd Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 15 May 2015 22:23:46 -0500 Subject: [PATCH 044/664] ASDG- Fail gracefully if attachments not compatible --- addons/laserpointer/XEH_postInit.sqf | 6 +++ .../functions/fnc_switchLaserLightMode.sqf | 48 +++++++++++++------ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/addons/laserpointer/XEH_postInit.sqf b/addons/laserpointer/XEH_postInit.sqf index 38fc35f262..81b2da2473 100644 --- a/addons/laserpointer/XEH_postInit.sqf +++ b/addons/laserpointer/XEH_postInit.sqf @@ -4,6 +4,12 @@ // fixes laser when being captured. Needed, because the selectionpsoition of the right hand is used ["SetHandcuffed", {if (_this select 1) then {(_this select 0) action ["GunLightOff", _this select 0]};}] call EFUNC(common,addEventHandler); +//If user has ASDG JR without the compat patch, then ace's' laser pointers won't be compatible with anything +if ((isClass (configFile >> "CfgPatches" >> "asdg_jointrails")) && {!(isClass (configFile >> "CfgPatches" >> "ace_asdg_comp"))}) then { + diag_log text format ["[ACE_laserpointer] - ASDG Joint Rails but no ace_asdg_comp"]; +}; + + if !(hasInterface) exitWith {}; GVAR(nearUnits) = []; diff --git a/addons/laserpointer/functions/fnc_switchLaserLightMode.sqf b/addons/laserpointer/functions/fnc_switchLaserLightMode.sqf index 423090796f..4927e7db13 100644 --- a/addons/laserpointer/functions/fnc_switchLaserLightMode.sqf +++ b/addons/laserpointer/functions/fnc_switchLaserLightMode.sqf @@ -1,7 +1,7 @@ // by commy2 #include "script_component.hpp" -private ["_unit", "_weapon"]; +private ["_unit", "_weapon", "_error"]; _unit = _this select 0; _weapon = _this select 1; @@ -44,21 +44,41 @@ private ["_description", "_picture"]; _description = getText (configFile >> "CfgWeapons" >> _nextPointer >> "ACE_modeDescription"); _picture = getText (configFile >> "CfgWeapons" >> _nextPointer >> "picture"); +_error = false; switch (_currentWeaponType) do { - case 1: { - _unit removePrimaryWeaponItem _pointer; - _unit addPrimaryWeaponItem _nextPointer; - }; - case 2: { - _unit removeSecondaryWeaponItem _pointer; - _unit addSecondaryWeaponItem _nextPointer; - }; - case 3: { - _unit removeHandgunItem _pointer; - _unit addHandgunItem _nextPointer; - }; + case 1: { + _unit removePrimaryWeaponItem _pointer; + _unit addPrimaryWeaponItem _nextPointer; + if (((primaryWeaponItems _unit) select 1) != _nextPointer) then { + ERROR("NextPointer not compatible"); + _unit addPrimaryWeaponItem _pointer; + _error = true; + }; + }; + case 2: { + _unit removeSecondaryWeaponItem _pointer; + _unit addSecondaryWeaponItem _nextPointer; + if (((secondaryWeaponItems _unit) select 1) != _nextPointer) then { + ERROR("NextPointer not compatible"); + _unit addSecondaryWeaponItem _pointer; + _error = true; + }; + }; + case 3: { + _unit removeHandgunItem _pointer; + _unit addHandgunItem _nextPointer; + if (((handgunItems _unit) select 1) != _nextPointer) then { + ERROR("NextPointer not compatible"); + _unit addHandgunItem _pointer; + _error = true; + }; + }; }; -[_description, _picture] call EFUNC(common,displayTextPicture); +if (!_error) then { + [_description, _picture] call EFUNC(common,displayTextPicture); +} else { + diag_log text format ["Failed to add %1 to %2 - reverting to %3", _nextPointer, _weapon, _pointer]; +}; playSound "ACE_Sound_Click"; From 6c826f416c5bf718355d669cc8e46ccc6ccac0e3 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 15 May 2015 22:28:46 -0500 Subject: [PATCH 045/664] Add ACE_acc_pointer_green_IR to ASDG compat --- optionals/compat_asdg/config.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/optionals/compat_asdg/config.cpp b/optionals/compat_asdg/config.cpp index c7e7903ce2..40dae32051 100644 --- a/optionals/compat_asdg/config.cpp +++ b/optionals/compat_asdg/config.cpp @@ -17,6 +17,7 @@ class asdg_FrontSideRail: asdg_SlotInfo { class compatibleItems { ACE_acc_pointer_red = 1; ACE_acc_pointer_green = 1; + ACE_acc_pointer_green_IR = 1; }; }; From 5f328ce616f96ebeb76d77f20e6e82d5723e64c2 Mon Sep 17 00:00:00 2001 From: VKing Date: Sat, 16 May 2015 15:28:59 +0200 Subject: [PATCH 046/664] Added ace_ui - enchanced chat visibility on the map screen --- addons/ui/$PBOPREFIX$ | 1 + addons/ui/README.md | 9 +++++++ addons/ui/config.cpp | 30 ++++++++++++++++++++++++ addons/ui/functions/script_component.hpp | 1 + addons/ui/script_component.hpp | 13 ++++++++++ 5 files changed, 54 insertions(+) create mode 100644 addons/ui/$PBOPREFIX$ create mode 100644 addons/ui/README.md create mode 100644 addons/ui/config.cpp create mode 100644 addons/ui/functions/script_component.hpp create mode 100644 addons/ui/script_component.hpp diff --git a/addons/ui/$PBOPREFIX$ b/addons/ui/$PBOPREFIX$ new file mode 100644 index 0000000000..601bbd5f60 --- /dev/null +++ b/addons/ui/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\Addons\ui \ No newline at end of file diff --git a/addons/ui/README.md b/addons/ui/README.md new file mode 100644 index 0000000000..f11027038f --- /dev/null +++ b/addons/ui/README.md @@ -0,0 +1,9 @@ +ace_ui +======= + +Changes the chat contrast on the map to allow easier reading + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + diff --git a/addons/ui/config.cpp b/addons/ui/config.cpp new file mode 100644 index 0000000000..e7ea4b32eb --- /dev/null +++ b/addons/ui/config.cpp @@ -0,0 +1,30 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"VKing"}; + authorUrl = "https://github.com/ACEMod/"; + VERSION_CONFIG; + }; +}; + +class RscText; + +class RscDisplayChat { + class controls { + delete Line; + delete Background; + class CA_Background: RscText { + colorBackground[] = {0.5,0.5,0.5,0.33}; // Make the chat entry field slightly darker + }; + }; +}; + +class RscChatListDefault { + colorBackground[] = {0,0,0,0.5}; // Make the chat background darker + colorMessageProtocol[] = {0.85,0.85,0.85,1}; // And the chat text brighter +}; diff --git a/addons/ui/functions/script_component.hpp b/addons/ui/functions/script_component.hpp new file mode 100644 index 0000000000..656228f742 --- /dev/null +++ b/addons/ui/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\ui\script_component.hpp" diff --git a/addons/ui/script_component.hpp b/addons/ui/script_component.hpp new file mode 100644 index 0000000000..a1a210701c --- /dev/null +++ b/addons/ui/script_component.hpp @@ -0,0 +1,13 @@ +#define COMPONENT ui +#include "\z\ace\Addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_UI + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_UI + #define DEBUG_SETTINGS DEBUG_SETTINGS_UI +#endif + +#include "\z\ace\Addons\main\script_macros.hpp" + From b334d8c52eb0ba1f740a5ecf04aeb485d7fe3dc9 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 16 May 2015 23:18:58 +0200 Subject: [PATCH 047/664] Added woundID for open wounds --- extensions/medical/OpenWound.cpp | 6 +++--- extensions/medical/OpenWound.h | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/extensions/medical/OpenWound.cpp b/extensions/medical/OpenWound.cpp index 62eadfdfe9..340955aac6 100644 --- a/extensions/medical/OpenWound.cpp +++ b/extensions/medical/OpenWound.cpp @@ -1,8 +1,8 @@ #include "OpenWound.h" #include -ace::medical::injuries::OpenWound::OpenWound(int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount) : - classID(aClassID), bodyPart(aBodyPartId), percentage(aPercentage), bloodlossRate(aBl), pain(painAmount) +ace::medical::injuries::OpenWound::OpenWound(int anID, int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount) : + woundID(anID), classID(aClassID), bodyPart(aBodyPartId), percentage(aPercentage), bloodlossRate(aBl), pain(painAmount) { } @@ -13,6 +13,6 @@ ace::medical::injuries::OpenWound::~OpenWound() std::string ace::medical::injuries::OpenWound::AsString() { std::stringstream stream; - stream << classID << "," << bodyPart << "," << 1 << "," << bloodlossRate; + stream << "[" << woundID << "," << classID << "," << bodyPart << "," << 1 << "," << bloodlossRate << "]"; return stream.str(); } diff --git a/extensions/medical/OpenWound.h b/extensions/medical/OpenWound.h index 00e6c1fe7a..4de796d5f9 100644 --- a/extensions/medical/OpenWound.h +++ b/extensions/medical/OpenWound.h @@ -8,11 +8,12 @@ namespace ace { class OpenWound { public: - OpenWound(int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount); + OpenWound(int anID, int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount); ~OpenWound(); std::string AsString(); + int woundID; int classID; int percentage; double bodyPart; From 4b6b0621da2f12e24a79eb05c2945763b1a7d34a Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 16 May 2015 23:19:50 +0200 Subject: [PATCH 048/664] Implemented handleDamage wounds fully --- extensions/medical/handleDamage.cpp | 117 ++++++++++++++++++++++++---- extensions/medical/handleDamage.h | 13 ++-- 2 files changed, 109 insertions(+), 21 deletions(-) diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 1e2cf53e84..9ac7c6bb1a 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -22,22 +22,43 @@ namespace ace { { } - /* static */ std::vector handleDamage::HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage) + std::string handleDamage::HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage, int woundID) { std::vector wounds; int selectionN = SelectionToNumber(selectionName); + std::stringstream stream; + if (selectionN >= 0) { - wounds = GetInjuryInfoFor(typeOfDamage, amountOfDamage, selectionN); + double painToAdd = 0; + wounds = GetInjuryInfoFor(typeOfDamage, amountOfDamage, selectionN, woundID); + + stream << "_woundsCreated = ["; + for (int i = 0; i < wounds.size(); ++i) + { + stream << wounds.at(i).AsString(); + if (i != wounds.size() - 1) + { + stream << ","; + } + + painToAdd += wounds.at(i).pain; + } + stream << "];"; + + stream << "_painToAdd = " << painToAdd << ";"; + + return stream.str(); } - return wounds; + stream << ""; + return stream.str(); } - std::vector handleDamage::GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection) + std::vector handleDamage::GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection, int woundID) { std::vector injuriesToAdd; std::vector> information; - std::shared_ptr highestSpot; + std::shared_ptr highestSpot = nullptr; for each (std::shared_ptr damageType in damageTypes) { @@ -45,7 +66,7 @@ namespace ace { { for each (std::shared_ptr possibleInjury in damageType->possibleInjuries) { - if (amountOfDamage >= possibleInjury->minDamage && (amountOfDamage <= possibleInjury->maxDamage || possibleInjury->maxDamage == 0)) + if (amountOfDamage >= possibleInjury->minDamage && (amountOfDamage <= possibleInjury->maxDamage || possibleInjury->maxDamage <= 0)) { if (highestSpot == NULL) highestSpot = possibleInjury; @@ -56,11 +77,14 @@ namespace ace { information.push_back(possibleInjury); } } + if (highestSpot == NULL) { + break; + } int c = 0; for each (double threshold in damageType->minDamageThreshold) { - if (threshold >= amountOfDamage) + if (amountOfDamage >= threshold) { double amountOfInjuriesOnDamage = damageType->amountOfInjuresOnDamage.at(c); for (double injuryAmount = 0; injuryAmount < amountOfInjuriesOnDamage; ++injuryAmount) @@ -81,7 +105,7 @@ namespace ace { bodyPartID = rand() % 6; } - injuries::OpenWound newWound(injuryToAdd->ID, bodyPartID, 1, injuryToAdd->bloodLoss, injuryToAdd->pain); + injuries::OpenWound newWound(woundID++, injuryToAdd->ID, bodyPartID, 1, injuryToAdd->bloodLoss, injuryToAdd->pain); injuriesToAdd.push_back(newWound); } } @@ -93,22 +117,38 @@ namespace ace { return injuriesToAdd; } - /* static */ void handleDamage::AddDamageType(const std::vector& input) + std::string handleDamage::AddDamageType(const std::vector& input) { if (input.size() == 5) { std::string typeName = input[0]; double minimalLethalDamage = std::stod(input[1]); - std::vector minDamageThreshold;// = std::stod(input[2]); - std::vector amountOfInjuresOnDamage; //= std::stod(input[3]); + std::vector minDamageThreshold = inputToVectorDouble(input[2]); + std::vector amountOfInjuresOnDamage = inputToVectorDouble(input[3]); bool selectionSpecific = std::stod(input[4]) > 0; std::shared_ptr type(new ace::medical::injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, amountOfInjuresOnDamage, selectionSpecific)); damageTypes.push_back(type); + + std::stringstream stream; + + stream << "ADDED: " << typeName << " - " << minimalLethalDamage << " - ["; + for each (double sel in minDamageThreshold) + { + stream << sel << " -"; + } + stream << "] - ["; + for each (double sel in amountOfInjuresOnDamage) + { + stream << sel << " -"; + } + stream << "] - " << selectionSpecific; + return stream.str(); } + return "failed"; } - void handleDamage::AddInjuryType(const std::vector& input) + std::string handleDamage::AddInjuryType(const std::vector& input) { if (input.size() == 9) { @@ -116,33 +156,55 @@ namespace ace { int ID = std::stod(input[0]); std::string className = input[1]; - std::vector allowedSelections; // input[2]; + std::vector allowedSelections = inputToVector(input[2]); double bloodLoss = std::stod(input[3]); double pain = std::stod(input[4]); double minDamage = std::stod(input[5]); double maxDamage = std::stod(input[6]); - std::vector possibleCauses; // input[7]; + std::vector possibleCauses = inputToVector(input[7]); std::string displayName = input[8]; std::shared_ptr type(new ace::medical::injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); injuryTypes.push_back(type); + std::stringstream stream; + + stream << "ADDED: " << ID << " - " << className << " - ["; + for each (std::string sel in allowedSelections) + { + stream << sel << " -"; + } + stream << "] - "; + stream << bloodLoss << " - " << pain << " - " << minDamage << " - " << maxDamage; + for each (std::string sel in possibleCauses) + { + stream << sel << " -"; + } + stream << displayName; + return stream.str(); } + return "failed"; } - void handleDamage::FinalizeDefinitions() + std::string handleDamage::FinalizeDefinitions() { + std::stringstream outputstream; + // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. for each (std::shared_ptr damageType in damageTypes) { for each (std::shared_ptr injuryType in injuryTypes) { - if (find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName) != injuryType->causes.end()) + std::vector::iterator it = find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName); + // outputstream << " Evaluating causes: " << (it != injuryType->causes.end()) << " "; + if (it != injuryType->causes.end()) { damageType->possibleInjuries.push_back(injuryType); } } + outputstream << " ---- For: " << damageType->typeName << " Added: " << damageType->possibleInjuries.size() << " --- "; } + return outputstream.str(); } int handleDamage::SelectionToNumber(const std::string& selectionName) @@ -159,5 +221,28 @@ namespace ace { return -1; // TODO throw exception } } + + std::vector handleDamage::inputToVector(const std::string& input) + { + std::istringstream ss(input); + std::string token; + + std::vector output; + while (std::getline(ss, token, ':')) { + output.push_back(token); + } + return output; + } + std::vector handleDamage::inputToVectorDouble(const std::string& input) + { + std::istringstream ss(input); + std::string token; + + std::vector output; + while (std::getline(ss, token, ':')) { + output.push_back(std::stod(token)); + } + return output; + } } } diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h index 16b9cb6783..650f677445 100644 --- a/extensions/medical/handleDamage.h +++ b/extensions/medical/handleDamage.h @@ -26,19 +26,19 @@ namespace ace { /** * */ - std::vector HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage); + std::string HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage, int woundID); - std::vector GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection); + std::vector GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection, int woundID); /** * */ - void AddDamageType(const std::vector& sqfDamageTypeDefinition); + std::string AddDamageType(const std::vector& sqfDamageTypeDefinition); /** * */ - void AddInjuryType(const std::vector& sqfInjuryDefinition); + std::string AddInjuryType(const std::vector& sqfInjuryDefinition); /** * @@ -59,7 +59,7 @@ namespace ace { /** * */ - void FinalizeDefinitions(); + std::string FinalizeDefinitions(); private: handleDamage(); @@ -67,6 +67,9 @@ namespace ace { handleDamage(handleDamage const&) = delete; void operator=(handleDamage const&) = delete; + std::vector inputToVector(const std::string& input); + std::vector inputToVectorDouble(const std::string& input); + std::vector> damageTypes; std::vector> injuryTypes; std::vector selections; From f26cb0a66695860d06c6261d194d8f12cdb11ed5 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 16 May 2015 23:20:17 +0200 Subject: [PATCH 049/664] Now handles input and output --- extensions/medical/medical.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/extensions/medical/medical.cpp b/extensions/medical/medical.cpp index ae0b549613..9a93060b2e 100644 --- a/extensions/medical/medical.cpp +++ b/extensions/medical/medical.cpp @@ -10,6 +10,7 @@ #include #include #include "handleDamage.h" +#include "OpenWound.h" extern "C" { __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); @@ -34,22 +35,33 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { } else { + + std::string returnValue = ""; std::vector arguments = parseExtensionInput(function); if (arguments.size() > 0) { std::string command = arguments.at(0); - // can we not just use C++11? + arguments.erase(arguments.begin()); + if (command == "addInjuryType") { - + returnValue = ace::medical::handleDamage::GetInstance().AddInjuryType(arguments); } else if (command == "addDamageType") { - + returnValue = ace::medical::handleDamage::GetInstance().AddDamageType(arguments); } - else if (command == "getInjury") { - // ace::medical::handleDamage(); + else if (command == "HandleDamageWounds") { + if (arguments.size() >= 4) { + std::string selectionName = arguments.at(0); + double amountOfDamage = std::stod(arguments.at(1)); + std::string typeOfDamage = arguments.at(2); + int woundID = std::stoi(arguments.at(3)); + returnValue = ace::medical::handleDamage::GetInstance().HandleDamageWounds(selectionName, amountOfDamage, typeOfDamage, woundID); + } + } + else if (command == "ConfigComplete") { + returnValue = ace::medical::handleDamage::GetInstance().FinalizeDefinitions(); } } - std::string returnValue = ""; strncpy(output, returnValue.c_str(), outputSize); output[outputSize - 1] = '\0'; } From 23a1bc86ca00ef1ee1d6e8d321730426f0b1d823 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 16 May 2015 23:20:38 +0200 Subject: [PATCH 050/664] Loading config data to extension --- .../functions/fnc_parseConfigForInjuries.sqf | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf index 503ff9833e..9a46e26321 100644 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical/functions/fnc_parseConfigForInjuries.sqf @@ -118,4 +118,62 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); if (isNumber(_damageTypesConfig >> _x >> "selectionSpecific")) then { _selectionSpecificType = getNumber(_damageTypesConfig >> _x >> "selectionSpecific");}; }; missionNamespace setvariable [_varName, [_typeThresholds, _selectionSpecificType > 0, _woundTypes]]; + + private ["_minDamageThresholds", "_amountThresholds"]; + // extension loading + _minDamageThresholds = ""; + _amountThresholds = ""; + { + _minDamageThresholds = _minDamageThresholds + str(_x select 0); + _amountThresholds = _amountThresholds + str(_x select 1); + if (_forEachIndex < (count _typeThresholds) - 1) then { + _minDamageThresholds = _minDamageThresholds + ":"; + _amountThresholds = _amountThresholds + ":"; + }; + }foreach _typeThresholds; + + _extensionInput = format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _foreachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType]; + diag_log format["Calling extension with input: %1", _extensionInput]; + diag_log format ["Extension return: %1", "ace_medical" callExtension _extensionInput]; + }foreach _allFoundDamageTypes; + + +// Extension loading + +{ + private ["_classID", "_className", "_allowedSelections", "_bloodLoss", "_pain", "_minDamage", "_maxDamage", "_causes", "_classDisplayName", "_extensionInput", "_selections", "_causesArray"]; + // add shit to addInjuryType + _classID = _x select 0; + _className = GVAR(woundClassNames) select _forEachIndex; + _allowedSelections = ""; + + _selections = _x select 1; + { + _allowedSelections = _allowedSelections + _x; + if (_forEachIndex < (count _selections) - 1) then { + _allowedSelections = _allowedSelections + ":"; + }; + }foreach _selections; + + _bloodLoss = _x select 2; + _pain = _x select 3; + _minDamage = (_x select 4) select 0; + _maxDamage = (_x select 4) select 1; + _causes = ""; + _causesArray = (_x select 5); + { + _causes = _causes + _x; + if (_forEachIndex < (count _causesArray) - 1) then { + _causes = _causes + ":"; + }; + }foreach _causesArray; + _classDisplayName = _x select 6; + _extensionInput = format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; + + diag_log format["Calling extension with input: %1", _extensionInput]; + diag_log format ["Extension return: %1", "ace_medical" callExtension _extensionInput]; + +}foreach _allWoundClasses; + +diag_log format["Extension configComplete: %1", "ace_medical" callExtension "ConfigComplete"]; From e3dd1eaf47448dbc747edfc76ad09f509ffc1d12 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 16 May 2015 23:21:03 +0200 Subject: [PATCH 051/664] Using extension for handleDamage wounds instead of sqf --- .../functions/fnc_handleDamage_wounds.sqf | 123 ++++-------------- 1 file changed, 23 insertions(+), 100 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 9172304dd2..70eeb74f9d 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -24,120 +24,43 @@ _damage = _this select 2; _typeOfProjectile = _this select 3; _typeOfDamage = _this select 4; -// Convert the selectionName to a number and ensure it is a valid selection. -_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); -if (_bodyPartn < 0) exitwith {}; - -// Get the injury type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] -_injuryTypeInfo = missionNamespace getvariable [format[QGVAR(woundInjuryType_%1), _typeOfDamage],[[], false, []]]; - -// This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..] -_allInjuriesForDamageType = _injuryTypeInfo select 2; -// It appears we are dealing with an unknown type of damage. - -if (count _allInjuriesForDamageType == 0) then { - // grabbing the configuration for unknown damage type - _injuryTypeInfo = missionNamespace getvariable [QGVAR(woundInjuryType_unknown),[[], false, []]]; - _allInjuriesForDamageType = _injuryTypeInfo select 2; -}; - -// find the available injuries for this damage type and damage amount -_highestPossibleSpot = -1; -_highestPossibleDamage = -1; -_allPossibleInjuries = []; -{ - _damageLevels = _x select 4; - _minDamage = _damageLevels select 0; - _maxDamage = _damageLevels select 1; - - // Check if the damage is higher as the min damage for the specific injury - if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { - //_classType = _x select 0; - _selections = _x select 1; - //_bloodLoss = _x select 2; - //_pain = _x select 3; - - // Check if the injury can be applied to the given selection name - if ("All" in _selections || _selectionName in _selections) then { - - // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries - if (_minDamage > _highestPossibleDamage) then { - _highestPossibleSpot = _foreachIndex; - _highestPossibleDamage = _minDamage; - }; - - // Store the valid possible injury for the damage type, damage amount and selection - _allPossibleInjuries pushback _x; - }; - }; -}foreach _allInjuriesForDamageType; - -// No possible wounds available for this damage type or damage amount. -if (_highestPossibleSpot < 0) exitwith {}; - // Administration for open wounds and ids _openWounds = _unit getvariable[QGVAR(openWounds), []]; _woundID = _unit getvariable[QGVAR(lastUniqueWoundID), 1]; +_extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _selectionName, _damage, _typeOfDamage, _woundID]; + _painToAdd = 0; _woundsCreated = []; + +call compile _extensionOutput; +_foundIndex = -1; { - if (_x select 0 <= _damage) exitwith { - for "_i" from 0 to (1+ floor(random(_x select 1)-1)) /* step +1 */ do { - - // Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage] - _toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {_allPossibleInjuries select (floor(random (count _allPossibleInjuries)));}; - _toAddClassID = _toAddInjury select 0; - _foundIndex = -1; - - _bodyPartNToAdd = if (_injuryTypeInfo select 1) then {_bodyPartn} else {floor(random(6))}; - // If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it.. - if ((_injuryTypeInfo select 1)) then { - { - // Check if we have an id of the given class on the given bodypart already - if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { - _foundIndex = _foreachIndex; - }; - }foreach _openWounds; - }; - - _injury = []; - if (_foundIndex < 0) then { - // Create a new injury. Format [ID, classID, bodypart, percentage treated, bloodloss rate] - _injury = [_woundID, _toAddInjury select 0, _bodyPartNToAdd, 1, _toAddInjury select 2]; - - // Since it is a new injury, we will have to add it to the open wounds array to store it - _openWounds pushback _injury; - - // New injuries will also increase the wound ID - _woundID = _woundID + 1; - } else { - // We already have one of these, so we are just going to increase the number that we have of it with a new one. - _injury = _openWounds select _foundIndex; - _injury set [3, (_injury select 3) + 1]; - }; - // Store the injury so we can process it later correctly. - _woundsCreated pushback _injury; - - // Collect the pain that is caused by this injury - _painToAdd = _painToAdd + (_toAddInjury select 3); + _toAddClassID = _x select 1; + _bodyPartNToAdd = _x select 2; + { + // Check if we have an id of the given class on the given bodypart already + if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { + _foundIndex = _foreachIndex; }; - }; -}foreach (_injuryTypeInfo select 0); // foreach damage thresholds + }foreach _openWounds; -_unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; + if (_foundIndex < 0) then { + // Since it is a new injury, we will have to add it to the open wounds array to store it + _openWounds pushback _x; + } else { + // We already have one of these, so we are just going to increase the number that we have of it with a new one. + _injury = _openWounds select _foundIndex; + _injury set [3, (_injury select 3) + 1]; + }; +}foreach _woundsCreated; + +_unit setvariable [QGVAR(openWounds), _openWounds, true]; // Only update if new wounds have been created if (count _woundsCreated > 0) then { _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true]; }; -if (USE_WOUND_EVENT_SYNC) then { - // Broadcast the new injuries across the net in parts. One broadcast per injury. Prevents having to broadcast one massive array of injuries. - { - ["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent); - }foreach _woundsCreated; -}; - _painLevel = _unit getvariable [QGVAR(pain), 0]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; From bd440f5af9f35047a0ed8374596fa898ba65d4d0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 00:07:41 +0200 Subject: [PATCH 052/664] adjusted random --- extensions/medical/handleDamage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index 9ac7c6bb1a..f6756072d7 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -90,7 +90,7 @@ namespace ace { for (double injuryAmount = 0; injuryAmount < amountOfInjuriesOnDamage; ++injuryAmount) { std::shared_ptr injuryToAdd; - if (rand() % 1 >= 0.85) + if (rand() % 100 >= 85) { injuryToAdd = highestSpot; } From 1d7bfa239f446d07640a748143e6a97a2e0f4e18 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 00:08:34 +0200 Subject: [PATCH 053/664] Temp added old sqf version for easy performance comparison --- addons/medical/XEH_preInit.sqf | 1 + .../functions/fnc_handleDamage_woundsOld.sqf | 143 ++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 addons/medical/functions/fnc_handleDamage_woundsOld.sqf diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 4f4ff5bc30..4e77147a51 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -40,6 +40,7 @@ PREP(handleDamage_caching); PREP(handleDamage_fractures); PREP(handleDamage_internalInjuries); PREP(handleDamage_wounds); +PREP(handleDamage_woundsOld); PREP(handleUnitVitals); PREP(handleKilled); PREP(handleLocal); diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf new file mode 100644 index 0000000000..0b1f169a8b --- /dev/null +++ b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf @@ -0,0 +1,143 @@ +/* + * Author: Glowbal + * Handling of the open wounds & injuries upon the handleDamage eventhandler. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Name Of Hit Selection + * 2: Amount Of Damage + * 3: Shooter or source of the damage + * 4: Type of the damage done + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; +_unit = _this select 0; +_selectionName = _this select 1; +_damage = _this select 2; +_typeOfProjectile = _this select 3; +_typeOfDamage = _this select 4; + +// Convert the selectionName to a number and ensure it is a valid selection. +_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); +if (_bodyPartn < 0) exitwith {}; + +// Get the injury type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] +_injuryTypeInfo = missionNamespace getvariable [format[QGVAR(woundInjuryType_%1), _typeOfDamage],[[], false, []]]; + +// This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..] +_allInjuriesForDamageType = _injuryTypeInfo select 2; +// It appears we are dealing with an unknown type of damage. + +if (count _allInjuriesForDamageType == 0) then { + // grabbing the configuration for unknown damage type + _injuryTypeInfo = missionNamespace getvariable [QGVAR(woundInjuryType_unknown),[[], false, []]]; + _allInjuriesForDamageType = _injuryTypeInfo select 2; +}; + +// find the available injuries for this damage type and damage amount +_highestPossibleSpot = -1; +_highestPossibleDamage = -1; +_allPossibleInjuries = []; +{ + _damageLevels = _x select 4; + _minDamage = _damageLevels select 0; + _maxDamage = _damageLevels select 1; + + // Check if the damage is higher as the min damage for the specific injury + if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { + //_classType = _x select 0; + _selections = _x select 1; + //_bloodLoss = _x select 2; + //_pain = _x select 3; + + // Check if the injury can be applied to the given selection name + if ("All" in _selections || _selectionName in _selections) then { + + // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries + if (_minDamage > _highestPossibleDamage) then { + _highestPossibleSpot = _foreachIndex; + _highestPossibleDamage = _minDamage; + }; + + // Store the valid possible injury for the damage type, damage amount and selection + _allPossibleInjuries pushback _x; + }; + }; +}foreach _allInjuriesForDamageType; + +// No possible wounds available for this damage type or damage amount. +if (_highestPossibleSpot < 0) exitwith {}; + +// Administration for open wounds and ids +_openWounds = _unit getvariable[QGVAR(openWounds), []]; +_woundID = _unit getvariable[QGVAR(lastUniqueWoundID), 1]; + +_painToAdd = 0; +_woundsCreated = []; +{ + if (_x select 0 <= _damage) exitwith { + for "_i" from 0 to (1+ floor(random(_x select 1)-1)) /* step +1 */ do { + + // Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage] + _toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {_allPossibleInjuries select (floor(random (count _allPossibleInjuries)));}; + _toAddClassID = _toAddInjury select 0; + _foundIndex = -1; + + _bodyPartNToAdd = if (_injuryTypeInfo select 1) then {_bodyPartn} else {floor(random(6))}; + // If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it.. + if ((_injuryTypeInfo select 1)) then { + { + // Check if we have an id of the given class on the given bodypart already + if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { + _foundIndex = _foreachIndex; + }; + }foreach _openWounds; + }; + + _injury = []; + if (_foundIndex < 0) then { + // Create a new injury. Format [ID, classID, bodypart, percentage treated, bloodloss rate] + _injury = [_woundID, _toAddInjury select 0, _bodyPartNToAdd, 1, _toAddInjury select 2]; + + // Since it is a new injury, we will have to add it to the open wounds array to store it + _openWounds pushback _injury; + + // New injuries will also increase the wound ID + _woundID = _woundID + 1; + } else { + // We already have one of these, so we are just going to increase the number that we have of it with a new one. + _injury = _openWounds select _foundIndex; + _injury set [3, (_injury select 3) + 1]; + }; + // Store the injury so we can process it later correctly. + _woundsCreated pushback _injury; + + // Collect the pain that is caused by this injury + _painToAdd = _painToAdd + (_toAddInjury select 3); + }; + }; +}foreach (_injuryTypeInfo select 0); // foreach damage thresholds + +_unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; + +// Only update if new wounds have been created +if (count _woundsCreated > 0) then { +// _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true]; +}; + +if (USE_WOUND_EVENT_SYNC) then { + // Broadcast the new injuries across the net in parts. One broadcast per injury. Prevents having to broadcast one massive array of injuries. + { + // ["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent); + }foreach _woundsCreated; +}; + +_painLevel = _unit getvariable [QGVAR(pain), 0]; +_unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; \ No newline at end of file From 65ec2cc4e5bd1677e5bd793c1cbc492086b681a6 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 00:08:43 +0200 Subject: [PATCH 054/664] medical dll --- ace_medical.dll | Bin 0 -> 1456128 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ace_medical.dll diff --git a/ace_medical.dll b/ace_medical.dll new file mode 100644 index 0000000000000000000000000000000000000000..7a2c969b7e0960be5366e6cbbb9588f0b949d6e1 GIT binary patch literal 1456128 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%0A=87vqI;g`cW?YQyU3+) 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

yf z@WO8#cv&m*Wnh*fHjJH^ zo;NU{&Gh_TkW93vr}D6pmn6*RX%9rtg&fqF5t$wnksBqi=_JaJ#Aqqjh{v8=xdaC+dD_T_9W&ruh8W>{2Ghf(WRc=PO?l z5a(nb%yQEi>7o%n!tjMKUs)ct1^QBjTm}gsbsQz1c;HW-I(|Ap8y??#qPVP>8j}_&vrN z-@tEayBWX5=mQIWRG}??w0jNhf`0}Fmsp)Gzr;H5UrVXkB!k}ru#+_Y zD^U2gYN&yq3kH)hetSXZTJWO^ZSi|&xCK8q2EHAB%b+v5 zZ~Qt}nCzvP@~_3fuSDTDjpZK{p=tciz=%qW-x{gdb^hA{^VYzx5q)66k1Djq&kucN z;=g7vt{r}b&~e>|->78pJMb3+zp)Cx$t?e}Ecgw@h)Rs#ER1q9|1JH>jNfAPfdxOR z&=$W-&a&WF1ID$(uRms;-G^UsGWf0k+`z9&;g^H|#l~YS_jmGs1wX3L7Qc63wVLpAW8mBI-!k}HyAQvnWbhlk&%keq!Y>#9i;MbO z@SA}Vl^DN2v9)gCw*wv(gZ~=Q2NwLOLR{n0?!>P>8T<}>YT!3j z;pZUy4!JD&4duCRBKx@=2AO&ME`@b&;I|lkV8M?nw8ifdEZmy#s{!NM;nyGLdH3;O z?vqLA-}Rpu_|+)D>wy(i6Mh8{ zzIOQSgn8M0_)Sd)zX$dj_}!rJ%OLy~uyaeFzrBPJm3aLAf)%APeqET482I(djlhp8 zw8ih8Q!V(pdHNl#KbFC~>^}UelEH8EpAGz0DEvkeeiyMPOUG{pMpR<_f*7IZ@w)@o zxq)9J`oO|}RG}??e&`_+|22bg?f9>d)^56O{#&06eg{4_@T*n${|dRxZtP>iU= z_^raE#f;xlSmy?Qi_r%b{HQ`({4RkUFyU7N#&=$XUPPFi!8w1~t z|CYhL>^}S^CWGJTKN$GUQ}|^Oeit2O;lCLeQHk;U3QEV!e>-5E8~8P%4=ngmg|_(l zu?NaDew)F#cK8)yfxr9ko0klJ2lg2FO;Gr?(){C4PYZrSF`^RV_d7^9Gk!~9og4Tq zMju%4qY7>Dy9CZ#6Mi-9)`=d!{b8PWAAYNn!EgQV4gBUS{Ic=C*qC9#?{kc(#Q3%E zw2t4aKQrTZDf+;IA600JUytK0_!U6-+VS5`n3vs$-=1Xfd*F8leiIdbZ9MoWm-!hn&-G`s^sU-Br=-(Rn zl`H%P<9~5cx&^-(yd08f{&73Bk$L>?fOT%**N8r_@E=uZi=Q8MkO{wLFs>c{6~cMm zefW(^2EPLz82C+6`0Z!;=dj>66eB7z|6PkopBcZUu+9zq7NZX=_)&$n_+0|$tqH#x zFs>bb{b8PWAAZHj;J1F4f#1^#zft&KY=m#uG=4wl<&Z@Dx3|&Ce^>v>jNhf`0}Fms zp)Gzru;6LJuK>c=4!@l+FS`%F70KZD03^P){!y&(a}$0G;M+Cf_YyCMB*O1c5&Y-E z?8e}~URctz;71kO;`a`mw_w6lfm!6Zw&nIRQL&& zfAH;^@EeK|m012cxS@vrT?*^mz;7}7z=9uDXp7$^aNe5mtKl<9qV;conCIPupNyB0 z=fVE`eX7O?kBC}u$9lUt{lm$o#}T$~k);tCVH{E3`N@`tFb2fki1cLBBkhGT>PP%Q z?$f&cQ5Y3{L23aa42s3@V7ssOSNeut4qp!-K57G8E2vSgf0RZ|6 z!A`B>LQJ@HGF!!TDcB@d2tV9EEzp;uG_KR5bRs}8Jx1`)E0_v{FA&=w9Pgxk7V&tQ ziiybINNO_0{NSH@qy6^$1CH3%po<@kosNM;24(@ZfkJ1@-f+f?RMhAPf8T)$(B7?M z5iLfs>b9}`T6#5pPH`U@UMGQ#I)Rr+0glCCJ7$ZXHs*QUT6`mIRv;O;kEa$avtyT!bmbg^0RG5g{_u8e z9hV)4Q{*6vps${%fywBH7-{tKY`K%iBgT{anFR6}VQ#O$9ET2Q6XyUkzV!gVpQqUb zcw5{KcMR+hPVgBqd6W>g$JZoU_$TNEJrfOjV#qhd*nfq$)qxLN6Ta^@jRhaNIeUqZ;TaTC(4Yu;Pn0$NE5_Geq zXHQb}wC`5*Y}gcq*O^R@0oSwe7su?%~_^_>cN?sz%>n(5Eq44b5*T zsNbwrV+UT!`tpqWV(2rc_zbfS^iG@DifXm-SGS$y7slU;b;kHxO-ka3#$T~PPmK0k z#@`FH*wG}i00Z;S>7Y=l5)GC(88lD-A zzFF@{AZh455pU=v#otXy(UY&y^R?mW(CGQ&HloMi@82LEq3ig&Eh+k*!W@Y4@_{~$ zu<=Y-iu|4X-}-p6=Wk_jylx0?aQfD?$rWTzOACLj*=lXGj<1;83p6pP|1Zbe)FkOS zIf9-cCVJLkDx~+w5ziGmqy(5}(WAknSpa>XW2r8Jucrpv(T^`H!T> z2ZvEt(Ib+iXFa5hnV#LI{yKn&l&+#D``P69`OFADd%9-WyE#4D3RB_9RKqc@gwHZNg_8 ztlh5SXXkUt@$++rVaWWm*M!e2W~=ZB`FT{5^z@IQr{09mPtC@~kFeOdf z)JxOAE6M1=^xrW*03{{;9+^?D1Lzwgzr&orkCuN-()lg*{{ZkT3>Deh|zK&0;37-{MCGRSHa-UC5zKn~YXA1Ln)L)m{x((}gKR{qI_e6i5eA7Pp?K}w#UswC;z`*SNj8%T7h@wN5!IHV*! z1D5#ICrM911UuG}3;FX^lJul)u;SAOeCX(?Hvc9Zw+X)$ZC}>_%aWaY zWCBUzHR6Tj`1_V$TIpMY@ut&9UMn+w8$fSN-b%JZmHr|9gsYsQ{qy>F=?`sy5{Giz znpQxPz{Z&$k-kPtKP|cRH*4wVB}fki>;DsIi9EGJs~_JNQiwvF?>EKx4t}~hVSlx4 zb?{;nWX_#1BuMt0PV^+{)`^feHObV+i$|#EXS8&S|9|mur|WA-R3C~Tgz#Fb<`n3p zB>vJNmaRLHps%fGyP~J|h=B{y*zO z`ac=}0{Kj3zhxajbO@i;u-k8rd~LV|@^MPj@DDE>$c71R1t#hP5G0F67JtO^JVTr|QFXYpZm5J;H=pQnENjR0kwNL*) zPQ@lAq)dYj{EhkwlBti3TdHRc><;>WXy@xIPo_RLUQtgvCO%Z(FX0gDWc$`6Qy&|r zsONIhJNW;~PSz*agCSqZx`ccs+p>_n;^_K+yo&$LqQ)#=$l6osPf_VN$4*bz3*Fr+ zg{@JdRvzkF9GRE8-SmA%yzivH*akyE-?vK`DX*n{nDrdmXJZ!X9H-UK^EIrMKbu75oQ_xFFo5JUGGUr`45N!y_ZJWAhm(i4^QnYcaY!}2OIE>BM{5LeYvl1!>!J7h=ijl@4dKjgz+WBi~sHt|G=$ik)5PFKZG;VaOr zrx!8#8uX!i{bC+{s1I zII!vb-2pgCt|CHyDwoMRL;!lXK>U~1h9yH%r>yg(Y`m5&8s=pqgAL3{704ct{y@dPg9xcI$pGwki)L!^F z$2=`Zbbp=yVnly!`xO<@CN8Vj`|Gn6Mt}YDXVm^Ss{*hYa0V1f{j%w=uRq{ccZg+} z&=rWfzYr1N(y0ErmgFM(Ym1iQ=Cwqll!Oz&u*vloR?z7XRvZ&LFT+tX(zT8vJTP{z z$Pm8=063}j5bJn4vNhy6gs7H|LP7g~^|8|nnHwEx$qaF{H%@(jL`W{z_byn`Qr{G; z-FLD+r4NA=E^>y`z`2$Di7Fs2vIix7Q|L%AXr63hdi1$d^usUQ2mvuB;r#g2lE` z;4Nwap8-iN;8U@x6AyRN=URWt^73Gv9a(wYUjTo>kI`fY#Mqo;ix>BT-f2g4Mse0T zI1&3pa6IW0q{7}Zk#9(7Yf?los%`{(A<^RZ9{sTt&zkr+o19YN%L3XNr`NtXM zm&!q$O8FXhKKS1U4?_=KMtXW4booVu$8@|5Hi?@MD}~3=(P>Z~CsD!85!;Cy&Y(490SVn-V#7Maw4di#H3*M7W2`=5L>qW$vq!}MCVpI*di z|IVb_|9ji^kE+qz4~5dD?N`F-Z4wrdXqxzY7{!6c`tG6ID>5+Zahz(0SicNOeH}30 zN{=l*3^7)`rwHV)x(3~M7nzD=zu_qSvAv=SjOa40erx$ZCgmBU{Jxzm-<}eq{@C9& z{<-jJ=AS%m{O~|I9WTK@Cxibbqh!&GiCLkntB@|gfCkDPa-hs!0(h?4!SJl-f%0xi z#)w^|rxlwA%1mvbtjE|h4;1;KxCy1mfpRO4+N?P($>e;2pstjc7QWfF=T$Vg zE7}A6_oPbiGq9>6=&gdDW_lNq#bty4L>Mw%L9cF~{9!rE+iOV}k$r~QI7xQY5gIw3 zM9_L9fb4w}vAy|i_nk|xUXrh#rEp&s$II!3CXRy>Id|r`{GD@(i&tUfY@y&YadmTP!D z5C6r#0x#BYQXYT)E3`J=G%Z5D{iH6n^kON}N615(KVd5fjzh;9Wrx^AV#}Pw!T}NW zKZt3(C9(Q$D(|jPM3NZg{c{gSbBEYNp6Zy@>+?O2Q>9;osaF!|QSz4oq{KBrd($xO zC!a?(rVO;Sm<-;?A3(5~CI1zvRQs`uq@lfTKeb=oR^X}#;|XlVr3cd zALX2L7R_p(^;1>2Bn}lj#hRCxf)4RA{Saee{=+m4V@lu@wc59!_M<^g5_*s+g9LN% zUae{1=`t!91jEHkzxpAl5^r-+w|sjN{TdWNTqi|#I>o{d4<1fpp~7N?84u?6HN!ce zw{I&jHQG1q_o{uT(hu=lIaQJEb7|jtX+Ktw=5G=&?8bkf@Nd5}x9@H$nAeD|=r0_A@(9nj22p|M;5Xri+p_QrD^JD6|J0_7#Wnwh>E-mdm?!Hy&c%vA z100?2mJTh>%fsYnLVt=9E~YCHHDBlZ7&Ru}pYg4@3HQPl=L|rBb70?Kx|CYqnCX9T zu|fac_$}$5hF^B{zqmdH`uoPDKd)A!|IKGRM?d@-j+gZH@j`!V)-_YEjrNgEZwq+o zm=u50QMhE1_Wh1RN9TJ4uDhpT3=y6g^oS9=*5jf`$3MTM#?@8IDcd4W<9?n9rpAPcJ3 zd?_9wC045#LrVrt;v-BDB^gph9gmm4DR#Q@y2dcwV8T9~d@{xyRA%S48XV5D6L2 zz5?M`$9=7p|1`=EdG}%Dw2Di?br?pi;vpJBO=2Ueq{pMsZd~6<3&gamxmBFXVP?8- z@unMpKqD;KxOUSJ@6w;d|4JTx4R-_h1H^U+0=7Vmtfyv!JvziGGGIKil11q%?2vC?5l`ns-u;E*jR&bnx4%8D z#98gjtnz&oc4=3OS5NM{A1|ssUx8xWbN%Jpvd(xIgZ`B2KQD#)?@hM;EQCT)t6Op9 z7TnLW)vZM^FaT$W?rL3t5e3;+*-+N!t;2^Mju`>pp|BIz*|t-71O7i`2d)jLaC;Ni z*RMSd4({|BBys6aNd#feO*{~X; z!R67I#Feywx-so^#GUy!V<`YP@@4t=4ngEMy&h(L?N+Z(Griv5=s1UaD~+!6^X+d; zKMSF1d`<6u*G8`!;ZXhYnhx*69e(IlnJ#P5r;a>_gYPg$g&8FUi*SS55Qn3*SEJ|K z8R2v25eew=(75n%^yrq4hdtqpM$h5P=r(Qdp=#fuD&M!LvfBGCF4xwY5x&Y)-Z$3r z4&GuZuVXru*Ks=nGpalXtGx%Syx%az-&iO{%MjfX>jqOBCQISfcl}}N-~Su^0efPK zVNWb-ZH7Id3+T2f1-M#!+6#E+D88*H{tUs&J{g*#U9RN%%W@oZPY!yAxHk6pe>1G4 zPtb#(PXB?kY4BHQTDXEr2>L1lzPg|{TYP|VdpfcG_vsH^a=v6048!nc_^}#4f}T3W zj^=xE?*AT&?%}QD((_8sK=vz{x z>4_fRA%)@sc!QwZ0+q$k`!j+A*Ps$e)m7ra8WlA-Yo{aV;CRnj?>efp(yJ!-U8NNf z!f$JNpOZCD7kRD>Ex!RpLNaBGd#hm0RL;g@kpBie<(lQ=EiV+O!Fvq{LZGq)DewV* z4~IgOTfF%wnJ__LPEp9aTO7B8m!Akbx~p+Fhv>sJLDO>zB#Ap6J$yrof*~qOjE1Ws zR5=+xq0O_!7tqXs%4v8EhUjk~bSM6@Nwu7Q6^VPGs)!QL)3hTm6r!x+T+k5m)T4-} zg%egVKJ}pA*I@<(wNo4PuFUu5lpIg*{6EG!*o?lFOmG?0{ft0f(6bU5D(o|=H?S!zqYSaCm@d~1T?$lDoy-Fj^RlO`iZcWX$MY*{}dSu!d#tn()(<>YKZ%x*Wn~ z1SWie%6UZE^7;7df1Ca~=I1Uv+W$7acFaAI()B?)v}3ND9u9$1hk0@Wo+>gMt0Ws& z1$?XNVnZNMl56&_V>CALZL~h0*|=- zID8M`pN)$z3o-&;cfgmm)w7z5_S6-~ED`M#VWl_d%|ZX7VRg(rV>zd~iZ---0&?<(Xz`NDX^<(M4%y-znsGz|terj} zLg;eT$gB;9+xAl)O(+&t{BAJ^e#xClh}r6wYcP}y z{c_6-5&GqSOG#41)GzO01ex?p^&%o8o__f?kK73TvIA;K(=Sz!Zkm4i3}i>@mt`9) z`eh2}OIE*(x|alg7wDI?reyR>RxMS>`sD*KT{8OR6{OSk%TMqSQ@^Z6M|DQO9M6_U zT>a9cB!+&efS=kbuVd+#hB-0x%Q#hpA-JQ2btq)$mpi4mELt0y^~*I}nT>wg{fkI? zBlOF0oYO|X{8;5Q$kg=9ZO9TuvaVk?uq~_hI^TCg_Nb}x(KpHPjBaaOJ&wmF0%XOJj1VK>XNxK+IFP(@LJS>jCQ>HrxuhdFN zl6C;<*ZgUGRzzer)AyA`OuX;2;(Sjkp3}ywqSfEs`Qb9`^H3c6@jVmz+^+qw4@SPM z`?LM6lcIdtD%g`Y9J(r=fUQez?NJU_We~q-jufllisji1!a{lH3Ex$JA+1kk3Kx92 zV2V|u2!14Z8iU?_0qsIk8CN*$GlASNu825^R_al^vAYjZe5Igr# zAYIMdU^4nYL1d4AdfOo?eLnoc^_>sV3&VG@)kAI#hh(AOQ+FyBdJn&6Vs+|K1<`h$g|<6N zZsK_q{QjBZX~>pn5H&zX7hX47+t`OHtZ|;^R88<@!Ki<|7S@8{0Bq2 z#K!;X6$<~m=2Ef*`2PbsptJbbl8R6lF+|{hE8>gn@xPWffkldb8#GgYCGp>F#y?g0 zIYAT$>$8J_rtBcM@iMcKUbe>k6M;Fv{ZNQv*L!XZfcC61X0_Fd;DY zHP2VM>M{wU~k66=kM_C zG5?%@S0a3#zOnQ8+yFOOxAD*96!3YHbc8bgL-;*&swjqAH5#8WGt=Y@@_m>!jF1~{ zg7_RHjz9uk_@iz>Nb0YZM~2Tt_j@&mvfNBXaAAm zlUp7apAcqW%sD zdH(qWydd3#Pi+eLMES2^|CHI`qx@G_uTPCDJz$Z#RXNzLU zjc9xf`v)#ZM#z0zB7|N+oOWk9=t6i|x*Q>?-*a9|etg;BGZ9)R4nD8KoyhpK-I55O z58>tNEI!A>%hFBwl%#-9l>C_>a^duj#z)ELrEr)sI=gO8gibr=P@P4m1HlFLh)?Vu z|Id-(CO-FoB^aNd-;@ZSyJ3fS7N3vcW9c@0vR+Sqd`0n3rVt24h>6eDaC|a8 zkMZm?-t1x#Sgo`8Y=DoY+whroWcW0}vm6tjbFpa2_}s_d<#_nq2vf4N_&g0COZVV| z6F#vcMZ8u-#O=q{H_XoA#KpctUwfbc$0a!7$BlJX2;@7hzl&zL@9f;Y_|E0Gi+UEl z9saToN687;TZfgncK@afQBa7SbUec+n12Ih_4)O;Z^Q_H|p7aDtD3_Rmu^m*=KVlJ# zaRgtx*3!AG>EYs_7w62u$?jU$^cJm=%-Y9I)On09v1SIb*PI8#4lLRm7vkH6>X-y1zY za;Vtgt)6laz+u}f#H&|OZ%|}$kpFUA{6cIKSx)Z|>0H_1T1o~-I1@!6D#a~chLqFW z`F+^#dOPo-&yPUOp_SMr)m$WUFX7Jt&k}#xlHPN!@|RWR%*Ro|<-94S94{SnvEgG` zTKF9LUFt*vM`?O^2*^i(eD%Wwa22Z6u<=!Kd#hUR26-))1Imzhg?I=fq_Uy34{gb* zoQp5v0g62?hRLkn%?O6*(~Llf!ry7wXNs=!t!C~%y!25se9*IX3xG#7|*Yp$<0=vh)-#m()l z_gc_X#XwaBy%h)psuSsZ~td~;fmUsSonUM=fm zGHd0ol2cskIQAc$iJh@-@mnYs^q6biasnoQTS-QEaCo2wPz6*vs$x1STK;s1_9RwN zADya|JW4Bh0d`iXgtU$4u{76O?_&V1ayjszT&~3w52N#zzkOk8M);v{2}<&}U^7xh z$zbi{`C9Y-Kw@sAGyludQ@P?(qf*psDax=x>9Mr%={!6)ed^FyIukpe7Pw?SVjt%1 zmYdL63X>oVFUR~HyR9Ig+=b$f|5hE|46ra82((JCMg`6qyW6-eu0RN z^6*-JS-GPuJ7SdU1IwuC0OX@y(^7LyKC0{iG9mXMPq{ACDqHA zH=$GXrd2UlSA~0Ff{t@K84f)Gy3r0y%kdwGJ z<_Y%#GnlT8nQruYdiWff9>U1qKDy*sS(xH-Di>Vd7n{+!=*G0X@G^7xr2}O7jgIqz z+BgJ_KO!1wTZG>0b0EIC7trgjiWlh<@LB&b_w{;~**p8X)=e7NoWH3A^2sfp;cuE~ z&Qzk=Re1;Jg?OHB3}hs~=Q@%!x)|0go&tfXRjjFs@s?_#D!5vx3SVtw`Y=-;xJ5RK zm8zmIXVSO^szU0QW0Abkake2tLCa@T!4+!Phj;*X2NOW&Z{z3&w|EC*9>Ps29q^x2 zI{h>iuoBtBzryJL5prOM6Nt*wi86SvjB3#|;xSq+q!BNtT7Jm2C{1x_jD`1d!F$fK zAt*FH@71C&AFJF|3Qgu~@1DLxAT9#Zz8<uYZ84W>WU`zK3YUMA_F%3zD#}w_ZzmZSCv#rdaIj zMP-TY>%m-QJo`Ftl&X&`WmdYi z%{&78nwuNPzP<|)7?Jk%brhA6*uFkrX0@@e8!@6|+t)ehPu*;`wXgRe>;Xho?&=o% z`av!|o_#%4OVN4zx@9&sQrXwDz!JK_!}j$`xQ`6``oDMvDedcT@g;$M-9S@qnl_s3 z>(zLtkD-GeRUcU%Y+sM$`ZP=Fi0td}=9-q7YhwF)8$t^8(YjAsdfI4>u&((K4g30M_Yyu0w)XX-{7n)7Ba<%R9+FNFdA|+Y*L7Ty*0N~(`md08N!ZtoNTzf7K&=+tzP?J* zE9Z8_nB*HGbWVhQ9h3J`wyzH(0x6b#{SOj#-4bLT*8=Kz>HvGCgS^i(5Tf%7bT>3T6p1e$q(K8SS-Gh3@^C0b2M36iSHf~-&jsvL`Yi6p z07QOF{vDx^JjnpQX9w3a3JHSC>2H8f4}e9K9;_r6bAfmr7B*Kh7LU?4rrcsY)qq0? zl(YH7o_ijJF|5h&MVsjn$7@h7@dtP#=?Eb{x1+Ig4&K3iAx~xyUt`#@zLmb{2Wjs8 z2@60?10GAhf;#x3PYucv;Ev{VJIKSsKPb;@Fx0|h=+_Gt$vlYs19fmp50RP3FTK13 zB(SfIeo&s-$gP#07g;(dZ%m&j6Oivrwd5gc$yQzl0Iv8&(|P)(x9(U|>q-YxO+77b zW9^Q%LG({oCWzQ~8CImkA_!^5h5Q~kuHG%)v&iM+RJ-7m#JATi(mz{6496k5MJ>t; zAJte%)FLD^#I7h&ID%M=W;{XuYxvgbo${@}jkbhcDl3&W5oPI(`;#<$d79&@SiM91McO+jkV=}k|iab;Xj`|fM=T;CV9rd|EZdU=l?u*xQ z^+~QgDKF+EWQG@Wim8ClZs7vdbYdzJXzu!g{t(wUlYKEC8cW0zDJ4Gl>!S@I&-Jx$)NkN>z?)F&(%RIx4^mN3M1uC>carjkd#KV*$Qg>018 zEO&~l;(wJi$Yg@F$;1idHOCoE(pgWD--b*3cqQ6hm84xYY-UID02;Y|9E20IjY$pZ zbo?0dhkJ&WiqgZZS{HLo8Wm8jOa)Y{QgXv0+l^YTK`m0XPUPHL&qB3I#XLl2B0qkF zTt@DJ$gK;?SFm=Z3Ca>?maicajHdH!gS2&jlhXMB?zHd*40T5P-I8pL*t`g0Elm0h za_LMuLaUdo4CaqAu2=ELNvFr=59g8a2MecNrG50lO=qlSDyv074#pWAWSJjuZmpaM zj>34udUywZ9aakLQiz!#e~Vri7>!Q(ZsPKvJd60xX`7r69sP!By&;+T&{TNn6V8Wf zc!AhA2~v>HaLs}mGS078AC`?ppvl|oTmBE`BZ~>J~Vi#Wj;iY+I(ok zO&GAT=0o+lN)Lkvpt^Pwys2#cN%eLFeX`OpVQ$%`NyzGR*c z-HuqA*z=)Z1CfZSO`Q4AU0N;whWXH!*H8-+&xhXC(jC!!=-O*hTW97&uY$34lb7d1 zpCbarm=8U07d_GH&3WQt1RrS*tDrKoW6g&SU`;0WeCUt(s!M^hG!jUFvx$2flMpH5 zx_Uk|#Z1JD((fWypxNI2(^P7?vUl47L*(F#IUnM|bR_ekY>gNWUee}6UM5JJiCE`D z=kYgf2_pIVP!Ysy?D^0SPcbovnh#N|fw9Ds+HeCST9Kjrz*1yrx*b*ioWdw=LwM>oy0At07ADBNVjtAm831 zaTGj=G%w-1V%Txu-6Nhk4}t<0A?1<>&66AS=Hke3a#!sqH>d|sIA{L!(jNqUx#XAh z<>J5wyj|oLNLC|B>eyuMYcK)gh#r zI9aG-fSgoEIE!88oPP7L9m7xA<-hvnk)$@KYiDgKIPP7Hd5xRoY8YL~+1 z@EAHyE>pZCg)WYj6XH|MCtMqwWn1!h(hU+rg6aMyoPj zUI@dB?F5p$eN`qz@*@);AeR|H3GToZynV*9qkD6XGpK-}|n8&Y3gUOv26o^TG3EIG24{XYIAuZLhs{b=veY z0DL|ny`0`V0lnOSvDqv1@*yqY^yp<8yj#|=y?LZ<*o0mVET-66XVA-9ypN-otrxOL zlhDgiSheYxUJgQ^(e!fUA-0bHpQD$?2))c`S%q1dc>fgkN~s!|81QdgMCT(;T?p#K z4Tix(YVaGTQG60+qU>pTdwihgS18H_HC9pAf#+aP3!jY->i>-RG_VqN6$W11CnvLc zU%k0^>983qvZ7)ud55)Y7E=$Fky_w2oq{_{b!vc)XiZ^5n_C36AmU7hHaDtgJ)Fr$ z2Bj*Gsgd0kvIrxM!9QJboT<%CklLn33T6hHgg&0QB+OCTdW>Zr$X9GeM*8lU#s@QQgdc5XJh!tyJQ_GN~;87a;hH2 z`_T zJsrtFoHC9i(b@|vJ)xWGE=Hd1_bWI?l{ zm${V)8%u_k7itnN3K5!#2glH{vGiz;qn^%1%g(@ap4HqE>#TM{ZJ*i}C?_DL7~Oi8kCED6lxVfy%#313NHLxsR~^n6n(^ z=;iGZ zbFI%c7LfSbwE4$+ty1`%kLoE*dkyr0xj6&_a$SZcBCX?TTKn^jY zIEDP)P$XbtBXbAx`-2{PTz;P?uyicH2bkr)pYr>nGo$3U2e--O_wdnpw?A?{xfI=Z zZy>+@Eh8**yFG*>FgzP!OTnw=DphUgM|coq;H5fY>OVA_hQp#jW%T=IXSL^poaMd` za5^N@acq=y92;eOJ6dw7y2HSFab_e-3_u7vJEoJ;UJyrJvR0Ki+Pk5Ybu-1GY|BRinKpB`Wv5R3kvr_2zCS%LcEN46nJ zOn)C@F{uGLkO`5%25L$H>EHkiC46gnAC;cF!@Dl>zzWb@T? z+jr2M?-r_=idN)=+zSPgRk#gS@i$P_fL|2K3Wj)9qP`Q60tap(nv&Wf)>e1J8VLIG zO^2&%#)>Ub$)b1%gN?P+v2cW9GYc*`4q-Sjc&&FN-~zr2ehU_oswxhmhmLQva{Ohu z!Hy1=SUx+OUla(Pj^AJnfBl~o1oXu+-j2<=<0L81o17)pn~%wM?<@>8;lGe?BSPf_ z71tdus(p4Sp&XYg=X2&fWuf$0%uyz?=XS@X`|SsddMOe9lc!99Z}J&`82fQ#iU zMNCY258dQ%&?JsC2D;&8+o--6MzX2HZBTv#Rf};A_zw(*cm9Q~WBNWsIk4 z+jl!)N*V9IgTl;i-vaZn#P_&M45%o+CxvQ?QB8V0a>owzxDdBN`3+Rf$2Hn^A^{D@ z;58<>!9}o!FG`J09H1G!Y;r97`jv3vR^#P6kP-5gbhr*gT@pPVtGp(C%&Os4b>;Cy9KfS%oaFlSxOaDfFF`xPiYP&F5~LHP|- zWuYYCM*b8pMxMgq8Om{c z3R{(Qa1%xiJMk_ll(#%o34Hcs6!zZQ~x{>Bk=>- ztK|kYm`rdbWOblwE34J;H&C+~zd)%ADU(po--IYiUIasYp-Q(|C=D&ZW3!!GrJXs_ z4u1nRTkwl7>q(RvO}Wjc_)dL}u{Th9$*H_-!ZskFG!M<1DCM=Fw1!vJH9x~I8g)e) z-QqUU^?67jQri(9YNAw6$B&(6nXf}3e!Y4JWkAGi4zzYIQMwUqCM2={Cb>P)lenqn zH--3HLX>U<)S(d9jno`8q6JMxGtXlT)eOdCb3igmSbLMy=CA7iB~iyOEI_yB7xG%Z zP@Yy-U5R^Rdnp55G46bVanB5o57lhKwb{Xe0^U67fWK?*@=kBNDR|72fFszn}C?k|I{ zHvCw#7jr`ILabNI0X=9xXHC@<6z13K?(2bSODtSqb`PWJB zwg&#J8^B;>+EYs_3BUH2v`Zh8&NrU(VPSHb0X93y4dk zX$Ow3?;TT#YeymjjM3xjCVY8l!=}OL#Up9hSUl1t#OW5bcqCo=KVybIG=aqxr@Hw;*o|HJ1nKk<@R!qndRtw5*Wir%h`7;wt%j6`P>X7Rmst{WzCt7 zjm4voC}6LZ7l0^wvE!o$3xRYqKJ{SSHgCX8Gv8<9fkE%*6bikMLTeW3^t~{mQRK{A z0@4BTvjn4so-`=wCnuAV=rQD*q7^w+JOD=8z?cp>h++D#UtpU8mmwyAB}2pUTZwR7 zg#Snz1~oqUd4dUn&497gxcGchBbyRD@FH9t)wVU#pxuL@V_>FRh#dq4wni#5yCN@i zTSdY&DqRzXlHy0BkMO%dmx;m+SlO3Nqqb)+3W`-xNuDTJe8B=kHXljOI=M}FF z4Wd-_6rs{og1{!NWZzC{y@VPCAZ0rl;reLp*}uJ@q7O)wFX7@azp?p-ZKPl!8!UfT zy@X+=04V;qXs3ZREV?{6xsY9SRlTR^-HGLpTf8kvrG$H&C+(zxYV(&*W9H zQFS=T1W%2s>I%qL&2vU|r=S^yqSD^87{owT6K;bw{0-Dp;}K z+JP}`QdLlyH5Nu#>elUGKEg(c96{bXa0Ke{#z(b7(W5F)ku{W<0~t~y3QU3fk^TgAJA@yQ$)YeLvzreEqk)(cNP*OK|KZm);x<^r-$2a* z{Nn5S2CH~wVrvQo#*)SsBE|IkZkvdhh@8O8IbKRFU)p3va+%=@P~hy`oG=r+bwHf z#?S3LPw@Vp_hVo`24XRw;~O6Q%O3C#E`VbhRS-o}3B%3kE!sa=7!}aLyJACi`39=N-u4f+pCLty{=sv!XCaw?uwAsVxdK0bllcc*u`M9ZKlrIQ6;k*Ihhca@J>BRZJPqn;tbee- z?fs!tUronzR@g>ZiTs1_pzF@~2Y0&YtcdpyhNPW(et(F+Y4`^(1%(>UtPj9}cAJ0j zkexfool^P-ztY}bx*MVYo<%yX1-(Z52VXdzxM`I!=n*4&mI(86buzG~4(0{`F` zOyE=_&k!B9Cd_{Q(}&82{kI z`eWk!gJ-jQGwNfGcDEQ?15E$mtN8@M@W^}w*%Ajr#6L(7#6Nf_K(M*@HXyVjfq$?8 zkJIxH-lH2Z{evfJn3DJh?*h_dTzx70gTtihbo_(o3%K;MSvI+uR!m%ZyTL#Blmymv z>>s?%EVsM-gV|a$GM!uh1EEIw2S33B!#|h-X%BxmeS8+__&{H#Mv>G%_`5?%Ny+?! zOW^q{RxYz42BjwO4-S(y3~DTaxQnC4h=0(c#@VNk8q@U;hMT+M9~_82qWpu;9~|!= zd<4&u`3IN40cdf8Y={uSC($5E)tPYZaHYWV4>~AicBg;vDX62+UZebjhhqHzOwe%h zi9hdbXg2Bi2j9owM5?O5F~E;3iM#TYJgMEi*yDNrdyT3gl+kMYT z+3vZx-|ruc^=9n9-;aU)7}%W{koZ*`oYwpz2yfLpxMh9{C*mR7)lpcB43{DX z)CE22G=HVjIq_sZU%_HtXAv9oIdLdzxF;V!#m9~SKHb}f&A)uK6CoX8H)=X65XHwQ zix9HT`$^q#QmHtzcx0(qqCzq&on2qS5`4PR+^c`cpRvZ%dT)j!1Cm(Z38gUqLYoBD z6UZX3YvN(}f^NRHoF$njdD<}ruJyLF8ju#=$gxg9mewfh`NL#`^3AI=j>f65lIsJ< z#OC_96d;n{+s2LYQIDO*xv? zw0pkQ0N$*2{1^{q<3byrug*N#Dvn)Q<`(*GGb*>q7J8hQ`0b71(|C(Gz4E@+!HFLC zESJ05`&~E>yWaf>T|>#8V|l3K&MC7z*g^2!Ebn*K-fz*zEYG*q$mC(~6m!v)5@#0j zx^S@{-}?aHalO=vhjSUM!|@}MSIBi9Wu_e7pt+D?xrDI-Uk%2 zhU+Wj&#OmdWrPnT)t;S|kk=<72a`X>^nWH6{-yuv$I+Iy_21K6gP?1ExAc$r`k_m# z^|KQDcB7V`U3^J#$g}NgrbBlG#J`FrL z;He9G8`hl7%nF$B4Qoa+f&w^dSTiD5uJ|^OSKwXpz}MhkIk*)36IDke&&SVTkoi}E z>(rut&{G>238r3GLI&HQuKWN749*B{P($HbLx`J0eS&W5FFh~Y{fc3iP;yED1M252 z895N_{UEe3t7Krc?=)-t@gfzZBH)&us|`AP&D{|o9~#4{W}f*Tl1$)?I8f? zYk=!=mX{ol7&!bt`Z$OW{6BIK5YgaYQGjrY1~qLRM1wp&0gqXHuu*&nisSQ;5DCS` zqL?9W22aQ;D}zJKXhd!O2hCEK`Bc|YZ|bMPND`qduecOBlTLa=O?PYaY8T{5BAV>X zGte*S=c+Ey&v$UtB%q%i5T3h%e)`gpl8kBrx4vbCM3{o+dk-nBYGm{WZKCJ?M#>tExv zSj?4(JZcB&SHbT@&^rnS68@U3{of^T|LD%NPyG{IQrO}etZfFJ!D1x-Y7dNd28yXG zBnMN=dt3cGx=?>q9R3;vmS-RANMK^WyM)I2IC9en1Sfknc$b&*5pp^G{6PB=Cf=3fD<^#QrkJ0Pua^?!iCj*!bs+ zmg$f<)`%t$!E-2Q-v*9w)SfAgYq9hY^vgL=ST#c0kfl~h>KN}Fojr!c1aK{M%|9@t{-(_0!EFEye`Ch4%IMBI9@&Xt~7?~<4NqkMtsSH!RkT#<6hyz z{ViI92~{)(+o8nxX7h{D=W&p{iP&a$2o2KUzF?c6U(n0C&eO|dSP-(&%XD~fcN4vw zf~FAV6h|*}AYGEui6Xewx>L7xhg$ee9a0f-fuv!g*F^=+jI#vo>TnOr(X zsHC{n^I^mu`o6x@>G6GkT9)Yhu7Z&$-&fWL-?!;!d+z(DM8418;*K9XuL^m#ipZY| z<`(d@A~$9L185poEigS4)ByF!8i^3WTm|FZs&-%{(>4TY2v&{nMQOv+^0$=mHkO&>>fjL$cyXH9z5>woO!X32d`L3bVG87_>j{8oZqPe7;GK>IW_YZpm#S}##ABZM zc$9&S`siCN+k}uNPd%#5SNCDA<5f5ISFa|nWFxgfZ>?ZrTKTPTLIAJGP;?VZzq(l* zGz)`1JVk=VY2`oHWwGVzLR}Q!GRTLc87H0pqAB&o3%DPpQY+vAUuVF;IDZ(JK&q+ubktUdi1md{FSpElMd&*^>~L-oaE-s zD%=e6AjR?mIztu+1$Y(&Jd64AZD?9YHv+){&mw>2q7mi4ol&{Sf%|fN-{O*-r3ff8 zlQxGW!z6B<#p<~iDJ1j6#0en7u`hRxXR&U&4pM=zwqj#Rv6&_-Bxj4`)>)!1hJa*U zcW^`&@;e7Sxy?_bs?l-94cf!QCZ3TdjFhAyIl@$2_NuSZ1T8GxebBSGIA^J(nbsLh zLy|{U7w?t~+VCkLc>~@N(eN_gr-t{54YBZI&<4Q`1v_2H^Z==8q_)P!ebm%gy56W6 z0h5A)cn?6EhyxjcjT+vcVVHp-AyH7_91M~TDLzm{X~@E+o?p*Jx7lk?Ywe<9fM{Pk^6WQ4zNf%+ZA zUn?LUlkrzCEIAv0brFC#{`xbSnCREeUoS_eCVxE`96Z8b`-(N%-qeGIiaK`Rnb{ zL<0VLpwUExam6t!JAeIAGHC7m^^j z^4DY0Sscg~f4xn#4~xGJ#UR=E>+Mwc6Y$qOWEI)ZUlWQD&0o)Y!NyRJ8VsvUMjanM%{^$-WzVw#2v^oxJW3lNm*FBFu8 z7TwB^5(40}@M0wbkf;6%fLBd$suw>r0NiSDP=DoC8-QC?CRAB0VGzJN4Pc$lxNgFj zI~y>L6;R~dX#w*)hzx)!?@qVC{0#yQfDHk2GfD`Uv%wrY1hcOR=4N!uHA;WwW*eBB z)iuy2pbQdBt-yH~BexH5Xo8tXFrQOIWeuMTn3rfU6lodmjp&w}LHv~)9p(LGI?I4>RDTmd7ZT8g8lMXTlE>ZzG@pPvHK1At z!=Q33flqnYf@MPCBkF%39uuFlQ9|%J;?=}}+J@b&UcsWH0E+B??a0s%K-b#vxmKOL zp7@+kFgXQ4m-F>GttOZS1oM{yifJyn)qxsJdFQdfeD1FiFh2p45-=wSEyPbB8<9HN5?E+vv z_)#JNZ4+m#I>`iZ4*I0aj@F=k;>=N>E+&YJ2;w3Q;v#(ph6&|RLirZrd@IN=0X><39-{%}a{+WM1{Z+JyB-#xi@|Woq!ziR-h&@FRY z`74!e$d%dzuSvkOgs^K^o_39B0zb{>l^VE!I^ z5P?m3*C6i*<_j<_O)xJ*3Bl%dVq>IaL?^3z|7Kvb3Ek3>%q*x8Io_nUVPTr7UIAvK z2D32`8fzQ$t0>A()L`t})KXpDgQ7nHD@$omcBgqqv_hlwzt_1OV0 zrlrpg!!E)^>~FeIyP?kp#T5j@IGH}X;R()zWcutyoCJeE;#@WK*>|8NUEf0&N0DErqBKnh)$``wi3*bp%w#7OP{?1N(8Ve z?_QO61oKIonm7(61e+&=|0TkvO)TfB`OpHvFp;Di*i5X?UL;~9g+9BDfDYGyTKeqY zp)&wbd6#bix_M;;pA9G>fG&XfkO)xQu)Ecl>kL4X>9b=Xp;GFzZ3Odf=BYU>TxNAVNa&dPJV^hOs3B|D3Q+iln?-Kg{qurxT65fG677c&z|)Z0ZgXPW)Z;0p|pbyX?^wr4WPW3 zEiZ_{Tb_*oIM@X6=|>Y|&^B?#s$ah;H3OdH`fQITf|x>|brQ;*P>eCumOlG9v;<&M z-u+YF5m3gEnwa#XgkbV7(47)tG78Wa;s2Bwo?M^p{yG6oq0hPq=*1dPOP_83SOArG zr&)l0vpoXn`zRrR)^pvm;vhoPCL)MwoU^G_%Rd|LXfPlGA%?v;1M=QB1_ z@FWw=r@`qG;nOz5U24Kw1E0zC*&lvOFjMHWiZk4)!L;<*XTcXR?DDP!0!ABz?OH1p zMl>5G1e^DP^g96aWcA8l4KS1GvyXzJQtGppQI!8uK#`NugkK)0!IXC%3(S^9(wTty z31s|!eKwJ@w*Og&7=S+OZ^2$ItlVC;L}*HH4VrLHS$5ekE3OuCYO` zB3l(a4yyCD$#N#*CrZ?*kcU_g>tMr>^vC^n*btGkWc0wQ*D414D_xnBkMUQ!GbR_n zi<&k0(Cd8eT)6c^uG_Bjxdw)2_8xk7A1nvA(-v&kA@S`2@3sk9LEpAg{1W_ox@9s~6yCcPH@4tok!24BTN(tY$KO*lR zgccX|9`uHQ9MFk>N}ltUTo6yNB&$^Y)AZ}NarZ^LzY)q3sU%W25i!enCT#EC-Q3H84nU}N(4vmZ|V{sy#<@p?y7mJtjf_``hM zhTW>h{-$l%-!$Y&y{$=Iy;LrCgnaGT-?XDxP0=D-pX_rG=AYi*gnVJ#{q*&Nq(JPE z-G-3b1MqhB$Smv^-8Mcr;(+K6OEj2xmIR)g!ELzBNzK7pGcF?V9KM1*8Yd0K!P8GX zQM(F{L0`eq1(E%?L%Xv7c30~UjqJZ2YV5x)i0r?`rMdsMplkbY_elGQUz-x~m&C37 zfuqBx;0WX7sREvy>M7tE?6ZtZS5P(qe=8N{^VVz+hAVZ*$#O3ArEAt(bu*((4 zDQ6-tnp-UgEC6XFy!qiK;FH+Iu~WH$vms?&9fuGBUoriyS(d85D=~KH@88sNyVxJb z=h~NS{Y|PG?rj=jc!wU8VZVbBi&XUf9n*4VzF|DOMxG%TR?eL-;*kO1 z3ix@D@F^FqvEoP+(q{>?%^modLBd|m!lUxr2vqMtS z@*n9u{U%g1>)2F-K*e8Rq+WHCrs(ogFGIIjU3C^NasCAZa4>kdI@!2Ff_u3Z9Py!l z8GmsklN%19|%?OCTGdr1wp1=Phn;a*PxeTis#dBfPhk0DZ=)U zAF)^+_$GN+t`W8C3i#ZeBZGqwNf1j0h3Gd}#a|%R%lm#?M7_$nl$xSL&U6!Q@T>fF!-k01UXc2RJE|J5Pt)qI{c!U0}ZH{oiXlY%j#$Kxi|50h!Z)Y&2ih z@L{Ri4uw5XRm>+AWHSY__23Qy*%ekXFC{P3n zg@;Q$3FQr<{xWTbYyp%82khGjLBh;*Qf#^|c8V_c0*bNSjk8d^hBJQ9I+E}R8wr;S z36Da_XcA_<`KSkCYGD!HzbvvxW@(7OfzTZM0y*6cME`wfO-eX9}NK$hlgO zQzzbX4BJ}1)W5OFVV|lRaHa1D@p7$9B6 zS2cWCs?HaXPUaH}q&flV2PR0<`LarWV?kn{>Z>^x<{yAAh=hs~=Z>RO{wM?V64VKd z(^&vZGs_ZhzU?Bus^P;@b;CRsKAlgjZ<{aQ<`MP;bZ_BH{Tuad2ZiKxLUjnf4c%iZ6Gqho zx8WNmWW?}1<|8jweZfAX3C6}ahX;ktnmY&F@N>C}Lm}pLFH!F`>6$u@7D*^<+_D*T z3yR&Sj;ux@WfM1vMghTe`w2c0L6sN`xKR!m)gfpaxa5$h)suCCy02>r3@Da4}!K`-&~F zwor}0s~8hUHZHsj4F|^B%F`Wl{Ml}GTedp`{~wCKNAUM2{5i6-vor9Af0_Ef-SOKk zJ1ca)V^kp9{rSvn_tdIvcc0s{-8bO=IsEOhK9l%F_CMZ_f&Cari~;SRxwc^!?f?8| z$+i;O|Dqr@3cKWQy#0SGtlNb4|AJWiUu5@OX^Ow`_Wx%MaZQayL3Ik6vf2NqK&b$S z?PlmttM4GYr-9!k`~SBNKef+qY9OQ`o{{*yR+W#K37;FDG z(jS-5{&zs@iL?JNWmDSz|N0MXwO&od|CH4f&WF7O3W~S?9T2c__P<-2x*Bw&7PE=H zZ~s4}?SK5o@0jpZ68pa-_C=cZ{~@SnxBt82-bU1k?f78Yav4L-!G&XJub=Z|2L|LpcMB1oquM5R)L7WDeeDKtOX^u z|1(YB#ujNwexuA*)Be92A4E}T*#AD+fo~$3VA8e!R~R)@+W+&xAfoL5ARi>L z|A!z}BBlNRGkCXf$N@jUWBb25R__wq|1ZFxPRss3>{SzyV*k5vYuW#P&_@FAh}i#6 zED@wqZK6oOs79I*`+u~)*7pDNQTG23yh>>QlL=`1|6bVt_rU(g|A*r55&ZoLe|yXp zr~Ur`?Eks2|7&3X-v|32_s`*PkM)_@#M%FJKL++=APEK-Z-DrOJc)0}<1)i&m@@v# zJjbMik@Y1PZfcim#sUL14=|nZ1|&O&FE@a&Mt9&R3>{1v)DYkP*Yo4re-NvyXn!EO z>05|4A7L4UKM(M`)v+4>XCO@3K4L80gg;l{PaTwDz;A1RSbY2M12KTV3^6xd zXkX&ncq9Na_?!Vq8UMwT0g!|0c;l8Kez~P;fN{&hc_qqi+@{)q2l(yne+Uq5?Z0W< z8tuPq+#2oI8n+#^uj3JsGuMgZ*)qewV>Yn&ZbU!BowxjkH(z31LPuHQ=3ltM+Ecqa ztXhyZ4C*QZSRIp&m-H7XInPtrR*wqAGgYZ zYX!yZd8o|yqxk-WKc#-3lk`3Mm#OmCNzy_D5TkvbZ_hI7m77Um$#X6nP zDm<0_xk9<4g{_R7j@wqY&`(-GYQqw>1|z`FH(1XRFk~=>lI75qJZRqh*aZLU@0ZVS zSBq~#b3Ns2oJ^xAUy~0Q(v+Sb*IXo@kEmwhN-h_n6zzVj=>L9^WR|Dc1O&au@1ge4od|WaInjgDBIF zo!Q3M4}yq{@9$Y8ZhT*dbcq??LBv30e7}AUw=%w`OA9i-F9Kn<@%<}B%kCTB4OqYk z_LQ%QjPGBrU|EUm|PI-Jqw_~vS`yEwjx2VECg55nw>3pqyW zQzWv*kv|ak<3ipqC9U;mP=bm>zArF&TGWTUQG=n^No+X}Q9O)ez2X`?fnLxHH>lO3 zo}CDt=?5^4k*~2u^`-9$CkLrbce5r{fEINTq#(MB-l7%ZPzfegibp2>#_*@(z}r*M zufd+~0`wO7woO45eA2CWXp*nH$kRsl-)4(gFc4NmqTv|3{_cYy^N_yBJ& z$|g=Kgy$@TC?=4aw8jfyJj-za0zs%#IgL*kGmY@+lb-rS;7Flp8U2;bMtoRV8|Jl0 zmA=sO5beT*3VzQQ_F}8vY7VCqm#p($< zsVE?z%i`g;wHzGo!ReCrDf>AvA05lA_1U!NP@ZhNV*Z=_+ znUDQ6IuPb|HEZhm*mE+!X*bWu7 zp)lr0`IG1`5vn>rKbA{3*8Hf1G8i*IR&oW<=Zu;k7yTxBeq0CyXwe%rKkh))V)gTD z^_Lj)V*-_|U7R1BgfR6PkPFFi7`nj(G?iq~3pfl0d3><<_<-AdY)J^b$NU-^nO`Ld zq+Ki0z^dP1W@ECqs$+o`&U$q(3f)!KC}UDvkdBGuPr?L3V_hgRbrdGGM;7)`N|5+0-n zc*MSIH%xvi8rVXm16a5uIz# z-2dhbmLOJ|#|EmYkw&5rE#H%%{FvnBwSUJHMD1#vVQVFn!f4-KUVSIhR~>yga}6M~z^Sw406ZkG;1TsEHqwp~`qbook(NWtlrj zbwwju4F?y1E-~RM{n$wLs(zp!gHPZ%0B|IoGFwy!a;HmZx~wv{fmiYXODquX4CnhR z+Z{|OuaB6-HtjaVJk!2|$3Y*2nrc_JIXjL0pNZhjq2?VAZ`*izoDAMaFW(#R+WaFF z2BX0Mz+Oi{9z%)tzn&3*J2c6RmGMbjzXUohIC_C&kdW{a)s;>3_1}cMBH{cLBfug|?7ReG9+&#vF`Lt2H0VT}C8%9|M1$$inwv zF@OmRJ2#0VH-QHxo<4N_%OG9TtPlO5Eh6vyEyW2pM|u~BJevSoK?%-D%Ew;sTm+N2 zN0P4npQo7IDNp0@4>MKfgT~8WVp4Ap)(aZ#tR&? zfEQu3+Mq^&#Ulf*k)W3uz`6IM7W}5JRB2<%{o&;caV|oUr>-357t}j=U~D0_Kfj)d z_5$uObfSSDdKP|o2(%_JHFG`3+V|U_CXzm=J4MtR2`Zmp7-WSB&}|>uE?r~1fbZeU zZT8OS2)-}2?MC(1ra*YDIv%b$!{l_t*qOjf^#JHL1 zka4a7aHp2QJxQ!Ls7Z66@aiK$a7=G~z_*wQvRQ^E#S6?0eBJsUNURW?fCB6e7P6iQQLgE2Ex-mUsj4Duq*Rrl{H_^4JDf| z7hcu1`Lb;`TeRkj6V0SIU+%(0iykv$zEsgCyw~PSn|=H)itxKAc31W%sDyGp5!UO$ z7jnVw^}Z@q3EvwM{Tqp1L*4~Ypz_r#a7-ZarDjRS*lNy{uTHuXMkP{0KtN#^t7jeB zt1VHVikk<9(;`a_EKqIm#Yjr|>sC5)mXFC^$Fq-|As^1#X$T*Hx=6~0BX$GcCLRG8 z^ejTVJi?`^R2_vWfvFYn;K)%e57iTx4R*%Mq#G1^1pyofTvz02D$ns(HbNJkQMs1e zb|*n@6&P}>0CH=vd8m2L@=^WP`P+t6^f>9YLEg0i@2W5ormPM4R)KYo4|-P#ueHmz z=z-RJ@ekA^FwO;gLYUe3qIqe^x0h}5E$Mi#PCDM9+C<~M0SZI1@jeGLB!0ZV7KcyF zcspUIO-hK;J~3vtgIIf8m(t_Cx) zY>jyt$O!q?o$9Nniiu?XP*r6*Lsi9ehKk7pwbB}!gQ;uoiD_ua$F%U@niT(s!@H0e z|5rlkNQVEn;E|5UzhAVNya@ik!_<^XW5>TAtAZB(Z-E*qbBHUvdj$XYQE%Ks`1iL& zI2^LhEiOAA8gXJd_7^zR1hiTqGnuMSjBMXm>gEc~8EiO?WaccmZm=8RdR=uTt z*zaB5AXd*IP_0*doLN%xo~Plx{6ck+NH`~6TiDG7Ur37G##4Q@r0%+e)Xhfo;H$uz z0JHqKCCd+2(4cXPI=I_W3VQapjI}fb;Ippm+@$y%C(dx_1#*zf8c%~}ANATSjl*YM ziTVokj1d4n7ioOnBtLqlxf&MN)kB6L)lH@cFpbs3Q2R08 zsVKCI_xtLr7d(_r}dZ3RmPY!Lie{+n8j)Yrk*t{Cx~X6d|1Rw7O%qe5*4PA>g6hA z#S;s{%8{4Ip727L@5#Z@<1r9G|IE>Ja=~{(Q&9$q&sal!bUQm4jmx0qR?}(kusta=C^_da1?!aK zY}uuRyezD${tP;yXS7abm1D@g^UTI>J)ezTCXMkoAm;_3v2HocgHiZ)|5*fe}wc=+6#p}a;=si)Vf>%+Amt&Gmh@?+d zeSmL37joGK5*F^i*=E1evMgQ6>U=A_X4 z-Rukh+8Geedy|gzc$cL$-pT!I*`jdAj`u`g^6~yBte|LS!SVjN816CSz39>|kN1YD zapQgLxgCx7-tw=NVg+Gu4z+L$J>HA#$^1K?PvV%z`q#$6 zl_eIm>0f)g)EKmga$2kY2q9!vRpUk(W4OosJ4+y*_Q=?1{HwI^pWMGz154Cy??wEZ zJ4=$||Hg_$`2R%D-H3nfVFaSZ`PYtu6=C83laYHG|37A&<8F3cnDpNX|Jo4Ixdn?tpffRMqdgf9;=;eY+o}pyy8b*FF^2E%2GP zf9>hpOne&tHTMOA&*c8KYsDiM<@qxBcItSI%c z>@I)KzoBRE$-&X%u_&$aNbX;I6O`H6DFV+dJcN`Q*JZ9=%_&_}wn}*G>>eag2ZMxa*Sn*JhrFq3X!L)*#X(p?|H> z8}YBLD@)>E8;0&X^sj9{KFYs#mNZPiSRQmBn}2P{5H{9w|-=TkP3@p-g{A;z>lHBbfNQQsyD9z1^LpJ}~dpBq%l)%3> zRz9M${+MA$EbAczOy$vQ5y^$te7ZDLh<633laD&lv37_wg%`P1-N=Q7NCLCwEYvHTG7CFI zyoIP(fQmdOA`jP*Js=^(XR~r&SpW7;*TD50^eD`RmXZm-hVR^PDxhqMI!+9Le6)EG zlGY&RMhD<*$*gc+=WV%qM)UPZcEaHBpX4_G-e?Fw_*Y<~@c_8@?QQ-2YEr$et>!VP zQ8t%wr$iRxnOoJRu$t{~=h(Z$rr`cDpx+qR-G?}VA?QYYF(a$l~0Vz-VXl?MAbB;&03^F8d9f z-!YB<^Vj;*t;U;6SjogXVX7kn6HbqO zN6^<=s?NY7VH628KaJvLn>y@kw)FKPT(tJSNC!q={+0Qq6HbZg?#*Auc6T~!fGA`< z^GYTh5Hp_hjT#nRH1}W)khDR2(ubX@C&cx!2{c@$I{c)W@=2dw6#YpLp)x-y`6J8#;PEg zz*U2z01EfSe2oO?niE1 z3V%m`n(h7-{^sIuoXU3pqB+}rKmJzZuiIzY?rZQj80`KAl>HKaVU#OCx%=_A5r2oH z+$kvY0RH}lzpGK!k&)T0fB*hj+4wmCfBg@1cJI;upzbbSEGYo zyMLelef#(B-#@qC!Mj<0?r(1IVnFLF)oJT1(_q&o)K}&oMe>f(SKfeW)>(a}X`ARP zW%w_(2-f<_dq-mSbwOWw3x=niGj>W}$@^(^rz!OnpZE)GI>s*OE8Sz;>YToE74%0t zvO3aN9>gB_X!R(izH*&W+)^nlZo3=wm0q!pr`A_K5_X#i>z&hA?vHJ!bNb4Eu>5St zcp`np0qs{7WcHZ8QWgV6r}ULUtemdCQg)-J7>fitr?0#WAA`NGj`Wr7aM?x4_vViD zl{H3<^!1gRxIQ|iue8AYw|`PfedXBLzN{Iv`}CDxoe~95GJR#sF+^=w^_6G-lkNTl zf4}%V+x-sy`m|=dN8zvEf3w{^zQ}f;hrdbqdmexNzsz=T#^2#6_ecCagmUZfcOJ^l z#NQkE`vm3AN15C4mkZIbUtig~dcyamH?6PK+w~Q5eZcNt*;?kJndB6kBHCf0uEKf- zoY7@HtrGB1sJz4Y)D?p7g~4w3|A=}HEb1+=2~59?cXNrl5DrSwb6PCF%trOea7-!h zRy70*XYkngE0v=HIV%**Ld$od8pQZFLTv)gdayZT+Y&Ur4x{8vqk;j8r;!D zs5lFjND9XZ0<*Wqjf{#DU?XW`&Q&Z96w8>~TCDzHv|;i4@JT7nCWMz0?!g11c#vfzoi4En z2GjW=(R2G1L=O&g98L6O!nD_+Tu2GvQWL<+!YeJq|2tqqSQdSlw4_nwT&d69F)eD` z@jG@_d%lFn>`VXl)5`ngEcbos-!Ztnd(Lvtm;SaBu!|El`k_$^pr_3yX|)MJUm-j# z0?^HHM%e&*@8l?eUK8sbpF@DMo5Lgr^zdhC0>>oEkRLBiAk?Me5*f1?f5nK@T5tot zY^(b3q$oN-J6S@2aK<>olR1nGvsc|x6T~_Mmqe+1;v}&V#E?{^aF0>jA_Z$)#$!>$ z8W%xgEyAkhphy|j!I&93ouiEE+>-=}2C1rnW^G0T8KZiW)L(}=(4y{w{ax+(0%Q1v zzfDHf`-OkIjH>So{|;kR&qAXXK<@xu(EtsI0_Y()scZmsiw5XRaVi)SxlfdLsrg`I zR=S3g+}#Uh$R>Zc zh!4mRcLt~KFZH$jy%^SA$MW|~G-@%6klCaqe^(>SA_7nl?`;5OMgx?8sPQ?`^4Bj- znDTeDG_h;)cgCYY}$lr7E-X`vr zVIdl$YRcapW^J4NJzMH)`8(Z{j{Ge{qZU9*e-H~$>jidz{(|>5fCfhcbZ(wen*b$| zzYC;2Q>z{)?d_WUeVAr*MAc4H{*HzEnNp?V9PdE><{E8uQvTiwR+dQq9@yVNAE#93 z79#e`-+e8SA%AuLx3b?`=4;G~yqX3kNC7*|DnSExn2S%Dsy{dqh8zqLz0#~oV1J1F zv7Jd5V|P&8S}f4{K7SokL&lmz}CfjjI?_z`cKx5|pY^0(wA zi0^1A`x2H{V*kSyfj6&gn^l6tGp~nyUdXpu{15%Xbm2+B%4@*0)$%{UXn*S$EC>Ck z)$%`VR^tX@s$;oWmRz015_e!(=`F?T>vLGiCK}*Y^bdDb9HDLGBZZqc$@1#iu*`Fo zuk-IXEjE40j~J5xLh!G!E$hRY{RDibn0^K|Cv`V32~XDDynjTpZcZ?|iG&WIj~P}U zgX8;fBAqCAB)iQW$x(}^`<7>EeR=e*&`UME1)R>&^it-GqL)uGYzgTlOUlL2%PH{f zrlOa}E=fr*=Rl963dRta+Yo=;IeNJQDyycKqSW1NhUeVu=CGvQB&3%eU?IAXcM)w7 zL;BxydNKI>jTZNg)Tg5W?TV0wVnVX3+}~AKMXs&)cp1JvsbK zg@wh!e}8ro_)CAy7kdwW@b@Y9`C5>Gzi%!JS;&ta9*6jO^UChDN^p4Uv*hzk|MD;x zqY3Bh=Ll~R{=UWH?;BMWq`?|bD+C52YqlU*thKl-=Z6UCvPL=R*<7sLXR>ZSY-8~+ z9ppoX=T_8QarQ{kq|lt zM&-uSgf0JRr^SDV>XYV|i*^P7W5*H;vG^a}EeiijVHqaG|HjM&_|Jy@kOuy*gDc_x zef-Dd7e@YRCpf)ReRC{@MpyDr>-sP4V*TIkV*R2t>oY&|gx^JHH~+;U99aaUxCZ&0 z>vydG2UIO*vGV%(IC-{sE1z?0dv}Yr7uVjmGWk1b&)<@Z1Bc4W5#?IuE@8}}8)})W zMBN8@2_VZVtT#ryuG$E{7{T{qI!k7*0z~3cWy%d^;sh}Uk_vMPW6_GcQV~$s%3}eH z_c=3PlxOf+7y0sYW^#E63ZK7`XA59(QOx5Wl!=?%U~gasL8>L{X_-h&?GBf+uWkHa$9=WZE~ZZaFbuj9e_TXyw9#%P3$*#S9Ls@D8aZ~&85)2{7g zjj{qgBoJw-j;XQiS0s*S8#rhMGw&}^Z2d{m~ztRc4XA5|Ydk{|+!XaTH zPkXT%_1$(&)~&*`7(yj%re$Y&PlkV&yTXNJFX!^-Y@7zzUiCJ!nd4m5(+?&*nv7ea z1_@iyN|v{+8#y2jE!!r^$+tECGQvmPyTC_;egr=)7FRIw^S2Ru06&G_b{RkU{q_ld zNdNWNJ>mc@+mH5?X=2Qej^5++T{#4ang>qA-M(Em7bTc|=6qWg;TPN!gOkn3FUAfc z26Dro7i<;C3^1E{F3#EwP>?!{e6I4t&=bY4GiNCzANm^4zP!2B8R5S&9~!1(N^&v! zkA}BxM~Cokj_?N?yraa&*C}{sv#(CW%kwEl!(wnUOSODu{86p;@#;+Zc>NQbhIsx7 zgl5h<6CRW!GrjBq>y4=yY#*a} zKoU(YXJ$6UiYPjwiG9s!0)5MyKgj9do;?-XlW0=9an87J&SN$@ftYP=X zwo;j?yMLz4;&%4rj^0Hf&uq--JT;~}T`dcP-h~10eA908 z%`a71BT4Jf0~g?_-r_o2JqXswgKUgU_pTW$+YrQATF;4nU6W(R3f|&-7pRke%3a_u z;T#&t-UBYDf+xab%wW5UK|G(dKs^M-HfO2BJaZ;zDbAcJT2avx^{`>FPIS9E7F^Z3 z9YErsnmT0sz)3XTS`qWLNUmGtTRia?934dVq<(@1#|I(p*MnniDpocBCCNMeZ9OJt zhF?RqL2}juL$(Uk;V6tftPN@)xVm8x@OCTIc)brS&w$L4vvgFyO~u@z*`OW)UZS7- zTk?Zz1LNlM^d$8kv>NctgUav{%@4hm7k81pyqfzjQa=~Bm4Vs@bsPyK!GSFQ_v5`j zO>7)9`V#yT^fmNV+xnWhe;R_z9^yM^wdZNad;i&ddBI0p{y061Au@_&QGX2MWkkY##ybhBC z50J;Z%!$+OCJbbzV|D2$5-LpR`TolJj>>~Yf>}pI0i`;!(>D{No~JH@BR=4n9rVl& zc;=e)?wwnra?dj8eV#?{Gu2aIb`ypMk$m8__U$;$$g_|qAkW9KM~hXa*CHEwdKaq$ zNKiq~{Lq-}rV=wpqTH~7qehe1eGB1%Spc$ItS*K@0SZ}&?Bt}M$ER`|IT8)4rw0?n z=^&b?QyTG zKkb0$E}B2x1VXX#C*BHwx*bT4;ZINZ;l#J`r{B6cLTT`)hY_@q4u2Ym2JQUmWw9xf z@TYIUYlT0Z2z|uHpRxo@hKD5NPv3y&rQlD!k0Ge(@TaB2Y{b=|CPPpp;!oYF`0rgY z9?g_&cbdM|+39QF^QV`Dv82nN8sG>_$e-S8Ht5~XpL$^ZSo5dzPX}p5@uwa~#qg&` zzS^FGKUKg1AH|>k{Q368{OL_JoF0EFM^u)LKb?GFViH;n2i^CDKiN-Agnd}66JzA6 zT6}bI*`nk7xI^A;@ITa+s$SYoD4sBa+1=F!EP}&0z?7{k0V1Olcxa)IB&(}1|NN^8 zWG2xHdL2T8-=3F_+e+-0$O(0J_}l{DLOXoF5$BTIgzu!Z;46%Q@3>CF$M~DoHvM31 zV*Rs`2~!4qDvXV~0L)?KJ(9_dhB_Q)I0_tczHA-!N?MMhL(cNlReS!*k`I87Lf!{_ z3;dM}9McM>V*A8=$K<@6CEmYcWdh3!^|0Nbd&&_aSTseQaZ(589X7}jV++mm5TN(2 z!XcP{#U2o!=ok4sC*%!mDuCv=`EcqUT7?-F!a0eN61QND_`^-Kgn6<{g~UH)UE6qn zg~Rc{3kz<~aD2VJn`adg&LJ7Uf8~#$GOSf!_e87IVc18|!=xFx>SE}D5)q(4R*j`< z6d04jM0?Z{>4n5z(1jpaMb7!1*#+r?CPQE-OjR zPl4n_Yw^m7o9oQQrhseA5gH9+{|Xp7^3Kh~3fm(2rP1eZoKBsFBXfgKoYIZI=rL-cxS zeW^MEbJEVG3n3iS;L-{CvyssWGyVF*f$Xvcd!_+x}W z%xIYpK5q?pYt)gu^U7Xfx~PIu;2R4L>Kze);Mck8AK3jQ=TuaTfXv8GCa>oOdk04r z20Yb4Z?&3CEyX);r>`3H-@E~$srgO(ghD(a0X9Xha=^o?&#nm8@H~n@4No%w^977J ztARJg>NeQS@!u`P-_WZ`*g?nvO zuflZ+%i64d6~NTh`@ky}T^(nHh%#|P82&QPT$8uCQQie{%Xo-+rD{8%M?G@{(AU%4 z4;STrG0s*!7QwA)OnsXbvhOYv&Sxfe%T=w|mJy@BJ{GON_7#Xksii2mB6 zuoLJ>0bjAe7p1>uM#DGJ(u-2T_l!jHMc|u&>5%sDY5t-j{KcMKyVdUB68-hc%~ASC z2ws5n^pE#|#Lnukk4v3&^^cwqSgG}oKZDOi^pC$dge!HRe+=t}QnC8SeORcs>#vuC z$C&!Zo1Yo_$LYB!q-sSqvFopee4bqYIA4MQ?D}gENRFPTh%A5|bsHphmt@NBoUNLE z2Chlh{&_!&e!N)GPmg{cz&Lc4e#S|ibm`{_nChwNX8>&b2>n#ZTe`I2WKXgie9S0>&{0+J4NRWMJ_1C48 z)G77X5&up@f1R?8qy@iwjQ%Sv$Hkh^@QwWJ|w;jeA=0@2N^C`0^tD=99R$ak<*P|R_V;;SU|9jNH0KOP?#)pKk3C_M5NO3=*uE#m_hWpBj; zZ^4Uv>xAB!t#9aGKEq6G!JP zZ$q_r4eG#pTAI16Qj#wT8!&gUO*^38O`fxf>y;gSWRS&AZt$e+<2{uL6xoBmf6#pFI z4qW{7)nXYJ#Sx|4pgsTtDONW^hZ9-1mKEN&1mcvtyf!#0D+5t$p+ zb#Tu`%REE>ZpOM{DjAVz-gfmF<`2fVepkk~X1z7OeLhKVeCGl6NyhgaU@mTaUk9f3 z_>PA;XCL2ODIPPv521Lmx^<0xe21W78smEo+&|{{4#Rbl@qPF6$oPigaY{74Q^2qj zj&FCY>F>qyh5HOUpUi3J!Tw(zU)%^QH=X$4WcAm-f$vKrzBn#^ewnpP!rUpf0U8oy zn`}Hq9HyCK-s{9_+Syq+2?a@0a3+KyzEDK`S8IUzCs;_$P<+C^aE=Xvem>?D3pkqNLz@bg=&VDK6){jWCVc~t*fvEB+1lV<J zt0!OPT)@;AnT0I3RCd)|K7y%nssr~vr~foZ`61LJhdavop3gy8ZPc0QUuvTkH4EaV zqam^n7vsGX!ZVi6uxNNZ;vd`d@W}ojpyWTVkQjFG1 zdtBT>gkp=MTeweJXje6S>>T99?l;$DWOG3z9tuB(Hp9jKN|$5OPk4XN+tObscQiLv zSG=3*fVX`oM`fF6`P;}P5|h0}56Rm*yVLD~Kg$j^ zXRxGDh@(xlQwD3GqI@3q`GpV~tNhyJ4(?e*Tx z?XAFmx6Z*Q{09J(~A*Cc9FXrQ(+b)R0$DQ@i zt)uW!#bR;zSPwU$4IfuYArl|n5O!e0$2P1I>RS^Zm+63jID8x_>XpXF60EuJetcjx z#LVEKIl0^5B&7(y16C+LAu?kHvxU#3_4{;G-_Wn2+0yO-u{pvxk^|X5?g9}=T!IMC zSk9qGm;6KP*YWi)OtZe0&c*6u3{5CUq6Oa9~)-#FarG<~H$RV&8L{ctW6&Y)jNU+b{7~x~bB8oXG7JhMUBe zMd^}8f(#8a8Hzfn-#?A|u+OfI*k?)OCl{Oh!aa-qQ?eWt2w&c)a-Qc`>%HiUOcxjS zfxn&+@YMx9i@5pwSZucmo}cAkk*DThc@wVTdbJa(Aj09eW&Cw4-J$4wdWpTY0q=q! zmeq;#Cur|@>ikWJT*035I_6w-`N!3L%Lab@xp+D;Y~Ukx{(of1tM3TYVR%LL$d*@8 z;tl&4S!+z!MI!dm>1RR@=~R>D9*F5ZvDjid4U1Oe>p)k0(MD1H`{x()9uB4-#`Pfv5|&4g&(tiUb^)Y;|F;~ zMZZ}uLSxtM7qh(?oo>&4FP6RHhD0zvp~J*`Eayom?Es}%6&`QO|*s3MOwjxuVvioTdE+Q_|P zT(+wo0sw5vLF9%&PrLdWEQaZG@&+L*HF7B8(N;ck7x}hL>_tU|iEi3ef&Oe{uqhvB zsuq7=iGre^7y_6DU*kicGn9pDc~o6giLB_sPUp#HZZ+~{*2*=tng^^#O4Sc#3%jei z8SEX!vHUxE99j`4#Ld!fF4`4%er2oHDl2^S4alqWtXDR$ek9fHV7;hoHBXh!axpCI ztW7%0vXyq3kbb@*^0|4Ue@!+z=H6C(`kPX~`m&d;@}8 z)Igfm-!!W}a3TF27~S6$x<5U5CY0w}wMx~yl0(VW`~Y=O+3wM^P6LUWB?wRtPsNg<(L^(a4@BqWnXoh(7f9^zzCu3jd5QQZSr%b$nF!ScA5sav}K4N#B1O6OXTC;2EgR$(JLfclK10dqF>s#6@Ggg`Oc z&v0{$4nyiy9y`-K^`JyRfva=_t-b1v9zgBy74rNrTx0Kx7(qYKC!3u5s!huAR} zb3BEG7!tCKK$H3El!ZTOPOY`b2SR75D`so&{$L?{%h6Oj`= zrIt!aCbFQv&8eA!l}ta7ti+zrBHw?37%zu>e*nF+<@=~cq=60I!#s`|*Qb{7i$lJD z3B`t%@8_E(Z23O@$GY-U1OUvGqUR%CTa1@JJ4QTn^N6UCBQ|VKG!?@DTaVeWDc{4A!Itk8cK&&4k3`#e;)BTd^U}3}Q$Pn|jhlI|&Sw9Fg?-Fh8c?@gS>| zE#Ggqn{deYg^q$+zCZsDlPz$R~^DH1LS)zy>CwW{_0v?!Jn9b3I>tyU&nUFep3-j z2|uRD_j(XAI7B-6zEoOHBj0yIUmQffzl)Q9tOjiP{#Sl9xq_DO7wA@<@_n0~X`V9H zndGVE`}fGU{&&dt>Cf2y{BYMu^6nL%n*6TrEYuANgETzK_%IBHwF} z(;?sQWWoQqe5e0~%U~U#v*6c&A-(UD3LW$T%Rl%%nL#WXitQ1>GafX8`Qe1;F?bss@VxcBCv+o#NA7nJ zOG^&M2UHfteJuz&TQX@G4k7At-2#(qulgA1t3*BcXHGdcj^%nUaReqCU9<(!ApQI5 z1deW?cVDoF$qQrt_t1K(w<`q|@GAo0PT7+gjO34m3un;iOJtAE{&`C$hN4xAck zzX-iq@csy^!olEOjrlqd-rosvYy4|?f2qHuf%o$wYB8TaFudBn+(%}CJ&Q8c`>>+K zplGj}gGpHP$%+@T@;B~h{?+@L|N6o6V@@uNSpjk~ANTL~VE%i{9{mQ)6ecP@kp17P z?~(nkkKHS0AG^ME{ach$QCh#3l+UN$8#-u4UHlE$WWtp>u7MY>U}0nidWQ~IO>aW)aUF)t z>P0B|wS0^JO3M0hLkRFx9Kf|B2EHI94)Nlku@ZIa1~L;U*~r64MOglHq$2*(28g}A zc(XKH(B*3=A)|OVBSr(cNIa7yu%Td_kc@~m7(azrRdT4tUk%2d`lc55GD>2 ztE7Y?0GyA*8Ut`<)Qv!lr{z`YJ_4UG)$QuAX+<5am*}Zt&n}AmrS>(>$HMLb(Ol)n zx+2K)l4!4h9n}#$q1ql}o_sBJ9gM}SFR*6fN|n zZ{hDhVyS|`TChQv7qpicOS9J(-U8A3J#wd%CIDXrEd9J$0lsVk6Hx-BaU>=pK-;0oj z;kYk)E|&8i@76gdh4;F-|Gej=kB!rtW@G2Vqe_2Tc-z!c6r{XgZ59ml$yJ3Yc<#yJ zUMbj}kHfyr77^tL-=5uKcd7caqeT#>nPeV1PuC81y?CFjRJt7LFTw9=_Kv!~OD>HD8uhBwqb5>4u51kN z%-@9V4X#-CTR)5i8WG4qbm10V^(*RpWumjAD~-`}5yjCMuFIEk@TgC(V)`62Jk5bvVvIO?9OCuE72?9x!`t3z{8nVKYbvNq^OT7T3H1zf-9q*#{HAQvu`y8&CX_Q^Fe;Byf9 zjByIUQPN_YCfd|hzd$yBORDQ(p!n#Io?(A${M|ni{2lz=B>oyr{H-Vc4rxfi-zTt! z8yL94HSDCnD}Lz2-z6A>6#TKlwD>!;Ed_s9f@P+|-)^WL2af)F zM}oiT{Ym^aoA}#E{M`c+m1F)sff+SC{$3Z;cyj(uf;B2he}_RFrr?harp4b&;8za% zE7S(40rU5fpB+g2O@7v4&mENieJ6>(HWPoFiN6c#Q}A~SX4LTbo1}H!B>(%q6Muie z7^L8j4W`B4x1k6+@YkUYKm+i16;!bUM}PB2g1>{ov8?&qV&bos_&emcDfs&YX4LTb zyGj^UlKvisKu*%%eHeoj{IS8b_`8V8MpAyP5j}38{5Wd;fy7_cNbvVGv~LT49VY(j zh(AU(Ip*)bFr$XY-%Sto<9}dyHXUof%x0~lLLvr+L7Qd z`t2nCI!*l56My&ArQq)g%&6h_bcH-|a=x!Nos4BQ*XrCo*sXpG zWfnOlKAHR1d#;X-!4kstc`Ek%5uF45%Ci3&LPC8zXF+?W(SzF^2WW6wAIopF`T3Cj zc_S$jr9ac9Ke`7;ZW^KogLn%Ds*4()IU|JUNJu#+elK>w^V_Nq51z#%glAV$SK2Rsq2UZ#>#*;-fp3N-sAOG;;Uz%L%xZ6)37F~%%l$?B$?fCTy+95gB5V* zm)VE>KZRLkB>81_Ab;fu^9x}k|K@LutbQS6M>0M_ycm~B5j2m#&#vQN zr{LJn@genzc@F`Kuo~l4-P9jc8^3f2_o<7+$fxIKT6cjRKVU{1RKNm85(wtR&drIQ z1M^q9P52HnLVM!Gv5%oOg;2xT*Ef`r4s3 zd<(`)+OxicG$=W;r>om!Sj@17(<*hJ)&3hTHM}kR3vbpyc)JldCh-1^G?@n8ZqojT z0IyANx7{W5c7a82evEPK>p59GuA@&~j#Lod_pxdz?!F0|;QG{g`qMY?Nz>x#_&{0| zBFVyWg55Wlm92$#r)jd`TOg#bBA^E}xk+g9Y0%`0q2ru1S@uIKKgja;P~{zDnM^Bd zy5FMA+p$t4Ws-B}WMSsQvsYqK=FqdvNr~y-ZTi&wWFKs%s2?OhNX5zgZ?^~sIstx{ z!L!@^2iP26&AM~K9oYMa&XlThP%LH8NZLdBy8h))+`sZOF)%6ZzXrj#AMKwG1tq2Y zPxi0;DR=fOU%r3kKmT~Y@+a>I;hkEBY?b{R7VaXPl@4N5w8k00}m=1XtPHFcx@BB3i6=D@0MN0-9X+t)wmJJA{ zKa=2%!qi-+zJ$f)(Dd^~Ecf0oe(wIo0mRR}`+*<5HA6Eu2JDp2SNDUn4y2!%SnGGWjg8arRYs`dR+&s1nPwb-$GK={wf z4}u?$IvtwNK>9K9^DtJHf}cIm?}o9#iNc^3Pa~6attVXr9Z+^#0WE!OHDo}tA0e-H6T!H5|g)pi(!}0yz)8FE>tz@ z)jOm!6WbFrsV;idgOa5IYNJw*K`eN;Li1x^ig#6vjRgy1nc)VUn_Y<0AorgRstB41;5Xr}S+)k= zXF%ohH`_5mKZ5ou-Kv9OCo}N{Er6~C=L3p?utIekkXPmZBW`;6WB8pZA)JWWyu&pm z7HAG{!wJNw$)g^}pd<=)j%gvBIEx(9QgRr`vBUogbZLFqxeAL0WukMcZuKp26pkcY zb#utJ)`feghYmqO8p_oiHnRm@pjR;VIN_*yN9J_2C8XMHM#4=pW{*b)>k=NT)Hsx~ zyX&!dqSIxZT<5ONwyi%^$#$`=9s@ z0zF^B{Wzm6%r@`Hz%|>ljxd4^^U8A#e?9n3TdDfe9Yi+bny{vk)sKyiNieC{)P)N- zus*@;YC@G~`0FbU3s*L{LO!fi5cRtRp-%b5!N$tbF)nyAvEWI7;tCiZ2k@G(Qb&l} zoxtCLSzruDaQ)J?ygTznTi&hcs>d44CdicgX^qAI#^tb)C75{N1g^3duy`t49-}+M z7n|cQjS2ObZ|VxzZ()mpDFF9WWauE;NjlR)uFsg`H9%pV68&JW-*n?jrnAqQ3Ms!qdM()}cbE za7QG}e(i`X;vX&@PrX)*f?Sds#%z2ojTr<+-LV)f57&T=MFuRavW%L$Q41zUzIuE) zyVi`KF?mKKjd({Ucg)~hsk&&X3C3xtN=h3nt=@nnhy@GgnUSEL72BF%OfCI2yKvoh zS2ll@#0-{F&w!2YjLgR?#{tKQ8GPrAmly97HS7xnL*xboZicro)$I*mg~=G}UC zHhUB`=HeNv;WPYNVN}0t;m`TryQWHh{_s9gwfMLN_ei;8WI5y3>V7-Z;hRyj9W<*ia>PVpNRxw^_r zP^D3GJ{~%IWdFNipRIgORRVb^sIKAHs+ueC#GH^tyG&x5 z4#$Om$cEoD3<9a1y_GE)%nH!6T6PW4ZmXi57HAZ!$Cb0fj0ca85XrF2vHD!46c4h`n#~ETInB0 zx=mQiAR~kdNLbnN3aq=0$Y!*I2_rN1!L5Y*Uczng88v$GL|wVD8o@hGVUw4bB&Y^x zmXW$!t^wIZdK~r4lX@DY9zLT+AD%!eW{S(I%57D}G*ydEdACmIxcwX)5mK|bn26iJ$8C+&yM{rC)M;46BafIE%+buW^8DK{*n8ze9*icd z!)TsO7`_i28Z|5N#hSuPw-7fje2K{u!f?4N!ACGyR`M)nQT!-yLBp5|YOt8#0?dMF zq=%@e;WJv(g(pzziD_^ea&X@vYc-glLLhw;rH0Q@&v>b4jnu53~@U5z5A)ctzldQDEXQAsKhCrltV-8y=)zfiz zj+N(a-FvkKdB9&;9cb+{MCpZyJTM|H_+pXUIiU1tq>gb*q7yC}K6hcijNrsv?)-iK&c=)RW-kAS`}C1DMJb zni=tTVUXP!xf1UzXU@G&p|3eCTywPpiWgx$0l6Gv82qY&8is>+M83xIiLqw!0xXlO z{dg8#FW_1hzM?btf zBa4xl9oNmD&gQM){!^{y!Nk2QpCfhv!Wt;QqR2z;t3SY>FaU&0VgeE5uV@1V;bD+R ztcGntq%^DfXa;gK+`Fve_?W@Zptfdp4n9XCQ}Hua!)JA-J0oWBttun&IY;??T^_Op z+rvC+3_;r3;N4n7{1!h`;Z7W#m}vENJQzw$`bo83UgDh0;Vsg4TrhW%1BNXKukvn% zCwb}EeuWYi_csUc1>}rIO3)&xN_3Z}y^#&Tl3B6$&L0qEHIid%COR9+jjzI|_?`SN z-R41~@=`I$%6O`7796cvO&4G&CMR3aPEMCE$I4d;QY0uDiDN|x+qMVnNCV*UMV?;j z)up-67P#W)01@6NqztfGD71}+V_*+>&oaBZ1V7_1Vvbqq*WrUn>t|yusv_5;QJZk~ z!dWVGD}?g|dJEELj>yyAm5;LX7_|8ihFCRww@TUKCU1n6OsNB@kKYH2irQdRL>YN` zOlE0ugwwL}0@jhoI=HALEuIezV*o84Kads=-9%dCgcmgMB~g`9w>{9H+?${kfREXD zokGo33R83Ci>|AVy4UBJH8!q=mu(AxE1FcGx{1CX+wj6`j$WAKGiuc0iA-Z-HGG3MC`Ie6q6Ukq{2PHEVR$<*#75*|e3begEn|Hx_!%?!j2idj ziTcJ_nhF$tkDS^uMvP6W)-dOa7-^FGE*Q0 zQlI_`d)I`YF@w*ju>nu??$B5b-z;n$iGEZ?Eh(GWDMi@(Vc;VS{QrRgu}|at2FUE9W zcXs;gRm^yYrlftb)M@VSy6BQiaRye;)zt1>(Q9x@@@B(Nl{`m%4=cM^<>v6tsgBLZ zIqE^Iq2)aE%{$M5bpY}sxOwNf6eMtUY~DF5Pu>DZ&F34Kt$YY>*88jxQi6**O4To+ z?I5a5uIAhv^KXb^>vCYD>}%evP6G4iLG+u|u~;KO_jM`%kKrzQck?LUZ%y{ipb5Rb zA-Ea0R858$8I2mMOD9(ae?uS5#_BmIR0Vzmv-@uVShS=7^@VROa4muTcysu+f@Mo` z1>gb=@J8>}(v#q#!QVM2LJ7m)bEg0io5R}*VKm*Wx+B1cd_EbUnSH96eHyZ(dvNd| z+tbJfldA{tOf7epl_9LttVGR*`h`AQUv(LElK$#&id^wUTy@a}D|H8yDoUXdN6&xw zb3*73C+xs6!b1vk)bVfu#ORY^*xsC+Xo*~BJ*eD5d5PDy0`Nxg8}U)Dmu!1D=rspa zI?#tlV#VI_E^9wZpljzjv@U=kyG(+#h!3H@^ksCZib?>FPE49dB3Af>b6lgPc_g+j zb=-WD*jnIHt1Wvf9kC_jp*c!cuSSk{^dJ2@J=s5;t}w7~0cH3*1>G~bjP!TI7l__k z{Rwt~)OZ`F@?P%HXF65+QufaovOP%HqYbczr`8G2l>^|B88{iM7%WL-DHdyZY0s{A zjtP1~+41E-xt!l}8N$+D1pwk%W}q$yLw27Z3hYa`b+`KV?d(q%XKxqNf%j-&gE^J; zcJ^hkOO)WkUi8tYCS$pfDAWlHB>`LZRi!MCc!0W3jY19q@N=IZ7Qh^JmIWZ)y3~$& zY)gd=pi)zy`N8W=06R5+2;W+70Vw;$Uqx6209-Es-bG$jxJeRzCkX`bELrSn0Ixv~ z0dN;w-os!pN38~l3I;pSCS4!l$_@vB9qNor2w)olY|{X?MFYJ1f=cZs*^qsf25_AK z_}6a=fRa#T1Ni)<(u`oR9ytWS2cb9*3*fs;OaQsPpVrTCWs3vA7S(|D5PYZvuvr7x z91X0s0F)iitD&s}gKGsqzXnhe!jeD?-gi$Dz+)@`yJXx4(%>Be2F?(=ynMd8%mT0p zZ8AbJT-oHR7|$MRDr{2jAVF*-h>aS=MqK=1fhe0|_ueHS@+uIY`u-}xp(J!j0zv%d z#YqsCBZuH{Cl|tLrb!BjPhu9xAUB{*28qyv=>)MsxgqDH{(6E~uR*Mj23A`j%D(4I zG>EGO#C>qBfDR?$EE~iqtVw7{hPfR%1jM($lpe(80tm2pS@~?0XMtFUHtDhmSJpX( zxlZ{pREQiUfSWad2qC@S0#G)_{t7NN4DFI z9RPaN&9_NO#JHkO+$anHYaIaAsxySiZzO;lHGmtVfqN|gW#?(02Jl`1a0@677?gx} zA;n8@7jTJc6-7m3@Vm&7%3k09Mhcq)fAr$S0OXOJ=f?9Q^?5^~sW|UGbJ1})wku;% zAta4^(c#wxeK>jvhuGe6UC=YxSUGn3H^(7vppRqSr&X>#9JXJMW7>P>;R)fRPCXMO zg0qAnvxnIKs^wvCQXUQvhG>D*lt83MVOT-=E@TW%8`NSRGj#^!b-1$7b;~6Fx)ZFh z8vfQ@uoQdLG*~uc4eIR+Kxf;ju_LMn(F(q332vh{Z4!Cvz7@#TKS*Z8bf)3o)NJcd zE4o%eikQ8CCgD)`#iwp|r_2pjF0lj>M>OYrPA(jt70837>2q)#z~X{glCLhf3e!GP zho3QdB91_tc3|D+Td5ike-)Wq=pT2=6v6H2})#@VTiAJWIty3^h zk=CP;$@msCn1V1f)LXGQCi&oPhW-1xSdC7~ES8)%UuNfx$%iT1brrCqv8__$X? zAjTr~Xb3tk6`*Y$083YtmjPFSSGOVl1%8g-h6fG!KlrR**$tv71X0W}YHq|>SYz-y z)RLGh8Yz(6%i*Pzp?PuvJGT-UW7_G-nr;S#(ERoW?Rj$zu}PMg1?Jw0dUB$M)MI(g zq^e6$%5+1DUlZfftR}N6?GyU}YNO}+-OmV|xI-adO@%=eF%T7}YU95JRVkD#1RDrc zd;%l2svV|O(?>8LRqcqJjjq6*Hk*I&Z)fB*^9^Qmc^4e$@t+|x z`}|n{gc>A-w~#npx4`h5gBQ#2%Xg%rT#>pN^3*u4oRVnfnOK)$1H!NSBgWpq39Jo;(FroMIcLf z3!k$pE?glmE+m9TV=A1Dukab1u0fxN8D2p32y1wpQW&`&*69+JVUX|S$vRiZUhW?m zjD}9vp9~7oZY;v5kb%5x;S*%=2dJqrgFiq9D>WHhk3S@XEf+x*F(L&(5-7e_y@7RD zG_nCdV+Nm52}c0e90kD{YmENzbSBj>Mq!>>4+RIjgJo;pmRn#wOWRQC#0qb;a9nHZ60f2e#&Qa=E@i9ZaPWzxO&xRI(2sC~ef z8@Yh5BDJlCD5zq62A@%*4NpLpV?s8ENj3a9Pc4Dor~RNw$QYqEPkkMXOz^dy*(37o z4;kB32NSaUAamKc3&7|p=e_G-P@u>Y$_|g(cMfJ>gUZLk0e|*@X_*}G*I2*M5va4Z z=xlF5H%7MKARFslSBjq^v8FVUgl9QOxI#$yQ&=pgk}%8Nh;l#<140BjYq3s6xE#A= z@EJ8$;R)m%Y$E4+Ce`rcJaxrNW?sxM_OM+o$hjD12tiIG6C?8Mj~od?>B5pJek%|` zVE$ZUi8_GPY=JaZKw86!B$y&<)Z-l><(eQ}$)p;7oTnOvubjp&Hb@%UNBsB`?xHVadBSSEk49J%-c+T?oo;4`@QElBoxx-F?P4a?@Z&ty4cQfq%;XolZ>yzm zf4R);TL%*(@=WR5XhY)XR3)Y>n#WWojOqsbOnkLGqaV*(!fvQBSkI*rjDvBW9up?a zYquD`uA`I<37jldFJZaKlD^n1oC*k=t}n?gc(<1TMXD7)`z--vTVxX^AlEN5U8|Ngj`F?y z>?mJ1{vV9@d+`5z`0vWj&d$Jp{L9pTK8$Bpwi|xX8843Vz53iJ-*wNA@@2d*%6B<_ zufhKV)~0h|_|f}E82AVS!(ssIe?;#2^TjfOgIzu9Tv#2#mHDn)4&!Pba>}FDf?-3X z-S8=hgO>(u&l&P`5Y%s;zZ07S{`OT78Zfiqlo4Nv`l9)hM?2)rQx}>);h&t7U#e!A zKZn|-+^>Eulyv<#Y4<&mG&tQ3_50?jf0#dqs1Wr*BEWxTpVcl0LvXKEzIFdCv9VwG z1M@t8p7MZWaIr5-?pwG!SxE{s(teu!ayo}~#=gV4WA)$iEJ=BszujGaMVU`_ddOua zrRr93WcbRj)St~O8r7HdXZVZY9)hH{Zf?})V5tSrCLxbtDhpTkxhi=cH$>#VL;-*D z1e{*3tY}8-g^~t)d9S|XVi>Dgk}R$MTK;O(5SxR=RREX0Tmd}eylrmX8Ps8I^&i-s zm4{XxsF6mJ>D9C7c^o`FHme|gx<3EMw0r5(o^#ZauLuz^{-0wj-t=^LtfGDR?C$U^LeVG^mXzg6KW3nUE<73Dnx4d|!h)Wlgqz&5$vzoGqOsrEnRxe)$z17lyoPhiZ({T7)wX>m`-M`&CM z*5fNNIV{JF#7j(80jzTy6vaiH$zV~_@IxIz63;foBn$FQ=Jzu{-~+>dXp%1Ja1I#~C? z@|-$YW@Ovl)GZIxXeIf8^`^&fopbya4=}0Ae%wZMu0Z_*+H{oXgtuVxq%}u_&A1t0 z4yhPtCM5UcHmb9*oV6Uu{z69bGdwpiIU4AU1v|s9or6Ql!MB+PPe!;oxnCo4oVcKu47YmN{NBtZp~6 z2MR}nEf!)+vA+;Ja(8CvNSwgpq5SF~2_!}#1|%Bn;G7L~AW9{Er&%q&gzE}Q%5H#k z>sR@a{VR``vXF&!!s5i#Kj08Zk98ad)rDAi!MHE(F)I;_yGzT9`=Q{`{`JIPf$gYl z?XVbMD;PflW+^A7JjBAh+5yd&B1e7o3=sebyWlxBmDn2W+|oTBA2VR}4;INmae%%E z2gSuNW<|BbLcxgJZuK4TJ|`3tSh$ge{X@-^du66v#==S4LHrer4Z>S6Ns8u`bBns! z4;-H}Pc4?X1;lb$BoKcL*~?mnZR>7n>vdR#oNbW~%(lYY3+9!7ykBz%4`^;COMob3 zJaG}nsD9)5GR%J|bP>;G30xO#(w?;8r0O4^f zA>kEH^f7pZ(AjO-GYFp5EE{dtt{)A;`={$CGv|5N0hfjm=?=Suv4 z8UOQ;Zvp;?kf#;@4@17S`0vWd%$hJ^f;$_JQTRXMpqztqCyYMW!*~31WsEuGkO>nq zCU_@I@Qs}?Zo;7x#!i@!H~uh7@O||6zY+slUukjbD|6E5E1hK?vYi~6qp8=~sK1qw zu=C5t*f}8aRn>|7>M@|pP|rE&T1gF9sq)6bC-(VDkg5MBhJRm9zqdm z1el#F7DB^GMZ|0}z8>uYh|JKZz$7#)^p%RZwnb!TscM9Fmcj}}#`s{G5ETpHu;&2wf^;)=&P=qMQZWMGt7&?|(GSW_<5dVbGR?4p5If zL;{3z<4P>zFmhF?vW6yz-$*z|ilz#s!$A_-DUwto;9%86o=-5^^NWh$kGA4XBY{{{FvMhbtpL5$i10dvAr_F z0uTH{H#+CT<>q`y4ZaR+H2n92UFNI486@ouvA_nsk4IDOx_Royr5r1q9?0*1J`+2cDIDum>*P_9$Ihr0?8_;}44I@i=MK1WE`BF1T_6|R)e5V_<{ zuOw&e;8g#FPHr=e2KD7jF}`X1TbDuIAk`QAZ%__F&!De5Cw-+oKOQ?>cK9E2wZ7iA zpzu!}|EfPHgcBbh%V_r(wsy2HDBS5^OPZk5X>GVJ7x+R-+YyDhQHQxRLK9Y0uB|%M z<+}M0CVYJPC&s~nSeR&na)uA>1w~~!@J5$U#(P(3xaI#=c%XS1Ovu8e?vDgMDzH{9yUG@G@*&$fXi^3^eK>Ya}4NsZZ`bztNns~f?jg7Abn~4V1n$7rIcjG)Tl1vE65(fhBKuVn=TsFXhdD6ql--FJ^yjKNXoF@+ioYG#Mbr~-fSSTrCf(pCo>s)8@EAtSI>eQL55 zqIthM74P5)FF`7i9zH>O2s8?i7h%Y?o|>b+eiR40UQT7Gw~3%xjRI>*B?8kQ-v^H? zslfA}kuDg2SzlZ6OGReV2`y*qj0!RS^sHswK(#wEj1U z-s^y8MD^#J^%oqV`U}naH&f_qd<+kN`uH*so1o(B$*KZ95@6IrO2C+>IW@t?2WZVh z`D0@iK@C#f(aGx4sN!~cG=b^Z$3VBKCLjuig_J%G)_(f_6q?mMlB{Mw`s09SvRTpm zWJN>cBRxD=w+TYVCac*mcqD!gGE6FIq>vtr{`2L0gM((&#oqwi;RZrf zAaNxR>X!&S3B^M}NWxy606_V)Y-gg(edGdGfv@w)mF0;|e|k?PhpqzamAswAi3{h* zAy0VE+fn_pg+DXAk>ikx<%Qnmz={c*-sM-KP8S1pUR1VambPX$JTT7JT2NGunEu96 zwc%5G*z^Xx(8o$!U)PB+)v0gm#Q3++_RdHN8^c>I;$mduB~F3Hr&83!%%9eoampb+ z>TN@nm*d=SD@!BH{W$ZyLtMtdH~uJ zs?odNO4Yn01VX(D7$~c^QHE{1s!{_L-f}vsayd{&E8&$o(L~u?;M~ z-lt2!pd<)&^Yi`5&pDtXL3()0bX4Q2n1+)D@q&XSp=Q(K6`9En7<_u49J}I8*K&}z zd|VjywMu4iG#n%J0G*)&RlWB;hyOPf9LP@|K8on^4aHBEfS~&ElPYcilK5QklTtB< zgMqA*Z9#krKUv9_{`^Ez$xq}(_O*ha6mfE78R8wcm`N3im#D-X!UtxuinU=mo!x=C zffY3;?A@j6Xjmlxe|QViU7?A{()zki4mQqHSvuLA9cz$>v%_X6bF&d4h`ElO4`C?; z;*3R@saTq;yuy&(nUdvhnL~{w>RXZ#+=Lm0oA4zjXClXD*B}tjjg!|wW~J&pT_--& z@Pk!D?_mOS;@eJ!GJ8DYhaB7lE!}>pfYkob{b(Rw0m$`6U~rRDG{P{elB|RXD^&-5 zjD>)(dkG#9)?_2BW-6gjua`;t;VsOPiZe`M^@2{0bD#81*@aA;*&OBKF^H6s$*!)I zoH!m}Eh;KDSY73pjGFcM%PbK#CoExosrrKC&5PAAuW%H;;9Pb-=SE~4gxkzh<8-yG zVXmWwZCD;*s1vJ_Oa=8`a)|>;HdEoi8a2cl)|iq*I0}gl9Hl+mchz{G#w$4rKZB#R zXBQ?vlZ*uM;VmnXEF6XPm8hjBvqf-}yYW+>z2M*|{0NTHuJ;HFNBJxS?*CPelFHo% z@|SyImi~bJnf!f4N;Uj)=b;qwDO? zUmn#!4a;9@u&xKo+duyDXr76%!THOJT1Op>zx+}skAS~?T5^tzzs#1rBjPVzy5Ifz z%Z(bYe*EP|?I_nsO3PmwM1-dDmsLqd;^Z%DlAj0XFD2uM;r-w*e>?C0BmM&GGfp^i z@rI<%s2__%Y!~Z=Wj@#|?iYO$6872^W(yX@0JR6HUY^4~tpXP*;}yrlOyQ!mdkQ35 zVjNFT+KPI*?OLk+-Bo_5IMxD>+sJxL)m5Sv!&%$|v5Qj0nIXE%vHD^7ErBV{2_dwr z#}&eDPr-e>{P3)(0N4_h=4SLZg6$*!hZ<9!_ehuty12i8kOj{;;6j=UO@&d3~Xongqgo zr-x3lkIyGnczof#i!1U5e48KAB$o+`NFr#LCQoZK$78XFgITA@V_?&zLNLCd#8nRX1q9s@b;LXaQ5}$fG|wW|DMI$!1;89 ztk8#?Pm?YF*F7ZvbB$m!^`!DYa5a;QR{ML>@xRACGTSk%QAB?X&H}L^K_NaQbed*U zQ$k}`R0{W6bo5P(eBHO`aE#+Vj^pJ>!3ZzE>7qqUaozGcRS5T03K<0Rc4lg(s2Qlw z+_|L5etF^${047?d$Ciq$PVmhOPrdRZZ$HV#G-1^j%yEf^hq{T=R_dC5o_=+yUmsW}WS^M)Stfeci{t&@Sycrm^Jq4fVX zEL087Lfc3YCNYtH1P~n9tiN$r5iUK!tsLo@>Ni9ca66dl9I(7nb-HM8V5(x>u9(H` zK*46&xzK{mUn}CwRuus6^F1&RPS6e*0%4;(8WyuyLyU3L`yR+@IP^_$^=POg5yng^ z4)%s7IM`fHG-pN~MnNvR5B5$W&j!z}x{*A07iQ+I+3^^lr}=x?=cUG2plwP6fS9;F z8fcVT?K_GCO*hS4gqhlg`yX#Q)sZdKG4V|e-X*wZ5=J{Xm!rW3Y_Kg3Hbdd@Hx&C@ zDyFK%I14Ccp3-cr*>#(qjxsAX*ABiHerH3|Q5j@<_H4%FaaeZi@!|a)G6K+y$ z15&R--2J?jJkz@b;i>Rqk;Fz zGmT*1yz-;f64=>H`&~AWTB26Ug2T57tdULv?~}8~_wmMAE;INoabCZqQ<$WEPm}v4 zoyw$Mgp%mPCGb~!v>>3N@?fmGhaid}h*|n`ebShF3HG=^k%Qp%xkB{V%>tyLBRMjY zS{{6NP_*Dff=LU>yjM?%>PRDSZ>cH}WyNjYcwkgEz4b#Q*c1)s^GKD&D0_s|fbEK& zh2AHyLSi+dg~ne7Nr3jkx4JVbreYsW_%?TD#W7_qm{pRoLn^`t!#VZC6{UoX^)sfGO=+(#2iuUKJ-@z1V z_X_J44Ar^rL?H1wtD)2&9|SOJbRoPkO&dNHN~tef#`X%tYS58Vf?<1qWI6-|AJ`z~w(*hiEd3-hc%OtO;_*J2S=>-@EaVF;>f}RD;#PHv zl0Hk6NEiXcWWt?TH@vT1#uMC#f|28?v}ojb_L!BLhxnMo`lCbp4Qp3&SamqT2_oOr zB6$CMcJ0P6TK@kW5r;C^eeuUIu;o{ktrrHy?dUcJ#B?*7pQtV1mj=ad&H-4pN#T0-* zB3QTgsbC+hEDK=|8IGNxKCMW2rUY_!?UhMp)d?yXu*yRIQq&79;6}_R134@9!qek| zdF2WaWB4|h8Bg>+>CZWfMu^Hu%n{yu&XPRulfj(uJC`jR&BSnBA&V!bvI~9af`OS` z#u8{THphb_zCSJU3!FG-A*TI8=zVDP{b2X~zxNSZ5Joq!L%*7;nrlJ%9R~v#h67?GxiABDM5d?c>~|LJKOUO4qXEbxE!B zN_3b^c0EUNy^q?aOMjRKSD6p!P7YOZU`Ya!IE(va7BdXd`vi3FPrshB(C^d6?GS8< zJz_b8O3eKReFZF zQVJaWc0&a;Cf&dV6*91G%W(LWQq^SqIxnKBRs zXvahW`q#hv3voHC+5OMJb%4!E5Mx&V;#=4mM~w`Q^Y?@svSbaW-3)|5ybIyIfPt%W z@YtlMLL(99h#)uo6BmT82eqbJd#~k9UAnUKLIG4JBg8N~K~Duo2(K88i$f<3sQgwW zo0WeaxN}r4t53llO{aa)9I+W#2%8>SB+=(wsS=0o+;A@p*aN=J4_zoIfK-P;uuFPz z5^1eVdLiF9u-A*v%^X-Wt`m+I5;lz9AZ*|bxb301wZcBRH>{5qf&V6x?tTeIneWc^ z*iJtWi-1W=Rx8)}^AC<dV@C3Jy6HGbMrL5`;->Eb#q0Pd;e!Mc zYVnxS`%u7yXy`%sGorZ%&-DcS2J25SCu7AWV)MzboM=|?+H`!Vx;PuFG2ZVG4KyT9 zv3;Xh(&S};#3jn+x&}!c3g*=w!HZy^H4(-=7{xB$wNJ> zPr}ZzY<1okEWP}zcg)Ui#Cp9B>gKnAaqDIuf5QWt4#ohyy|wcjPjMe=dD_lzy4c4=R8w3>_WCsEUej_gVD-JePo}XF)#DaNJpWG2R7nBmLCn0!N zC62&06|A$bb64l07Vp-J$24Yb*WaS<>cnabiPw;Q1E1iFes5$Kp}-X|fqU(dv@%X1 zYt|X3(E+!{^lAvjMT2XQPtSttz?!PSQ#<|Z*tea2@du<(#yaV%Nf|$tFbZ1J3s&H= zq}~6_t{i(^uohc1Njb*Fxv+H9Cbq$F`V_sopzzwaTcd&6)UnG7*4or56Cqr=4&Lin z;9jhQ7$x3N-SU94+y)c`-DN%>+P3i9(^shLO zzwA@kxwPUn>9D`Kx>`CsHye(*X5nwm_Cy+l%`XR+g^Qx{JS-OE)>YvyE#Y@^mSFB| zte%_w^73skWo-mkhf0Y&&BI_2Od8ncy;aTO%4Ra@Kr=bk%V3iI5mGlm>aYk`Db2!! z%u&Op&mv*cYY)O44y@TRdrXTfm1k_*lWBL=^-=TiwaiM}=UUCf*G7X)L>j@Zr5TCb@WtgNs9Gnd05b*q@89OXcG0 zkk8`c>#73J?(}b9?@Zo_xn|Xe1Sc2&TcIW2!Nuz>E?%F)#p{KOKWlRFdUEml)Dg)F z*7qNg4Z_7&3m0#M_1t7F78h@{xcGXLi?0_hzMfpX$>icEK`H)-i|>c%5q^%PJ%nPP zxJ=CD$&>EfW0x;;xz6Gvbaua_aL2Mxf#qT0dhSV&4@wp-Or#V}kX{=7X<&qv9SK^I0)NzxJWx9vCb$ zhc{RbgA4Run!K*gmF3SFV9w(G)fPyDrH8vFLz@QzRT4|eYawu3??EtT^?IKQ^uiVf zG=$DgVguPAWOf6YNmSq)Q9)#OTFC4)k=Yr)7A~yB@!qHWy;#wMXQ)#3fDZD~tps~< zg_`)Ckddyar57{vCbm4Kp*Y}KHoIT*D|Wkda$L2t7Ho^87i8okYKE}#}-V0#LN#X+Y^LurTWJu^q4}V|FgQ!O;CYY6(1V9@moT4yZsY-Do-2qF2z2 z1_kc7!wJcFJYYuj(2OXa$sW|(7v9^wtPFO^9*`x*f-!DF*z_>CG|gZo76jn#+|m9v zpufjzRG=qa!}JwW3uB%`0Bok!C%b)`VZ+;fY!>+Jd%J~JPc|KS+Pm^cXeHTti`BXW zQS@t_MSjhN>y%xwXI|ts8B|>`k zWmbH`fGbFyvs=n|pPatpucR7FYsg~AM3I%~Td{|U#cyJ{a9VkWx_Xb4vNDs6>D_Gw zx#&g4QlF&o?#Tdmx)o%^{{V(*_P}@s?+jwXtTP=yV#4-#jSWbF9hLRDt6LXfi+zg+ z-Q|@B2IHCkB33yEI+o_fm!M4iCaIo%4ngIW3fSFhR177IoD?=g`TTn8<<;)^XIbbh zU5L`7XUaCH%&}n0+pnAvZ1#R*Em|eQUVkOd6H{h;W8C72+Qci6v=tTyJvb1>-^G5q zSJ>Ha&rGyZ!Fw&^j9?dzlS0I59dvSD-V*47n4q<&OKd6h*CCY}J1Xfe4s=zHM;gWp zIb)%m*4g*;wHB;OyaF?_HHfQ#(gnWwQp`Y{q+c9pUUrNV*4xJe(Qw^%=+47i5Wh&W zns{v?wLvikI{{HNwHB=4)9UGM;MLlzpafpiWPujjxDk)p)#0y_1ap{xvqG>&bG;!SZ1QQj2Hk`$On0+Uy4h&Md0RlbiAc0g z>1HPm$uzr(Z|G*Hvzz=hTsLJ5yQx?RWhY?l5`@pL?!)BPGa4j(^wHGs2{(r*F89V- zL>kJKTR`KaKD!^lkM4w#w*o!wEm42M(il~gnV#ge7JPCUL21-p66~ zBsPdz}pM?jRcEzbqcJ9tiHu^CqH+N^)3Ag1Z7oA`U8S#ID zZsXl}puWrsow{oe=Z-tcN^hHL38j>3$AV?FxHDT9^tAeWBpxA7CC!3KT9P#mD#P?d z-m$FuQ;ZUA)4E4@+i0hMtL;J)-2sYyb@4?mu&>Os6@~*6wMOFh1 zWH}&4?uG^<|D#0nLo1lPS`JgtlnRBWAcMS%i;0Y-x@in5P;HG9(cY?FeWP_jXRE)n zltgYG*PxF3w-7n@6#+OoN2-hGNI`5;q*g8kB=DD;JD)BS0Km+Y`Hi8PJj4L}^Y4=8 zYgKmbh$8u>M3G>vuFPIID%>Xtb9KY>2)mWqk3Qux3UF{!>(tq?;l52iA@{)(5_E z5cmpituDajliHFgtR)AEh42%kS0`t6W+F53%aL^l?E~Z6Ix>MXGo0b9P8lVXAGqA- zdOzGXJ!#)2C429A#4*n`Ikg0|1_^Im>*Zs*EE2_GZ-_N=|D7$6%sU`OJ0dSGxd>$5 z0ev`>3*EHgWl6RO-lkJZ@bO)(1rWV~4qUK)n9!il$yhis0C=3InOf!XTPBPd6>RNX z8V3zQjFFunG126p9d$y{^cr(f8r(dfBwb;Xh`aJ~L=k5(GTu{p7V>2=vWuf)WBvBy zbPhJ>UWNXneCy>#SMn=>TLoh%K0~oGx&RMDCoonu7J6D|XLs2Z-j*BxEz(87!1@}m zc9#SX3t9|+3$*IyQuPhlf)9Pd2)4{q+nR|#V9DQ%Q!ODkoDtNmp-iWt(`ek(DZsMmVrsQ^o^R+V{XF-|=)l zU>*HOO7~ufd7)B^oS*)ePhK+_BL z@CC9ja9MWzs~8A!riuasL0gQ_Q~!{IB)ICuQk5pi&|yi6g5KWKT96z6ILcwp!f?6t zIBQapnJ_g)*8v~NjUR;EnC}b=+tp;wcQhqh{*!-}4+EM2m@U`z$Y*n9Uyw25MQuxS zeg(NMu-PgN6O5NsC+bd=djvS>U81sFY&DKe3RWGk1ed5&H4s*2S-|A96y-{$T^;0} z1sT9o*3!vB-nI^CF_7DJr?1e?Rh>sEd zjgkJ+9Y{Gr#+1Jj@ow)^O_3KXCt68bBDNiIB@St&Eh782PYs@QBn042!KvGs$uiEw zOVB2!1Ezs2(tTJv$~kLLlzQd8$4NU>oDphBRV_IXT-3IJi;0G8Y8Ch2F$!_vIa+a3 zt$vl109f*V^)2=bF+E){Lr`%GcJ11uL(4^AJ}jJ!Va3$1Kr0Vfld;G-8T;m`SFIV= z(@#mmESVrY1xgxYlQna)D|}bV`C79J`c?SdHw85KJIo3ha%pn59a1PS9-wwNpjOc6 z4|RtBBmoUiUxTkF5iUAlJ$aN~Pg4KuNRAm+ly`_V#gq8;ki8Rno|CH2Rp{j+1F0~> z9OCY_LvcwF=k`U~QWHNF#K^g@^l%&@HcO8T4!K}F`I%<(Q!s>Yzk+M$%cde7i9AAV zX^#wA`E=CB)$faDC_4;pdon8W4IEajt3f*LqW_ls2vhYirrrY^=2W?AQ6I}TUDsxn zYLnBGy5^~!x>RDFHIZ6pkLhYV;zoNK`pTQk21+#mX7?((30_X?g4$Mpt*y}9ejIv$F?YG{8;G=+CM2&Qc?Mx!4lkOiqK->0W;e=3J=n*U4*@sY!&{vYZMm|I% zc3`ZeEM=s8!YG_9U&LHueR8;{r2*}t?!crLPhJO^J)B7$@q`;+;8hjXWfGP@CF-1J z&JnKRXnpU+a*SS89GR*a0=%lh-dch;WjjQ~ve^Ur;#y9xsy-NtXP!4D4mMB8f@wR5 zQ_P#%O|R-#QE9vk4{Ar+t9sUe>b&As4fbXQJ=^xUM?a%+(gfn}q<4#M)ni#tAszz? zy8w&rR=sXJh#vS5q7Oggv$4yX^0@d+^{GB<`cz9D)xr}9pQ^`a(lK3{DC{0~^OL^zQn0pi!u0q@%+{?`V0UxV=52DKAe&ctM=XbJCo=^Ys( z(P{C~oxzVuzio%K?Ld(HVZ@EYd}z<+JU9__NW=N%@7*^-3~a|{v}nebW@mRKro3h9^& zC-Xbe0Uz-IemKE_0y946Bfs`Qfp&nuh(1zsNxL7{S2UT+D(ydS!qOQQklk`ziNj&s z-+xXU8rXsO&u6@32_-n&P5-%>4wZ+E4D_ELC2mM}(tj=m%mtm>O6>1HFZ!*tRBL9Y zz|v=YyWRGmw-pCkmL21Sbx8j?@Y+UdYtTN~c7H>A!8SZ?&`0DyZ+Ac6et8oV0oXlr z+GjWQ+Qpszb6^_2s&1@toVZExpSQc4&=uQ%{-!KMa>P^K1_3hAf8J*K&%gLbS*3ss zO#k`xOrZ_!cV;)QK{xBHZq`XR>ufkjn@f8IX(nO;n8!_OHF z687pY0`8Ic&t)3G07xVndE2!Ayb*!S^q(KD`)atKDNz@`Vxq(0KX1Z?DB`Yy#iCnt zfVLvy8K1qSKxpg*#O$ ze=Q{t%g8yN5&tuob^KL4P#+!WOcl#!yVHSw+$Jft%jKvR(JJlkv2E^Aa?DlyK@_y= zmfWIqoyyR9fgK4@n=0JBUN zx$XY$Hbf*Jg?%0a0YoE6#4Kua`wm#Vi0A{Be|#kd#~Kl_uU_=5NZq9LbNa_khyfta z<97PTB}EUBK8G3NSk6}oI{o9@9R6{O+6?*!sdO{;1Pb!xM#?T3C&7lJY%i*NA%ZhFSS^bkMV?kgki-K5&-k6cmZ<@~+=SoZ8UMHx80Z=Qoi6h~=NZ@RWeEO| z;vW}&u#NulO(F+?9Y&5oaS;0`nT5?mZhIg8@ho7@^p79$J7SYgqQU&*vr_G;rhiSpnOHzTN0{NpXy10?2tMjg>V-XiHO z;mQ{Ak2hxpTTK6Wa~4iFOx1emA7>7Zin|H@NBQ>4pMwk8{7N9WSt!tgHzWWaLN5Ms zLDhCw`|RwtfVWzrtDr9!xY|%1`y%m2|9AtE z>q^zzy}kR|{ZNpS&hd+$WFDWh!nSMb%vozW#!u3jVz@MmyI~t~VHVD*qhq`g-`Z#Y zz773o#@F`QziUpytsUbJIUVEo!Q%YC(lIXlIMp9sh|#xb7Xd0DX1i-nIf(>^Kl}uX z!ZD3xu4Xu~eY&WGzWDDjl&K!^rv4uBnNM(FJVRC&7cC8Eb`Ihbze@YWojUpLh$c3d&O5tF<;^y5cz=_P8pA!KXL)n3-R8MAn&x`8nksO z@8cp${DLm{s~^C4iuMD4bvGsiJaO0S19>24lm2RxTZw75yB!|rt5A*>S@Bm(Dle*m z(t%VxakR?9d7UeY7Umz%*!$u0=KK?Xb@x2A=%4Z-NmRNLs3X3%YqXkUs$K;da*i3I z=vO`mTA`BVy@ydUQg)zz=8gRbiB2g@5o|+8rGlsHsoN#Y0Sv;bM_kx_&m{r1>JU4_ z4)HAISeZqw@>yz?R`&|10l>E{97KH8DHFxw{_s=?_svb1zHO;fyT@rZIADY{LhW7X z#qxL8I%dA;W53--1eyNs2?Dz5HGI9TAXndOdS?31^mG5|=Th8}!8W4A8H1JT=YGcF z=f-=F#hXQ-U{n#OC4O#_qNcodziOlArZ`RfREgAvFWY`@=iI@v^n4ru1db0C%<^$} z)5ncvBM#?5P}sw$7N?mcecZp$(6?vLH#I;}w?Itgvf&JCR?8)Asau#?J0vZ=kNYQ* z=4sEK)33rE8;B=Ig$^HgNLM(xkNaY?#RJ8WMo36zHqg`H>%C8Eew(u1J4W<32$N@8 zJDej1ukquL3tAGj`!Pw-{)(=CHqwULA&TI|MvvjeJ8oCb>xxi1qhHqUEsPVj4L7nA3|v2fsvHy z=@R2FeLYyL1?~YFJkqt_;r;t>wN`)uUL$8_rLGcCf4FNXd-s##R~@0fd%fnrdObWs zd-s=rCQLWIz56p(Vt;%0Y3rqwMNZTLvgK}(18nbJCl-ANIzF;@|DUpVH|!!^jmX~p z*T*Dl(%!vIOcV$$WZ}0xTt|GVZFC%H@2=BEFunM)R>@qG4Q1~>N^0X`3(Gv&2{weiJ4-UBw|74!t@pEcFE;IR z>FnM2NZLSqcc(7%-)HZhC@R|lw0BQ48#r+G?!Smlk7SkXzU|< zw*(LioLr{OkFTQId^5iV(_?b_t2?WJNg{}0-`OX~%se)jH_ z-%A2&Npi7wU;0x?5YB5F*1ZW5C4=lKMZXT zKhuObX%F9!w1-cX#H2m^d5LEn(jLA`OhAL#!~ZC$o^>FZ@`z z-Z1uXF0dT-aQ?)0mVWl|r~WcRd$<9E%YWD&9`2g&bcW=)mX61ns}k>`GG&VXKla`Q zKC0^41D+%k7+_!~kVw=Zsm2xsTQpk1fCeOhmgpoHzz2`pA|2z4!VIG26%SE{<5+CV zt@l=2Dcahqx7_-oDmDQnL9v3;N|n~2RCb)SjhZWi9hvX{U;CVSB$I$ZTfgrs{BmZW zeb#=hz4qE`uf6u#I4qVQ>5n@h<4bwSX9SMW7)y%?S5pKNq(Yy1QwAO2iU?Pv;hX}O z?+C!9SP_m7aQhI~;gnSt1-0kA)^~8o1>drk_2oB5>ud6!&v%3zt()--ivy5iU%X(I zzNdv%__+pzLsTXYdgE7u@JVh^_0qt5?jJoV7xDoc^Hi-l*jt@PRpI5ed z$!XZa^gQK~O=~+vzPIe9A&fAuNbWt(c(YS$qjs{1vsK)eXE>;O>Kc z$qT($7@dPw2@+*~wxcdY@7U#w!$o{>;>IIXtP&sc(o#6H%68Zlo2)A)#g9Q)t~0SN zr{>LH>Bm$IdSE*Pi-bp2{#FbN?A2GcsE4p;#osYzG|pojmXCQxO}hh7 z6;HI9B($1ca5L7T3IOJ_=@}QS)D%}IE?-01X4K0;xRWGpbL-_uD~+uv!VoB|LSqw2 zLKU=ia}e;!7Q_4_s$ldI)9H$^U1~&*lv8~ZsI3jgZR{by`=J~pUGw( z8oz^$-@)wR{1{DmSPh1BYC3?2J?i1#vhjP=MXROpLz^mS0)+*e+A>R>dMm@LaiatVoXCVnjM3r@%w@@S37qaXwHRM1jC! z~xwA!}3+}cMd z<-jKvoUmV_Cr|}1x46;EEgocX%?Hln#pG<8wjGw!zXw;K%a%^>6m1>V6z0yBWH&}V z{hCvNc&sjY)Q$D<&Pz+gN<{8p*%dMCIA3S%$aQ2(rl(}X8tpuoQVh>xHooIY9K59| zSfXfcjw7e|cBXiN27t3~mraf@a7Ye9GmO23fqv>Ci98jNsbYDeK%r*{ycpvN_sOtSB*}{Z zaqT`EXTd6CbzR(N1FVbtY{c2_v$gIW%s?!jfWY?Ft3c9`vyGNk%jH!Uf(bby6WKc zgNAoRY9oG)%H@UPz%TcwoK>uiEg_Q&le|Q-s@qFP>2=#27o~bNkCLUZn~YX^3!E3~ z3z~?yBYk=39IsjUJti3=b^hQ9>l&FIPA7GOLq|ozPcUaWye-oK++)}$>vbx&I%WD8 zBdrrnnT4k_lkG(gg1Qt>+mb2gm|KBD9{f+t5f%@|8FM??O;+9(jq;1kH~A-E5V`Cz zCF#TtRX)mLfBVRO%D_uWnq?EcMF9D(R+@xmn50th@QK$G{tbFPQ5lWEoh`}o(b~R^ z2R)YO`|DpKl8GuwB9^aYQ9IwUYc3q$nZ1WvP;oQS3Mu;n(0KSMqcX>tC8R(+P8YFQ)7&1vF9!}QnD6T1kx9ubv~3jC*2M( zkG_q2ZNzZqCrMjQBNDV@l|q~gZnGO(>;ztsBWh6 zNA0P+6q=iErt(#s$_)YJRDRx)uP4a}*+VQLuS^mNxuAA?vhy7>>Et^IJUt?H8s$_! zghdrfQHiPkn(n9iB|S{_{FZ5|mo&+#9_HS-Njobr2hZ%lNIY`_*^wpbDCG>_Z?nt> zoZoitC4WS-Qu&c!qLY-6slC7l`>s=#U?~aAz#|6y1yY`n3v8(zP$-qtsyeo*?&t=@ zF{bJwf5>>UW_)^U((a8?$I}hO1^7{l!xX@Gc1a~sp!O7(RCZK~ODaU!E~zp|DK|uF zDO*5jErd6{YBdwOqlA367ZTZ=8F2#ckZBI~-d4q=(CD{spw zpcS;mi#8pToYGx40KXt6YqdP)hoT-xU0C3IVljP(wh~DFO#i-BsG(2&=x%8{R;9+$ zm?Mx2HXp&kHmt#a{-5#%JZzw`)D;i*R_kGgj5{DV-i4pdJ+}+_*Fqs&56m~~KMoA7e=Be@CP563{OKFEn}^JoKl%mk%bn;9&2op% znLX?3nea!Ijw!Zps`)0C*VCpWd1dLxqf3`fDvd{ag@4FlWqu8|@K^+lu3M5FW76P2 zbHZpRE*h(e)s68oCg6<+M#Ey&=~F-dj4tWS%am)CzB zd=!lXqPsMYxqYU8DfkdnjGK-Yd?p+`B!uF!aiA-+kq_ffu)ye7NPq*5Cgo8t;_x#{W9c;Y}%RqknqZ`--uB!UbMO za42-TS=8&+I=1FADoagV4t1tFN%pY{Q?f`a0g0?+>IA?WFXX2~qA|8&E1@#;W8Y}z zW^X6T)7b*P_K@Fuae>!AXSmCYn=1g7+1r&vV%!_OmXIloZ@+^WCL#;eq9X2ANZgewJj~+AgER!J|N>Hl_?^>boh--Hhi;Imp1AIrMXO>nk>;v zx<2p}@Ora+$Gg#H$-59vpc=`k8lyeEQdJDy$F z5N?*?%`-7>pFyKL43h`+xn-3qa2k8Q!d*7ry#P0o#>^@=AaZ=J(KYUcGPO7(+q)-% zL~XkUq`n}3mm}yrry)`UO4Fr!p3bZLr1C2G7-T$LwzDcZlgEg+?GCvXAzC-eS78AZ z$wlS5N$sAev&Z&>+$l-3H)M6z=2Yxg1fKp&^G$f7adkQXGZcdQ zRH@2u%kI?|Xfqr<8C#^jT1rV!_2+|n&`;`*Fno@aWb`JSdPeU>;0QD^Fh|&IBb%p^3ozBPY9@O~yVp!6s@_Rc2;=2%A@2$BbWEQyrB7kx| zoQkm`)$c|dV*`MFhgNp=gf_c)_LtFy-5eKuW8#?==v|wuJh!5ZLfxv-Qhcdy+v8%{ z$!*r&=QOn54zlwXv&}zD#Iv(+1W{cV`DSfgmFZJ&Btvffv;);L9%3>c+Se0d8171)y;+>hOv^*l&iz1`r?4 zO@8_blYoWjjb888iuaO<-is{84zD@6q;4+~uL$7lpOatz9Jy*MZlp{Uu`hC|J(G;% zePG$93%AzSEp5(qIK(IJE^rv}vnqEt!?yCbN8(t38>oyUaP6sW*woqYVN7 zo~J5Yps4IfpVDo@s_yKY94zu(NFN}$mAujoiwJV9BFGXrvFi8B$YCBn)qB0XWMBh{ z>IuEO*OBmi>KQ%ku+?EK?T81zD9ep+G)N{GxNzd-;_O1C0Cn8HjGPhq68hh#hr?RU zB?Pn**p3o3szIZN=N+t+)W@}s#0`)4c73=8iU&dNSpE!NEA@$-2myihiBh4hhh4$p zxfJr(>#NC{B?F7xmSr8KU63!ZJc@N&S*c%st;7F-2ZQ}wR8#r&5eUEgihrI$q#IRn{{@W2|H=)h$7Fk4g|oP*i#V_!2C|3r3+htE7N?9ZLi{?m}dexOM-h z%TuZH*Mc9gC20qGk$?B_33`^-(#uOrzf+dxuAbAY0xWqjXy^vk;ZW_E zSJYWp+oa*a#v%g0-n1 zFymbi12Sf86~O%Kkw5BVjB*6~A?v0r4uZ%ej4tDXc(9~)u6kS#77K{wYamsMG9sr& zc9{iIk9ATF_Zq8q_eecFfa$3Uc2ngyNiQQilZO4h%BI)TWE89;UE@kB8HJXFr-r~V z9r8=$B(py$4Z~~=vNH?#f)Vz8z8sPMCt06!yQ`1UX47?WqVPg;1wBCfa}a`M-7F(e zOP{I^HWa9v<~&h*5)wAK8m1s~BVUJz5f5UdT1IsKRp?y*y-=anW~=XsFk{)#smB*b z)@6bj}+JCvlZjU=}kOyh_epVl+_#TYy49c5*8f3#39LwjeYHZX!yewC53M< zDe=C2Ly6Z!*ql(}1yaWRskQ#KTTkI7IPQ|V50Gp{T_Xr`xv|3muzce+M`VQcRmbnv z@ozdJ`2;wynb5(Ff4HWkkbm2bWv)hjtDvj`^KNpC{4qFmC&by`Av3SPM-QWxtN<=~ zgRhZ`zaibOr;~0}MH-D*n(38D&MlW?ArvnOyC3fj?oG=Z%;UEJ3E+E?QF7IMudNkv ztWxlFVE&I+sZmfSV2K<#QGJAQij_meqw>IG7|Ioc8`OHU+wt39_4Yo8zrWz`0RA#` zZ6ats3@fG@D{a5i1;bO7 zJJ72ZEg+y4qrR*{kR!AdnjI;yE@RPC&k3N^JurmooZ4&|ozMp5g=+TT$}Uy+ zD98Vvb$+y#9G$jLmJcUd`qs@SRSO-KEocW++U^sBuAQ@TWUev6llK;(@FHC zwH`*P7DXQ?TI>-8mEO8yE!Shg8U_wf?5-AIx4 zIR_WNCO`8MTUm`mFM|Pp9u~-;H|_F}SNb6C9w9g6hc$btklblE+?VVNlRFW{c1N0QgK=Gk%06J?t5^K5ri~ut@=H+JD+AEAv=jEa(C9#VBxk zN3gey%E-{vep|;+)N;CGty6uH0DQk{8?H_%0ojt6uoN?!g2B{l}+V z3%gUHrGAv%AD{pOs)!fdhmgOI)6ozwco0FvJdB@iy~*H(gEvD(4vtF!tzFyZ!= zJ+)WPSU>-6NDlpP;IqKb=a9L4o;QcjvDe@^@2-MX^3#8b{0x~PKe<=P&*?t-Ico}j z?)y&e3jCNAj`acgb*^8G-*AO%{Yt*q?*aWc;g#dqS;9m z#ch09&{bTT6M70|{Vvdn{QWcd9ofHh9TISHkW7#!wb}Ut^xf(Vy`A!X-dtt{TV;Fw zkTYFN0U4^1Xfo0pZEoDup{~Me!#~$S9*a9E&w~)&x$iCfSn$ta)7QTPf{(!Gb`KBv zzi>jQ{nECQZsbGk|7jt5dlnQ`WGNLp!WH{*OvxG{VVo$c?S-}NszEoF#|xgoWEDAq zwz;s#uN%ck&-WY6#+3a&h~WE=S~38BQ2$X!QUB~j{bhBw3)48%($bbadgJn6)1pMz zO91VwYnuS^PHUxJl&uBVRCA_#x;b_vRYdjAVbj#WMNli>0#B=dEBFQf#s}#Xak@|4 z4aN+w6SJ=dDZ?4ynjdJQF)wyc^LrnHIy2}sR7rSYvA+m!KEDsoY5r^Q^v~y`8IN#% z0}AkWAakGk0<;rIjYPg_;fg1GVO$2T7R&l{4Bq`MNZ|ADV={cPk}5{3cl0Xu*UV^m zv;I`&Q!nf2@RKYhXRA*={}77U3O|k0<4>|_YMVfen1wdXE`8-{^%9hDnMgk!aYy+E ze1jZ}sPmT7VBKC!Wn6xJ0L;KR7!Q28+E*11y43knBM4z;!76;(h#dzZ1_L*A0{Y?Ld$njx~d4~g@h90BmCdTc$to%FYLyEu|MBQV;EyMmO1FVunM+-z9}j;cR0GZq`;3?o^)ATW zNPT))`@*wV7hT|aYKw2<*?1q`=-g)w3=MFpPGbA=aY3#pC2a|qa_^^4ks~o64IDGTubWvUUd(43J{`R7K^QXbOY5KHK z{f-Z?AiMtsJe%sbbL;N{HTcw8*|&rG z&Qs6xD0-{a*d+A}y6Qog9z?Hf2n>i9Y(V)0L}eU)YKX)2Z6E;DrI~fHqB^kp@r5V; z9qdDEJnQ3uv!}+NWb<_b^HqNfD(8zo$#mg*Nf8gaRWZ!&;%~IBMgDBNzc094xV{CE z&yNtovw;&R`F$x#&6b*5H`a>3OaNN zn|T7bt$)k2^1Jw*s=maPYQqIKm$_v*IE-b_w|dpC&&pr+9Xo&N;EZCzxGhIB7o2Uz z0wBphP2yziwpuJI6a@I?NY+OlSSMKOKl!p|l}6=4Eb3Ne_6* z5^Kg#f9Bnk%N&7b+oC1CO9@W^foGs8m#KP!=f2J-&RYiI1eVNSmF|#RLNm9(NH$qD zDG2!+Z6lMD&(vv6xv~R*64s3ZVHnL>>-k&TSG`xs^_^$s)!;2S)W$ks>p}m>_J&T1 z5s$UGq}`Ssl0Z1vQrb|u&GVB`uh1-K=rUJmnp-XhL1ub`b#I(-eSq064r5D(aBE?nJ=b{qL0i z?+os61*RpjmD?^h8{WWpog5t5VHOAtyyOZ=K!9=l2*@_}76(q$fE1l@TgxAQ={Wr)@ zyLsTeww6=EJqg1#hjt=U5EkOsPy$#RCNnM|o4lgEIIluuc1@76dpErfg`fu8gm$JcOh;38EVW3kO@_8HRa- zR(M)wd%=MiaED-A)EC(JpReiFawmnyaqdFlhm&h3pnVk^eJXy9v@cw_5jEQg!3Oud z@(T4nI0T@u7L%^+i$3NttAu_%Yfvv~G05oD!amXc$_UG^0G729~!52HZl6H2c=H0gPOdwOE(%*(@zJVo`s8 z-DrnbtE4+k9=d(Bx1sG7-3`=TK)Yk^l*Ek1-kjih7|3G zY^-i^{;3ReGZiq7^8d<$?cg>TG>CypsuoArCDRl2Ys#I_{fsF6nV&vQ)s3aO?q%HuZdB#iG<~VGNMMHTZ{AL*H%>Q9< zS3Cb{&)@aie6P86?1MYK^HX=}Q6JIA+EwK{=&Pl`yX`86_wZ8y;OpA*)8z3LWBsIOPd)d_ zx90LCOU*@?iz*)S_ZR*Q+Z~Y~Ne5tAvsf>w!d$*UqjEA98<-&QVRqVDORvJz1t?5^ zF84e7aOK2>6_1Gwy5CCZss90ri5F}K2^i7o!NIkzB-CHfm6ARf^gF=%uwH6=81?yG zB7SBvrM=p-R#s{`Y$$Z$U(HmvABnz-RZlDOwnWyrz8zx#s;n1R9xn+$K?)L({wTtP zn-qzs`yDQ6=6s_4uULF?CGN&b{8IVi^EdOu?@~UToy0)F^y&KhlPTZxN*iYDc6^HE z7U_JNUm=s}+Bnc`#}Op&EDPjK3uLN4ngX&Lr>idVyMcKtQK(*_AA!0vuzW_y{H>2i zYy8Ck@uNX2l)`bl`0oL65|XUJlKARbiFyRBLc;a!NZTY&7gAx>PVz8cMqnQTnE3sV zBFFfXEJLkjmapp<^L|#qY&Tz4%Ou(=1#S6HV-pi+1;b{T`G4G)6})|Ct8p;fbNek= zTVFD7^b?gV$5Zde>pbJR$`A2&O<=&rYdE=vR?63LSicN!G@=7Nw~qr@cwF9C>K8nB zmf~&Q7+}W&Tvx8cQDm}if)2+Ro~*+T=oQyZ(P1aUJ{@*3e1#6X8J?lTUWDhZy9O^Z zWLTekL?s8s?*BqJwv#G84h~Ire!e|$aQ5s;fB*pa!A!6fsDEX)ir4*Ps5qUbkLR0= z4|lKB@qy_-9A@W1gXQ)^c63z96Om*{b{N{Fs@fdhIqp;Kpf=-$5|AQB0u{R$(I2hQ zxbW`+c>%LXTieH{+>>l}^E-dD{(_=vaX9e9iT0Ogbw`j^k%~Vk47%wK9~9iv)U46S znd-g51G`UdD1D`Tmb$|#?3hsld_dV~v`s19rtLkUEu)VdHF)m7c;e1!{1xS1O z!#|ih-ShNqy-MH8*-_eniSDHEr6p!w*@p}In134nX4$u53tZ(!DAhzm6Vk~P0biAynX+dszS>u9_%?VA|1QPuiwrzaNYgG=na8w7!M#F%QYlbq3R?nE~vSb1!{KiQ8;6 zcjjy@JG97E7WLfzeayGU!D7$tuR%ns6L(|_2YH@3oobXU&+T_3w)I`$2~pGvWi9N3 z&6x=$?pd?9m`$Zye~uFij^Kb~f)+?q7OcZ#{2VC{G*L0*slT7$tvW1DDW2J%y|BO8 z%V>3m7db<{!^@qXXZGhT%=^f*Y=F_~3NLca^ZecuUhX=ul`5#fwVr3*%kdag6VLP9 zd|5|$QHL2vXqMM#9f{wG#dzE_GQ4P{aggt?&+}a1`Gb3&XZcXPweW2--zItS`U+p$ z_cD|t(uf&#Q?|ruH#lu%w9Dq+lCFFdvnt z%o>TuymCBl^5L;)4j#+qf8<%-8-JGrZ25G6EuRgr<=+I@@|yv+{1$*MUp~LCm3ba$ zgwKk2a1ENj;56f}#m3)|B2kQ$k~6##a=v60Mr0MX0K3hj6)q6jKCb( zWBe`4_-huM0!yXf2NqT$IpB2WR`_V+!th-b4AR)Uyz%|sfqB;Uuh4fdQai`lG!DvH z7>>((kruDa z=-T&lp%edtowKW^? z*oePo{O!SCqOSj*-#F?0dw$dMdt$!+_x$$xn$J4d2KpY@OH7+Cm!&;l1QkYj=?<96 z@qnM~wxou$;EW{QrWJ? z!!uXBrX5xsp&G?qk_wz4frqd>D_>Ut_Urq&TSlz}oa-QiT{w)h14;#2+s>vIV6!W6 z0;O{cdVZJo!CU=4h*_}iP;>s;+bgQ@aOJ+zM$`pX@^WcA41aMRJ>O`A>3meXS;A2v zR7v|)(!S1VqK)&h?_X){{@5Qg@0Dh%nbc?0)Vigv)3A;R=5PE-8<;3eTCzk5(MqM8 zb;|&*GoyOiz zNwt?c=bB@g#+(@qm04Y2Io|4AOrq|rFSad_jjOcMtuCvT^Vo7NgWDWWU;b`5Tat5l zut?*Jb*8sy301qr)~08-J&XL2iW=k40JZE!5Y^<8&}B}w5W&#=5}b}mrwPDMQ_~0+ zbd}972@X(~@Z~b+tkC3=nOjtu&ce9W=?Dx#|6)6}tUb^dOC`hvKLEwSd*3)Ga#gdj zgPUk)cL9{A_TPXK%Bih~J%MYq3qR#fXf*#%?;NMuyLHZo_?w!7!2Uc>fk9H`G~Stq zE%yp{Q+WwTm*f>$6bbP944{!$B>?NZp8$wTV9ECgszXQN9qKw;0U^0dA z$sVXuKL+ZxLX*!hd~W#3Jk-n*CMW_=C6#@n$h^Kdu8qWwe(0fnI3^Ezq#=N%MWxQT z^Ti7Nb!D;9O^So3uWl&fNb}ott3_VNDZd+!JU`-Dm4AWdW2+urSyXLV)$ypRIic?` z=`4IGtX3}ZSL5y0lOo!ycUm*~WBdA47SgjnkTm}sXX^w#`{y8e(Knr!4#Lt$m)Pr& z?kZh(Y6o7ZAA42W`~x`gz-~=i5`6c!KpCsfxJVGYnai{CA#zs=2yoh?1%xPuY)7@KhpdkZ z+D!)b(PR}_h+-i@5C%u@s@1GaU~LhIQ~=A?VA<8`{7hi&krM?hM}y^5E3XaKjy(~I zE|qQcu!VAIMv%FE$)3s_0{(E{3cQCE@wqI`#1F;ArD14ZcNb;~{$c$D{42p91S)ux z1^yL0>XmH{d@ZGK;2tmvHi+Y16;NZP;g8P3*kVYQKpbG;X~3sWvBB8lBWk78XIOff zUhSsY>ACZppatXtje>eQ!k@@z>Ou@$%EA#??kX~$4RSR`kz5?FG&U>fMZoM3K0-T;VJAqJ_ z(SS|+=Q4l|BN$HMHqt|(%h(Ke2WvBcWf4pyMxmKYfh#3uDpPG~b z>~VszP)ZmmG{0IEX8^m4U@Wvy7g|`Q4%$BK>|U>kwO(r%%6pa2(juRFEd$tvQYh+< z#U8w^0W(;PxY6~7f~4qeeGuapZOh>rgWq#%Fc$e8+#2q}hI;P&1e<^$6L^s6_!J`& zS-h`{R48(Gh9X~<1UTYcDD8Y7bMmMRU=I=u?Nk(LU04uQsk{teO9{q8HF6b@`@S3- zN*PH&$27Z8w=UFOt+r$U`-)vC1veB5q3*s6U_7oOg=#WVAfsRgu)WyNgg2Tu@xzX7 z9iqz~QmrOsfPS1{Z19P?>=Ub0aR#uv2*w5%NXM!IpE`&+x-+F;YZscQ3(c!muVnzc z&@QyUF0_A@dL#qbV7t&hx=@(Gz}&4%p}bZ|TAHg1&4owx3}8GzDJ{*?g=ST$j}J(0 zt=vSE)}5jYItA8)8FIMOF6bm(&`H&*L+6k>p|{Sl3pzm;bV8MSB?H)KyU>BU(1AYn z(+pq(?Lr6WLI+f<;;0cAA9LSd->Ga8Nj$PE-0n2;WFNb zuyLtINbBu(K|^&xL#x!^KJMBnSK9@htP48Xroog2~SQj+7TCK|f*5594kS=sk zmAWkh*n3*;GT!&-LOnh;H3Jy$RFT&8(}nh{RwFWi@o1?KOmAIi?<$p>4kj*z1A@;S zU1E+;t-~p~v~i(j6wJIpJEv5ap)jT1mIC`aO%3xr z^BWvFuX^%&8%|iuoAHM>!wdc%L+fkNJAb z-8L`4DS>$K#Yn<7XyJv4GHG*A1X~1JD@^hlO~tS?K-|K%1C2vbx4_rKOGdXOzFYM_ z(1-~KPO?|^o`mgq{TBT2KqKZ|N5BPh1nkt)A_1H*9w@e3Aon?hdWR-CjV4as`a29% zG*bRCz0CC&k5W(v(Jm*UxKd4?6-j)D+R_!`Iy3Dv*RPiU6gB9~42$fP@2`|+{tkVQ z)F8$~FVOABnlMw5V`ft7*!iIzj!a8Ve3$&NV2;8;XV(J*t9#a!r>2(+eB2 z(esfxn!;5UmtaN2h)*v;`?v#u8Dr~sXBOiENSFz|pP2}O9~AF-YBE>> z^qjgacU~iHLHpT6L~7h-Qt==?{E_VL?2n||`zJ!zDp4nlLaBA5SzPXHBad-*` zrd&8MC5NYm@cUwYcnUi~E*zMW!&AAf50dsEtK5bwz*q9z2GKXUNHoAxEf*$i$M_w=qKg4fc4ZcCwh@Eb`IOe^MOq~n-+x!75e>HO+X$Ag% z%6~Bsy8)e;0Wz@QYqR`Q2!SM5QujuWKglF1HMR2xU}{UNu5X)H~4&zC)aj!VhfH(e_xbZywj$|zFhhNM5krQeoX<9iMi__~4%vjJ; z3VBXK)=lNb_=Ifou~QSO+>Wab>TYwcK-6-mR=9mrw>OSA&+|J&H9NTR#yFfi$0gwO z+sSlj9=sT}0LlRXxc!7Tu$mTrs%$Bn>|QwT`kEGGwhKgEHpS~)_La1E*YctEJ3h+3 zDDICz&f87*4yvHCBahGrKJpX&INBHSv3>9@wwq-p@FE`Rt!vj6GzN~=NAZyJ-Pdm> z>oaSbaU-u;@dC6A(gjX+F*M(1Wdkuiiou%afaxSpxzXk+bJ2e`Pk|aT!BeR6ws=ag zT&^s?fLE~x&b9hm?U9qd*!BtFT8Ss%OOl>m>7{l*z0~d}W2shmj242}0zKD1XSgTm z{CEX8UgG`--pI4B4yv*TirgC1p*Jc+*S4#jRcPyC+y|bGOLhjK8?63QSJl89>f`t- zlwZW{19b;@;KpbAy1ZKeMLluC8NJ$lF(EtVrriXT!f|?TndUd3W?6|BJ8-fVm(T0_ zy}1nql}aBJ04g(?S~C8HNqpNPhyDH6yCk^>{TaN@U)(Zz+e1<4Z1+v}R3- zIo^r6ob&EDmmKLaYla~wOe)mzFbVaSdh=D?A)2%zt+j&V0hTB-z_jyGOec|~=LUBA zN`A-*4nsHPyfKvK`n>UYRKY%PT*z~@)_G&-(CqWZ!BYTZ+=`AXQ2j9g!8yo)^!}ss zh?M3jbrSqfps(hw6^Fon3hNd-S0FoZ9qwYfaBC#qJkM_qL32!BgNPG;vj_GQyoF&2 z`T#ZUD64WVB_(Ye$BwXM0Z;uT)D4|PdB9VD0bi2iwk(goc_se&4N^~^6_q#L#^mieHfe!e@VD*BaYj+WFUXsi~X*>^2#kz=dfBRVzh`T zWdJg6gNSmDu7ZdtpgdMV&UaHP1nw!K1abF{O9o1=YJ*6v?j=oO-~?_`VFV$ogerHd z+YxLkF9NdA#N8k#2>8pP@s(QOZXDF&LVi$};s63Tzc>sIe384wpz;3aNqxhWW$ zC?zjrmyRjd9p~iZCcV_V_ z!Won9lce0N(-3qOylgJ!HhQk!1?-?F&=%SfwfodX9<~EValzlVfVQ*1<>UBVVl|aJ z6&e)ui*P>T$pJ*;Tdn2_2N)6Q6X_jU**XCnul27`Ze#bO0^%a(Vw_H@J4jktK&pTJ zLiA4!a0{~F`xd;zFJKXE4y-OdvsAiRdxY@Ri^{8WUY^_Ove?Q9%nsit7aMz>o|RAQ zcyoNQ(c%o`s;{#^3_NUJ3#su4woPiD`VgR1JJ%ExX|}6BGf0u9S-r`i7HM8(P(&JI zDGU%$oMnJ;3f2qYt-@+caQz-$aVcX0P2j#CK$a7CMN$KGhiIOiYH2d_1&Pcf>&{|eDCNeNDssmSQe24BJa(viSN(_<|UQ#HE`Vp;XA`dy@_)nxd>F<2;o=(gU zzW@k^Ct)}$DMpatDp2?KhsZw_N|j0c_Ol6b;VH( zYsyoW;K~-@Rzb9Yx-;}8TJRB`w1}5at6iNTM^(U zaj0fr1YP9CdKPct34O5^pwE5)V3>1zo13-PHvM;Gy$H#n#aIeQ#4bFu1H&WLn83O5 zE))tWrf?t$4AWUnKJ+`Fz1q@ghij0J? z00kPgw76xU9uYI6&SpQ zaN=Lhgw))+iIYo>*94<>1!j>)Ys*{`tJ!-h}De}krA6LvAWSBGJ?T-jd#j} zLA1%*Eto7d#!~zu%-AWKJ*qpbrMNU(mg2b0J;pUwaG)B<=20WSYF&tGDTm!)$SIIN zpuse8+i+iDgstL|!!FcQ&)a*gg0)Yol)|BwNEGg6-St+5r~dac@^l4;sC%#iOH^PJ zKB?tglTj%F`2*`+XivcbX*1U!UsuQp4hW1~)5-$219>NxxU$^FF&n6Cv6lvONKC&_ zutXipz78>qOI$3PA;ofus~|apjb7v6IHMFbR^_lZ>}^_!V!Ukz1856DX_hZ4HB}WB zr39^`pcZ@TD@>_xb&5D6cO11j>2V)9pf^z<*n3k#f40gUQUJ(VjxIIsb>z^IU5BWZ z8{cu{)Zo%)s1sb6lo%SZ~hR4-- zd`|7a_jL!VGa0|Q(6Q95h9cNhUWf*1ZC}rl+0k{4;2X0c8cM z{y(C7x^$}a7vy!BHDGUzqj=yyaL*|G_H+b<2Nxkg%_o-MqtqMN<*?{ToiqaKm95Vx&bj4tbeecj8ikUdkB&Jf;GmCh|xIx|jo zvRbe*P=$6C_h2K-Vs(2$_6;|XuF5L&JuC0VD1nABz6^RS(DS~s@mfE92F9vL$gly} zXSz2-cMAaoR4hW|c*=anl4i)!r&IE&*c}@0^5+PVQ)Kd*0%2a!j8*LGAUJ#NIT-BL zr@os@5|mxN!~$kF_Lf`cVTfCDj=oZ^L{*JSAblc(MEWl1Br#Ph2&=n7Sz91umDS|S z2F(H*d!Uygkz$$juM>zgKSoV>a1nE!$qf|emZ^(pNwNQr z$*YiT7}HzSP?+AJO^%vbkuOC~Ln_=FZu#Vf+bo}7-HJ0Q9}7=Gb6ugVBb=h_@c_f# zB3UdrmBOmcSX}IYS66!jAW(|Vt-IihT!Icu)96ynSb#f`3PsbJ6|lsIi!}vU$G)K8 zfI<^AQe-TJFmggC<>)Ta^y=BQwGUFZau3B)fT0%1JezK&hK?2eF$f&0G2~N{@`d&A z+)gCpt65bH0ot=t6ko|*fEDspb^#XL!UpLLi$&LyP^hQj@lJzhZ?6RQeJWNV)Tx(U z7eNti>%u8hbXDPjsZsleV?8&6tKnFW90w%#i<}S9y#+^gB4=oASdkB!U8=^q=A!=l z&orwn7BTFf!V=SXB^>xT9URbAaL%MtK>?T+WOuBSa5C4;pm|SOmCrO$juv%kSV26 zWcmyJX-oyJRO13NSLs`;uPJdK*euqJC#>!ZDgK<70}C)81kTa1!S}&A7Yv+k{=M;C zSI*n~@#ef8Ie9kP85m%vC`XFmhgWYQ?4QlPr7!;`e(2D$oP)*(@zPhJsD<(^E2}Qh zVqO|U{->Q237pv2>P66vV0NT=c6faJ>Mh~%hi3EnsXSwNrdR!l-h>}x9)&P|2vaJD z0Q=igG~$CBibm~*8hxhz2OM8UDZdC5R<9b$UCQg^g&(aV)R7GYDgRup=ay?0kguUA z-OBz#p(wAT=6J6@b1Ca5?n&WZdb(&uhhwn%)DBTtV^e`DWSso<)Q{kdKrwkcMy}Z5 z!13bt(0IT^%_?kHv`2bTeBc&m`ytQDPryB{uWX0LrwuAjED{xt%po&qKXIau17J5d zG(9V~lg&VmtK6r443!u(o!r-kp3|{34_8IttE2TXKGx&GXwTjMg^)~WvblXe?gxb} zm?Q9IKY!J`ZejZ%vLR60aF4G)&jAgf#<#YNt9Icj)tiz9pDvutB{Hz)1RvrBzIQyYyR%5?x zZ6=5t{35mRB)&uA7VM)YgBQV{eQ$LWj;w6ZM{?5&XMU%k@n9=-eBWiu0N-JL^N8-k z3>h%}CRmuNlS}aU10FyjOb-Gm7?Nn06ohX-Et;qc-tDEf)C=$2UqG3UAy?$k3GMja z{dwmFCkTs7&9Do6+Ii=3I>9lXccwuZhv^ZXhbCu9Js;iqJ#k)ozi2nRoR>~~FNatJ z{Yz?d#U3+tBMa?MyR-)He#c|5RE|ALXUqrz)d#>!ppHq)$f6R$=M&z`2SZr$HuVfY zlAt5_UfDp^Bjr!DRyYn^1FXL*^70wScyK40p zry$v05s#qF9NIh*XteQ4FSK@>uaK^=4lDq#yh#Y+2s@4W;ar*4a%s830eg(f_OeQ1 zu_OhH4JkQhr{)MO!p#zW=N~70f_|~SvS{yB`=GeS1lK=2f&k)VsR25)={$)uy>&kU zMU!}e0+dC(97nOpkfb|$5Fy>DxNw&Z!Hz^FCF9Gb>Twp>&h<2G$3YFAv^D~Yt%dF# zP!3_CiyI)%VJCO4ENI5c@7k37u#Lza=6rNha-&)_8X~NobJ#pn>C(#oyp;S;#sr1@ zseXc%MDqL-v_U=B)6Ub%uOKBqET}r$s%OH*ZAVmwmH(e%0A}MCsxWTY+BiMO%BNSn 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

>uE1F}QDViiwArV&6OJEOTI(f;&+%MK6aG#p|j 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 N2~0hK{~J%>zX84?q$~gc literal 0 HcmV?d00001 From 420c5fbcb00e65933f73f7702fae8d71b082ed74 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 00:30:14 +0200 Subject: [PATCH 055/664] Release build of dll --- ace_medical.dll | Bin 1456128 -> 225280 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ace_medical.dll b/ace_medical.dll index 7a2c969b7e0960be5366e6cbbb9588f0b949d6e1..98682d89b99b4fecc4731e5c0d6007bf2130ddcd 100644 GIT binary patch literal 225280 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 E0r2}#xc~qF literal 1456128 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%0A=87vqI;g`cW?YQyU3+) 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

yf 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%0A}MCsxWTY+BiMO%BNSn zU`8eiuxqM+t^8i>KEHR)&~4}18E%s1_ME4c-$UK!_ucgTt~sLo>QnN|&_5SidBSv5 zcU`<-PS5$;Sg`6_lal{Xdwf|#$yx-xIZWdLK8@Vu5WvNh!(^1jTfaHE1fGnR#VM`va?N{} z`f-zMxh<0vf-}$@6^A^xIUK#^iOojnKQbzdP+nczT+}~#KTPUHHe@p@D$6*xS#Td@ zq|n+&Aq<%Hd>W&2J$LLQXY9ZIrF<}rf@b_w>yNl>Ow_eFk%zU9XXSH%YpQ<`$sRy9 z;kCSBBP92^HPvrGm^d^g1lz3eUAa&2d-!2I&9zL0Z21C9eN`V6AY3uuSkjEiNhUx;f8 z>kk4G=v&^_4!bRgn(6&f52^AW)E^{>TE{vPzfbiNX*{_!Kz~_Z zzIs3yXxiu$`GC`3={EHtcu}X1APgDr@;w^^Amevge`hlnwQjFQb?OP>bm~HWDe&Jq z5_oE@dt5Ic=DP@CtlgDg6#7bQgjF9hAMDzINp(81c%c)(6x*0^!UE=Q1{(fD_vPy0OS@j4&gj`;xd zeoyDab$zY#o35xO1G`5jF-N)s^*a2F$|}KARcbT!VX7;4ypSY5O;#88UkwYhiqpdK1S7hpkDqK z&M)y}hr9?tiupMA>wy{KQiI{5?EuU##T zAJEp{!J$nRJ4nQgy`_jp`lD(!L}7R%ZvC+pe+m@6+N?_QSEaAvL=ATP&C2Z|7ZZ#_ z&7fCl!7^9Dw)HI*=;k_AiCC^))@E8bKxZu7;|O5608`jz7U{H#94tjPN4~`--BOiJUH|xB&{OL2Bwj#qIeom4*z|R=De-pA zx}@jAJ_QcnQ|7mO-XwBq_uhq(S{YjK90fhjKj7be-USjnFY)d4_v@^}rw5A7=l%a4A!j8Y?`2o0=JSAGE#$%Z)%Ec(C4pg&K@e23WJ2^AFM)>0JT* zp*_Y}W*-Oeg@NLd(~bSh z{!)L0qEMD-P%o$`<$_YbLc4yn9eo|+T(8@}YOQK4kuw1au7rawQRti|%UJAa zU56C4m-(Il!wJ527!>j)#cWqTxJ*oy$rz2P7eQX0r(lhZ1G_L1)X8lV7r;FM^uhcu zGL4A_v~!Djwk*7GG?bf1r=SnP09a^Kh4}X-;4(?o7Aa2V$><@c5CgcEE~cz6M@ z*%<8k7x?m@e5%8%uFaROThD&7(MOsY>L*z!uGrACV!e-juQ1k7nYOdK6vqD0#1bg9 zkU!`DNLS9LT%jTC4tCkZO36j~(>WDub{N%C>kaCz!L5ljr?@euM#0b9wCV93a4P@D znTV?~BXtLP#bYq{*Ia;BsS^M(^UABYZFXn$I4}9T)M?q=q6?g@R)HvWDdwsdkb#!K z&>3apT?=p!76cu|QRqdze@&y`SI#(GH(2>^frNIohrodn8tVSkdKx&=m4hb_4Eqd3E0XHC>DDfG?&}qFftNv06)6S(N(LA{M9!x zntW=rY^OU@cssk%YX1a)2wEXJ{g(z54HVGn3gOTew(C1{YNk%4cOpHUdRt6D?iwKS zFjYQYAZjvoHiVK4dB7|YmKVI%BpP_ZHOUL12_>$%q0`Z& z4uFm{XSe`8qVz;_zS}r-C{Ttx&NV(c6mXV(xaiB_a~FlLdE9IE3*pS+x1EmQc7GN~ z&b-*AegJXg*9gnYZ$CK@k8GIx9lFTCo=qV-C~>K4w(1_Af(*`xf2%0|t-|=X zhN(VQB21w*)22@~-!E+_eXI1f(vNWq?ar%b!?n8kzWIUK2)?Fb2XL7=zHYF!| z77$kJsP=CLimH@)$>l(;XKtx6Zzyq9SE1N^^>eL0I{G^tbk82ylk{ubU?$K1K~0yn za1``958xuT>nmf0b&dN#&QL8m@ILBM$ZgD1R}rQkd=W@tm>e= z>nmJ^xy%kcePp_{qQ~1h<_A*L`-MCpDf=OdzKFpLx%K+ZiR7a=qx6^J0VaXS%RLp( z@se8pxtYq>>p5+p*?A&FdZP`_5@f|UnU+AH22R3MJ;Fj0F>xxr(qq8fJH_C5e5V*3 za!tfoWuufTCp<{}4WHm*8JDKpF>iN?`AwIY<;fVAF&dUJZ*vgQV9xWriyB4_B8nx(cVZFOrDj!nA&>xJYVT9YxJ!A5QD|e(KtBUK4!0rFbvw*HZw3vomYY#=S1 zfB|6_jx%DD>@d{+p67Ws6XLzgI!xmV!8WnItfEb?cG@c-nA6)#pq}?3A_#i zji)Ef@y^o)v>BGoG2Gt(f6<4Jg&!`$vNaI+yS?J#$QZ@H2#Wm48f~OKkmM!K5Dwnz zHaWY<94YYsFBzQ}OBjuGa}nlNFFJlR78Tt#@H6&<@GA&H;GkHA%m+&!`P~BAY+Us+ zCpVr45@QHh6>`%ts(y+|l8gYC4ADsmhCF154jv@Mffcb>ZD%yUw{xz<{<-$7l|qpH z8Z9c-9sxA%TEv)Cw;eZbsktthWIER+lT42xlT42xlT5^PzbyWYSWkir{$-(N%?@ev zMJGNlyd{m#bK*$n{G2$_V>of7#~kB)A*4cE(<=2CYA6d%p^`=5o>8c2WP4hjOqsE} zahSxwXA5<~*KwFlj|+VODY&;3&m3B9M`aAaK-IE@?RE%&xU`}bDYJrKChpXGkP3lR z4hWoqiWwKc6%`R_Gc03U&OeMMll(EA_Jl0cspxY;jhe)|RmdKOyo8>HB{yqv$wRo} zpqwRb5#dTVyhVho7Crq!7s&}%C=a(jUj}x?MS7&Mn?^pcek83mVeDC7t>gcJ8pv{(nLL?m_=T zosHuLsIhd7?LX^R)a&bRtK73HOTN{(h4-p;t%+`{boHx5x52L@Zr&Td(JFtsFL;6eRLkK!$O`>URax5k!1r4pNzOTU3 zt+~VS1Qm#op5H~F?Y?R9C8hp&) zP|riTYD9UrHeUW$UUH;&*h)(gZ7JG#exv6C(~GzDYrvH{%P#${PSgN4Ck8z+81y9j zF!O>YtvzqOU}3~3?ZKI;Yot}vEHM}vSE;H7&c+mk(Med^$q^KgqFWQ1XzFmYl(rFL z*22aSFTPNJy&vSN`ZXnWwH!k@MdxSt zH|lZB>!EZBK&HEN3E*EMeRf?B{R%sspN*6#BKr-Gr?B`NY1g zgC2TD)@RP~V_Ju2z zdKJmS5WAZ2YmBAX0Ih2U^rq_=hSt?Mcu}xQJpRDriWTYh8VAdRWoCg07@M<05)cP9 z=C1_3KL3uVU;$dWqe^|UQHDM?N|m|+mJ+S|IolNI?6ZyNMZth`|bCoLiD>HCO2E&m7Gx`$@f;hjQpq_g~RE}TPmC=?mUq}^z!Zi)J`{{pmwU~B4 z_S+)Y+RoBa%e*K!I#X3H3Z5#_JNKpnmj~Uo+05@=2mz6TaOK7-6;3H;1&ZP4QmHDW z4{SUS1!5!Rj2)6_z~6r%4LBvW0eQLsRqUBlaUoU29i|5$yq$?$jjT{A`n)u;|CzOMZNqQNJ!u~*oL z?OlXjf4jX~7=IM)HB<8Y(Zk95Ej;4LO$x8OG2Q{h6N2yd2-Sibd^h zkvI?flu}$w{U?}Nt4tbX8S|$+k)E-o_me^bOj?`b)hHDWvqFKT6WbHqaDJ)U@JR}iW^&$+V zbXk?dBBtD^e1uSHGBT6)JdE1`j||xv*jQTomSeb}*MlNZ-;B=H?D$$1d?jo)@J*k$ z!+R8)|B9_Gwso}+}?IW;w z#NMDAEy)g0Etn&2_61)x&!gr;*hbioK^%h`KOjdAobve>pr<28r{GWayHRT6Poz}o z_cL@2X4x2WDVNOGDP1jtC#trgK50ndStWS+ZF2;QF_npHMI6UOv*>RS8%;Xc7J@W( zW@jEE|S>Y%yqmgG>$T=I047mU&M&W>b3M?at#MJipB0H zs{RgRUGX{OjBM&b3_y8m`7Vp}!JeJPe;tCq?zclg%mA~Ojmce-&$4ZY`qs7aLRrqoL$Q!n zH$fz%=~Sg#P5T{!^$KbaxO?M~uwcGkDO`7uW5(4w3ine)#^d85ek`Jr9WFsQ!d}62 ziRKb$5P^mO=u^poG6ZRE^RqgSj*}s=SHw<;MU@e16mqc3U|7lsGlU%js%v*MhW7_~ z>i-*de962@B`>sZtlhkpl)M<$c`+0U@5VC%uU^E-925#MeGp3iXEYPLK&O* z#1)3RA#7G-%m(Vrno}}kSZBsisAeNG+o&_!h|IoaXI2iJPgAdIY2`fC?K9e%F5BpjllH5lgV;fSeazyAg2J>W>fukxp&APbRr@{Vh*p(Oo~EnS{fHsj3|j zUb{gG`QdYda^y7#R_>D56PRrL`87HBPD+WrW~zj^#uyT%>Y%Cu~rR- z8yFlb!8QiZk>G9yza+sH28$3(knnlBf6)OL4;K4*IHemHCeqEd429M{fG3;}l9|oX z!}DI7Chiru%6mg$0vVh5CYECc=g7>B4j>))-6IpdVL~CWOXTbVH-}A|IP7 z7?xt{84A^}!Lt*MuCnX1N&stCh1L?v*uomvcDorC*tHCW))L&<#HS;0X0k;vi^b8O@JLh}dY?qKrEVix z?X_!!mOp_cryDE8QGid93F?ChN$Q?P5i3%v!mzFiL#PU#kr9%7jvmJIQ7yaT3=4Fa zp-`C6s5tZRtaJe?$q%|t6#kTq7}gmv6bjG569`L86ks3ok!zw{mVkez#D?k#ZfxSy z5t!PA-aroM9ay)M3;9#BVOVFwP^f+eOU10rUlwI-V#pC3rxt9N5k4dwE*9)p3Wp|T z$e{Zb_B|sfgQ5igBhx?b#`y!a^XHPm<*L74UX2K2aR)}m+`?;DNIEZ9TTs3>s~>U& zOSW?*GY0o}0M4iWCZ}0ZD!$x~T=6CBK+-DpyOb|}o_7FmoB@RumK5U%Jw=DlP>=jT zB8w@+kTtajLg?g6D*G-hE9D&QAgk1YD zg4OB_te~lf^gpEqXAS@3qKRjgaC4`DBokp_XA0MiFZR=GVxzwy^0^VVw{? zi;h9hvZJuL4>O=fqXwaRpVe9Xl}=pC5PT(Iy#dUQ6uf*7t54C6>bmzuYkDHd8OYwI zF@`1IFhilR56?~{IT;1o;0z0RJwvD-z>Q6OI>h=OVhOoqxEx<2xV4WW5apP)j4(Fw zi7^vJc0G>O$;dEKBs0f9b1h?$6Q1c~brf>7p&8cgVF(ogG|FWjo|WY8x=wnqfO&fA z4Mbvwtlz=D)I1Qh`T)C|(f1;N=mz{CdX*i$SVwc>s`CFo?0pM-RK@lGCRt#Cz%CLb zwy4pfqJZ-70U{cdRjRDrq(l*4Xi?XQin{R`B)F`wEL%}o9~CPqRjk;eQbZ*h6d_cq zsI;QR8ZGLqo7UK-5;cIavC0>SXot1YDvDJ`asbQRv5j;Nt*ZerPNMZ`h67?@ z7gMSKXw?yjcBffTPo!+c@lx{hiPv7+6xwoPSm(r0B<{g8y={t+t5q&bVD>S_Mq-2xRrBcxmShfKne7ekUTDjN zVVwy>k(i4`g1hsV1%;{^!ZmNPIGH%~%8jZ9dO@`hm;}>2@H%15_M> z?J8j}UpWDS# zq?JRhiB%3tL&Zd8isgF~gdU?}6PWODCKPBO2>lWJEk=p8YW3JU4#T?RFoceSX9nkY z7=4KSiD3bkP$W!n^etwR#`&9=jh*u|B2>+%BRIvRy2<7A8WuAIg%$^3%(20+6c=YG z5^q8uAR7E-JaS|xxL2UiU_Lc4JxdJ62+1rXO$w~HmBFwsgP}-#E1v12b*c@TVS$b@ z6p0Z!RLv&|AVlZX7axQeDBVeV&U|6MhpPFc;BNLFQ)fZ~d}S`;w*bf_0K-yTn4w5` z3Z5hYe;FUDmJkR~Y!KkZ1PCDhX)_B+W0aeafmsN{x)6pU;SG3ZFv@%zIKu)SXDAXU zc&M6BN6;fRCI!OhAOc-LupkLyj0jcp=?G5F?4O{(XosPASOX9fH-@FK7(_P5 z{xUvPEuo-0P-zh01#UqYqooR6N-yz*A6$=DOC0+QOKpy|1G=_9T2`SX6B~v#HVj2# z%kj(@EfZ|u3=4Rep-7nEp=v(UM+=l~>7#`ap=v%c_pCz}nY~$$7(?r`6d9TrGAu>L z8H&Wm<4Jn)m+_%$301%t6J4_^wMx=C8ZEFG&}NPd>l_)1#QWjN9Qmtrlu+;|LUZQu;+3NRFj6FgMSCy4tKNPlYoUvt`V&vKA)X3!;#Z#a?2#DZa+Eklv`ad@Wl zjd?a`h6OstP$Wj^P&J>9;MJLf!9L5+0*F~8!#Wd&BC!HI*%bUGOsJY6NALjBIk1ug zB0N!uJp*eIQ_J@Gvvy+Rx`UMXhfLhF-oewNf}v$hqe7)o9E)aHQ-L9z7{jdqq~K)D z%#XBzGOV#@$lOJ-GtEZC+nFZcL)Cl&tzQr=i>Kje9MMko5hx=RX+Y(gl49sMV@vV? zord@TWUC3XRY1zN;+8sb%+Xu07Q#caFa*AKOB09UERC`u2(}4sIx+?{{ujialp#(8v(;;rnawI)(yEAeX+}xQO_1ffq~(#arJ?CdP5rl& z1g>0h0HvY88upC%IP{ECbx}OkGv3D1SWSSi#=+3lJ{S(w7^b=bXt~%dbFnUSainYk zT@x6s4~T^(#6p4aEsXdUgr+Y5dFLS_)$0c^Q4OL(O~q`bd1g9-q0#3>VwDg)aQ|}a zMyJ+I8hw_)dS^w#gbh{m=?ESy72YTn9w8MDE=X1QV=UwoMLUufg2+iqL4Rjh3W_rn ziBG{Zebi62K{G7SF@_>BLSxEitb5iXd`Zzj#IzbjjjqCjg3vhtGmB*y(O4uf6p4+; zGl_dlQe(i7o+j85F)WF~3`N3B1pd!hgDzWyE(3%v=iHg1%WGH_Bt)mh)~rg+5~&UV z1bH#Gi6FyLR-B2jP6nqh&CF%*drI#kUk=rSK)Qgp$oBi%Phl0kqlOJrE* z!B8aD4^MM02ATx#Zv$soz$G>kCU~ftPx4ESih3bNVKYa?&qU_eQ`c&}|J^nn3T(wN zEXBkbio~6Grqdzc2FJM)}P~Zm& z{6K*pDDVRX{?AbW_Bph7EB6Qdu%w2_tZwgcjqiJ^YRcL+_{zlZ8^ixkge(Z7V7r#G6_?O0MJ+>ldgR_317fTrXT5BIE( z5rWbh&Z+br9(d*if1Iprz6jAP0ga;Mepq}f8-I+QI z`-d<=WUpaSTqGN|i0z$eIor%TU*(&5Yr95RT^i>Fef8?OUomrKTUEo@Ozotto8g28 zeL4HN$KAy!?ENu!XZj=hFAPpQ(qHs=4b@E!HBD}P10MQ8+JMcdm<>Pljt-S)^uMCE z`lpGHoH%Zudl>f8gK!|3Yp57n_pewB^Y>n?_ps&<_r!+>d6Y+v`xLupeZ&4FXL{tw z$0YZxBx0oZf?7=o!?X|kg~;P4H)EwB2aR#`0~dkMT858SW{DvfCf5&#Z?3L02Aju) z;B zYYcsvbMt;i4u82;7DVnCuBkVo9>bVqI_A5M+D5^2l&`U(8_(|4t1VanCG+9O2H}5S zk8r2Nhge_5a2Xso?^k0%xX0H)=pUi_BB9w_*BoC{)%2!`!LfKw!fgqYGpMFEU>^)y zcW8&kY1p9U5N(`_B^{1Uf-m6a!U{n-(TH}?)#X_osdvDS1cZ6WfY}Hb9xPIo$Q1jq zJeV{K%RqLD---Ev$+xTpKEZ zqVTF&#MRe;%gO7oAF0%>wP;&rQ>L>?9xs$I^8kpLQ5<7@Ez;JlQS3sZ%w(@5np>mM zM?{6~#o$G#GVrDzNum)Ttoz71*6>+VBC zB<{k47@eZA^P`5oni9IFT2>m!$4UB_cM($Mm!Rmf`K9VMt@R@PX)jZ&s;C{WRr>=G zKXUb}DGzE!gFbd#@>u3q#r)#aP?b^;O6<4PeRCz*i8}QMu+7$~54KY8`R=&Wy;%4S z?}M5AOBwZO;RbcvRohxjwhh-_Q!VyS+kEXv!ek>j^`|cx9un+{-aRbX7tf=D1CmDx zgJEt%XwrKyn@SykF(IaUh#m{YYtpSp@Ol_1as&^+Oak`Xpn})HfTV!RDZG3JYc%}I z&_6CFkh@Gtsc$e+_T40h3so|uekl3#V$`v|M(F61eQt_wy1LSvBWO`5?F4;Ok_+6V^$e4Co|>* z#?%-wM>2*x*@0Rk=0L{$m@z|)7!P6s8;zG&Xh};EfcI#I>hjQDiGSc#HyVyrmTkwE z?Qr?tsu{5jqC(TvS?<~AFo9ROSIk){HHlT?2QU zVFa9I0|zxY%gvy9vQ*AfdYAiE>HWeH{DE;ONLY1|bnSe?mI5}TJof4>>L&13SV{Q} z7D0S|HPm(vFZ7gw3D>W5RjAf{t#77ti^-kVRupj z^GeLOM!7kcO>f#>aWdZ~V7EEuU4u$(!ep|cRP{w($T#NOpsLYxP^vkRZcsNt62X1G zGP~4bafEV`(}~~bj|%0-@bofn@a`W72vIhv*_?ymgA-SH_XtcgB9BBiJoeKRs$=wc z83LQs*?NO^UV)rdC``?J>c>*;4gQP%Ts{A zgYoCZ-w6DjiND;3T%L>Z+Y7&-NKQ^}ZeCtDXQ$3x@UI*Gx%lYTt!wP3j?E9cJio)= zTEK6{->3L%#$QjwEywQ?{1qWQ41Z(scLx3f`1?2h96fjZFJ}iJM9t~!)TwjlF0P(E zyLRi@y=Q)p9?_O1zYVp_OVU(4ZWBku+^)DCo_{@aE9T@U|r)R+*66`JtV1C8b z7ZjTApTV9>+10K#k@?qSpMQsdWmy77NR8oHwsaW-5{1V-dmFkl*J%yvzL&5^eI-~B z_o(GoPByIGB~^-e@`EB%NLq{q6eDo95zGN|)15kkjA8zzkGecF@pl*g9>-q| z{yxQD3;zC$zr8>LhbzaG>&kOET`pHAS7%q3-PP#r>V)s(-}@-m4k&Z3CC|l*YU@es#i?q@M@kyeh}a2n-wZ zbdAgf{X;^W#30x?qUI3C z^VR`dcrE-7{=PszYM`{_+ZsyX-e2C7<8;rS$}U^B6++&uWiF4}3S9wYhDqu~%+3hF zSAtUOA@u{nVdY&_CuA$l9;Puc55D>C5t!;Hfpo2!59W`GDmCdY=@VVmTep}UMX4h& zi6!ViURCOHkaV*uH?!}q9x;K%0-VPjymOG80x{{Xvp=f5n>xh=mg9_apzC^6L)Pof%cKIYV?`(xxL23ZP3>hSLS9#( zgycz~>4lDpy|lRhE>>3P$%z@AgwQ$3gX~{d8DB4uuV3V_ zAnsT$d&BHi^hd+aQ&xyhvkho@(1BK#s@%(s&a+YthJ~|q9`8z-;6JI-_^vsp8tB_3@)QsXzXKaRtIMJJ-L2SH!~X8sYiUcvjttKSM@*q`(FEL< zpfQ)J`#?s#G^w*h8K=~|2L!=ET=T}l0i)N*2~{L$QnP+9bpM5!?f^-*SxvCgH6h(Z zGaU`TrPqwt=?0qV5?DMyQ5^cvqt7p~8G=S59aXJ~@~#*GQ5}e-;Egdj&<$*+J0Cgt z;a3B$B3UUaHmP4RJClClH-k9!gG$C~v2rMh#YeE$s3V?`u8nU08z3Xeet~4k{Rj&& zImUGcE~c5C%Jw9FKhREMIM`WKqPD`JfM%yn>cZckXj4mxwiPvAlNxjpk`A?S!ZF&k zu7fkR#b$lIP&KksehTSb^@36iP5Cn@r$Qep)4Dn0G$v zQ&plCKrI8rP{-BKK}a2EK)}RNL()1w^i_TZ4mnYKfYX&4R)Fqb3=~*mF75X~=#3O3 z<+zt$y(r926M86e6Tln;aEk!?CC9sLfGz;SGsl0>bo&Oj5=aiYd{?0FFmn6V_)UHFBr+`vchy;z{b9@dCpv^s~rs6e0MLKpF? zw`WQh0hKGz5%4nsT}vvIKxcrZ81Ohr@W5R@{16C!K_ zrgE#-<)9AYWpY_psk_GOsA;f<`LpbbS+ji7y~0bHwQJuVgg1?vro;Mn8{DIGqq z3zT1%z7KD?7CE6rHOK@cs|!nbID={`ZPoMgV=m9Y-?}^r{B?QU<(Z4$cBb?nKK*}8 z0g=xOu=)JfKDgZqQd^^X7OQkvGMxQee&8}E+20i1?}jABh~5^|Q5MuLYc8{QI-zesU5i-+oNJukD{Ohc zrA55-vH|N#)LqYO9Q)7^VCEkkML3Hg;h49MwNM{lr)jnpGg)Fa9@dN*`sxICcot&P z=FKc3*9jFrw;TiN?L!J;Csd4%m2ECnGcP0tPE&lsbkr+@{>i`7Wgw9`%Rpu%r&Z8j z-74r~LkfD~`Le0P;Kh&%pxIH(7ech14Ij=p0Z|)U+=-wEz%oT>CW9qT#%8=#$9W#~m>j$ZHGNlh>96Vl} z6`rIs1&C5N1BCs93mGjy!ABrJ+<{pOlh@s5US$AG9;!i?nV^&tmAXWOPBlRf11PtY zIAb-at1jVNlkw(-T*lZj5XmVIF+3X55PHczW6Bun`La+*6{4-Aod@%)+nMg(u74F3}uJ zZVke*bG*6iec~xWGC4Ro&_W57FnnO%W_-2gHRFi&ZXRaY2j71oR@T#1XsR;|10l1? zLSL3t?2WiV+}4$*v)H5wf=dPaYR$n}PwIw06GP0Vu9gk{A?|rkA%CmELtl+_-?j)b z($h{cGINB~5%)&mzNT!GhO~A}qN3B>h&HcLH*lc=V-&pt`v$`l!VU&)^2qdTYI&uq z%nP<`Hb6C6i)@yuVaSGCPrOXGK5A^o54%R!0XN?|62HX5aND!ay9LNvT^Y_v-LvK* z!q$1<7D*H+rO224-;dPEGi@~pDpd=AVGy_xx0*rIj$07GH||jis}O8d@gAJAtx=djkj?%J z41xpgjN}9(Uv7DTS;u_yRSnlIdd{CyqQ;u}HXvWC^eXi$$+rP35x8B#B@?2z`jyW2 zy#LJ+i1AfoHa$pgNC`49&ab%CY`Kygu)(tpxN$kSI;_H%ZP1y`Zl>!M`g9DoOEVh1 zIqzCyA9OVtJlcdeE2=S?kUK|5;E%q|rNzGG!fp|6rGFivevN{_ME6p2CkU&~X7_|1 z!%644X~4-`)I(vGhP*UA)vnk#{5=O*8Pu+~)K$yAQVo7|O5VjGSp=qIdCAHR`net< zE0HKLpKDGOH5PM4^0L4^#_LghJtwf(cs-b}zQ9uBwJ%?f53Dp^U3@)4y@DkX5vR~` zQ-Bn3`UACup_Rc+lVyNl=qU9MEIA<^sdu?tp5EvPVv1B4E_I@PifYLDLtruSU$W&dNC51F$e-^Z1 z4~e$)My2?7pz${pzr*o&qVcx~zc1kLyV$)#`-SR_{WP7Ide zd6L$;iijARUf`gEh5RVIkHWw6!4rD2~a!>3m360q<- zt(GN_gZ9z_K#5Uw{|uBy8u9sv&$2o3>5$bQI>l%B>N-nMa^}Rw=WgV!vqpUlPv~Hd zIoBRR1IY$;i8>HKIo&+Tz39 zA91JEKiRkZJab)gk(s6|)0kt9LURT^O>>)0e!WY1xEgcOA2691{rSJc zcRE_C^zT8YVY5pOKU+quVTi{oV49Ue%_xLoUqQ@Q(IS+N#Kx??R0S}F$cmmii>*`} zLga~gH~H1OXKJQbtMZ_Az@qI#{D1*8szuNcl2veOyBE{WF4GG5&#bQlt27xGIxB7= zgq@t8)epjKtQCfdpQrCu99^l`Wn#BG^5!C|-9t_1n?vmaC_6dS3e%E)dUO_<WdTV&P0YrvaEV^3f!zsE-@fu~_CpGKE2fd)6^z2c~Qi`U;Z%tstFvA&@3F#vWT1-X(q&!)yl_DdJ9k%-jXCmzmm-0M41?*w8PpcvzF*axBrH#zN;r z51>WJPjpEn56#EaT8wcFZMg3l0Brs0LFpmf<*rj*i3v7Ku=<{Bi#}=|$%#F4XYed_ zFlKV3AE6C5q1d3==bNH;6DOTv?%Vj)r6Nv}2>$?+ka|82Eg78yT`yF6z(_(OZ^Ayd z`V)p8GCo+$K4m3WQ=)#Xsf%nLF|(P%Z2HhTQ+)%S4kb3`F&}wQgI+aDB-8;g8HL@Z z5JKB+zKvn5o23GoN}7F;Rch=XBf}NzO&Ye*p(muidZ<8Pp2V?VkFJ6Vr(Rn~q23S~ zOVQCV_E}byA0A7kW}dS&R##dD_|@|SHw`|W2Z}%d6N@fhKA{`~(N9Qd_i z@A3r3kyZq^T5q||Aj`zevm9dtUBHQJ$M;7ciHg7NVbL5og{I(uZ73&}8PV6^__~et zv&?Vsuib=6OKzF#ZOA-%b8lG)+h$m>CY@`&EsnV`Wrg&aNpGYt(WjN>7CW;5WaLkG zJ}B#_PBlBStz}1zIx|Zo7jqT~m}-?g1O;+zGu}=9INZA&r0eAs7f^ z5#LmzHcgU-^_NekXrv~CgJ`z1{k9zs7|E|dDDDc?bP3f#)Nt`ASP;&Lag_j$edTK5 zLv=-EK^E}8#3pbi(aQ4p*mdAlE*E(fI#G#d6pnp`xaT?(-(cf+Z5P}n^Dy3x3ts|G zM5BT_PvP_J+n6%&fsyMTz+yd77a`966_(O zBRAnXyXRQ;KwM7FJC!_1=kS{30pjZkC|c2iv7{O2iH+^X4!4_+e+hl_P2mK>Qa-5h zKFRkkDP~Uep{5~~BW#kw$Qg&3X+nu3Y(l$XAB^sjxR<$*(5*DB#kc{-%o%#_&Zzs9 z$zyEUkE!f$We@#fUl0{51~V!)q1%g)xRRYhwJph`CDv3F;ar6&&cMVx?Gtnq#X(8J z>(;XjUHdTTa2WKPSzib-ihJO%pGPSc_dns+a1?G#lP2mB-%?$3OSv5NE{%9;9&x^V z_6g{vQQrob{LXuuE9m$%{OC#;2F-fe_3p1^;3UccPeY|MQJ&Uu>V;-Z{3VvE$LFvU zLkc<0G=lj11=6iC<8D@Yw-VdU>K_mg+%MFIzC0cWxr!Kb-zlw%6^zzLu8UIL7p($p51j-^ptH$}v^9JiM`%nA1Xi%krg)NdhEMZL@Ad=u&S z=bJ=SInrRsruu^$VM8nSqeVyg&2Wz`bNoJ5O<=r&e28~kr-#@;y={{^0MkBG5zCVd zERP13iH~43C+pA4YAs>b*)5tMu6bfFm^&fqm)LMiyZ|t?BU;y7#ab)Kf}E%`z8KIT zWs`c9(DMOp>wSyUY2jNO@ofxE--u>Dg@9!nq3A2xEQ*qPG_y`=Df)Cnf6iqRNIMfL zjCFK627X-6AQ=3V7<>bZuU52+7RV(ILWD1l*ZB=aeu>usos|g86hx>}>j2K*k&vfi zWmS^J*Wl(v>7PiQn1=`0=4PIr!eK0RI_#&w+o?1E{CuXpN85iGX`Tak)@mHdYOs~c z3yu@$u$Vwz)B0c4G=tNuVI4~>kt(TnaA6HYgISogp$^% zFhn`P#koW@ZSB-;7Tkxk4Y+ePT#O4$pvT2jsk+31d(MPAig1S-i#XP?kO|b8GLO4Z z@_ZArJ0TCzO}<9mfM`}`Kd!4s85(M7ST8G$FHU|rz+l_v0T?|#ODJCfIx!Jo*6bJYE-?mv>Oj~M>YQufT2%N931jpk6J&r5ynHqcq!R7M9yNnDDMoeN28c_;?@&mUkw3?z8nWtdJ z=u8kfS+tb_8tyd;&8*U8V5RB%StCgg7PcX&j@J>2)xwrn3%ZZ zEm1d&k&c8Ov{IckBMl0QfDBS{RYz;cQZ?&Wsbu*`78oG(TB$an0jaeheg}Zdk)#E{ zFYzFFew($4`R1s{N7~i%@Isoxw>Wr+#)L*X+tS7-W@*@CBl(D8tR!EwCu)U06$!*E zQYLsMXPCKJCB|^T^a$3O!Gf{&E?5?-Q_uUBQ_fFcLDxx!=DFJn4|N~{o~;p z{m)33=WKO8#fTt4r}Zf3Q~dRM!{s>ve=9b*JWt~H7X1Acf9JpH@=U?sZHPbh&zM>N z0-W-9?q81nhod!;&Y6$nHJxn#y12S_>eQ_pqUC${VQ;xSVf_6JWtxA#MA^^a?;Mto ze>6UKIC48IQ~m(>0|mY-3Sj+Gg7w*&G1zB-j_w913zh#4Cy1(S$s5$qitp4TBJ$?q5xxn z9eR|76)$B<1A{{x)2wrY`s`<*2s9zmMR*icO@hLfW}QN!=@(eVbwNIf&%pJp7Fohc z1TFIU<@OdCidj@|Ol(pQo}RIxina4OY!B=U@nq_cMzcNWkA$5we>@9g=S;|*Ug=G# zWt^v|0>?yInY={P(OPu}CSnhqlk3)@8sx0x*tB{}g`PT&WpI-ow&fTVpc#w)09Dbg zm^@Gy^i!iC+$U<#^eRZ{n)IADqb-epb$PDe0^0`s^~B$8=*JG{j{oJf2a=mN|5D`B z(V2nM<$LyKJ0Yb`kMXj8|jY1 zJ@&%K)(c6PQ61Zg1<|;wzr?=rp@AnADw7~@ipUyzDNmp2H!BhP@~nzO%x{)HFJF)G zpI&12>%=cvJs?OqQq4S9$D>AHfU}}T&?Gg%BP>masP-+^$bHL>1UzZw0I=h|V}w4^|%WPHm2smYTzHcPaIDqN_>!_cKYy1DT(sxBAhQ zJ$0*#wa3VtZJW&JS6smpIW+b;cQ9%Odb|}7?g-tsN3GLg=#o9ki8^8)L)&xqs#m96 zO?Z!bI0XY9S+9;jy!cyUfBDT2tF5YmR1()OY5r6I7V1GhTT9fv*AWK3&G@f_`7L~2YmmH z?t^+9NSIG_Smx$Nb;xi)2v&{iQa~e>=#HY}7~hTrvJ;Kf0Z_Cj5B>nxlpORH6b5># z$+{mDsxPp&|Gpfzsm0*=?r?X;WQ=?Zpp66DdG6USqZQbuH-G}F29qC;YtuuIz99f# z_J;1F9Bzb8A%5KTtyg)7qH#d*GKfvv-o%9W6S^>>w-qfx7?v2I3kZ4}^e!m+B21;GudhF!tds3$ z=5vUVPY-RI`5U18owO?2(`+1AGNa=eJTINEsegJkzI|YzYfj;dpvh{zA(_#KkpIm3 zMro-=^*UhNys9x%Ch4KeN&J>;Ck`r!UJGI6LJnSh4f za6>j*W0x2VZ6Nc0Vv3BSaU3K1EJWF?QuQ~H_OuCwA6xG9UIIRRAfe!7N&Kvrstf%$2Fn6YA8Y_NOw)0EG>@P#txxFm(qSbzLv zoq{fJJq4XmF)^b#v<=1b61`zSXXd5q_vrbQwrbUKC@#>+8`ag2`c0hJs@6}4i@9g=?HMIMV1V$357E}ef`Y*SEqqJ8 ze#KQwk9@SgI^z&&VmM@jhZ7xjD0)|dN9U#L=8hLzHx{RB_EI?3f=n)m`BuTnjD=O4 zvqh~qg_3fHp&Yb(PGUdgMqA#!#{wXIWJor!fmih+XhWyJMg2kdJ1>(QiVX*F@_}OX zTej3V)a+e|0=B5_H%Nhbpef#!S`F1&l38GqQ0i&EiO)c#mO!D$xJf$ez0!t8_&QXJ zUysvYkE83bc~CVgdJU6H3jE3gR-&8mcbGP$ex)cNgW>A(8r2Atmpn{+Qk#n0{V}-? zphT@dP5K7NItQ*x5>H!TKszGc-<8XLCDK94$qgQ*CxLN4===Jim)U0PY z3QXpkRXZ11u{Us8Q-*39{59Hgp~3t~G0k*OTaLNTT!cMouN0?e- z89D}%xY===)MsGJ$zd9UjV1=QbnAz6OCu|#;B6K1(~SK%DgU`r)XY#SKaG6%fCM1) zb)~9N(M#{tJc_Mh$}tn*gv^q?u(L2cgHK@R2ned85u_nZSOz1JUoAaR^B82%JK2k3 zG&DlZ#|X^MRRZ`)jt4Z|M@Zg@n8Tz-ufb?xf-Rip=+LMqdZJ4k z;j8ZC@uuNZ+eRXie?IMLU`}F6Y=I7W`HbI9WL`G51!F> z#RmZrhCxMG`vI@mcn=*5xUf~xtbUCJ8m)1>jcc)j$QQWIAlBL(NC}kT+eWO7(FA-A zdn>Wl+NazZpqZ8>q)md-2(oz+HXT{>x6->tdGoI+04^Zk+!LL1p#F04upA1P z_7MA{W?1&XL@r7b>UC zt4?&HI76$YWdTn+4Jq|2(#zBab?bhpgRFe8`pse_U0kuh?Q@e1TT`&XD#fz9PFyFW zH?a_cc9sFFO4XG|%3#Fs#Tg@Yfqt{{2It(*M{4kDwXX4Y7X>boMX%ujPf<#3|ky5>0l&lu2Z21Uw$aGPNG@P z^A@zD2SI+u-mA3=adzVtYpJM{R)3Hd-M^xb)V@T$cfQaUbxe-J9qX-RMUHR3${R)~ zvV|m8Qk>l|DoWI27W+(Rc5RG#do=K!Sw9QS{-EQ+KAz#PfC_7IOBqgTs0%>zwVk+D zlGnmX1}pY9*t+$8ACFuQ5it?q3Q2}Q#J4Jye^Y;V zSoDL&=qRDfE_ax&HrINS=89}wZp60*Cq`w-wFS4V9ev$Y98AS>Yu+|lZe5QbU}qq1 zsq&I18$&5iY^zM$y3p!8y{mvCa*~!upcC^#O=nc}Hf!Zf!N4nJ5@V-R;y!Gnn?oe@ z<-`ip9O5No#U#0#lI0q9-;wx*^ ziw+HIRPE&g9?i~^leJFu(r{_~Su+6|8a)Wj;0Rt{?txkYD~=j<{7Do%a5m*rXj{1g ze2^d!Z*3ILqu)SWOIaFU(Kp@>W#9&piGplms0E%+XoD5e9maI67K zG`;X}L*f#2-@#;H!7s4G!w>247X15D4fw|h5BsErYQfQrDw|iTPQ64%n&cP3cOm;g z@2XIfcxRU`Hew%Ew*sc;uwBxfEQNDeGd>W3XOQ7k*v;0Q2et&!gXXLo)4ml28 z|5J2*INFrjY*epe;hOjZ)-HNPK?>R^#s~RWo?`jvh({C(VvyV(q0i8d2*IRX#~2OkZCx)``Vv?WS(;BUCBkV5wCt`~gy8MP?kE{E>lZ1LlTA5)a&G zE$Se3_uy?X)So>kOx;9PHJ{@uhwH$pH|Hh?m=3?D_0vsaq&o(aAFSzgCR=_?gWj^) zk$5H2NA+cn>SX(^j?U|@kIIFRP}vo4$1&YF9fXytp5P5^X(Ok)vuxRhk!?(S6jL9c zn+CVi4tFl$Vl>n%Q7@#!%_rP+b|a&Juh9ocosTgB5+C5fPB;e>03*2_p4fngd9G)g z&duQKF&_3&zZi|u$lBc(2}%)h_oki%A+cCJ+nfwaqY{5mi`(JAL@n%J?vjkkQ*D5T zsYO(zoCn1CF;q|?!8G$hPHkmXF!i2*R*;E?-Abn`2~?3gYqylDrHJ*T!fDaP8i^;7 zIC){KM2jR5%^yqEAFV`}=|r$18`3I8jihi%ihHaSBaIY3y~lkKCN1Cw$1=z1hzUjn z9Ls2FBh5hZXyYr7bc?~^K{`UuB%RMjX0#`}70jydm++s4zs2~QkH58FxjYq!|LAL% zXCwX=BfPWw*O}YZvUd$%$@r(YvEefrZUyFFiTqE&-`)5#!+&aq9U02xZ!Uh1#GhRz z{UQ9_Q9$NLI;l4qw<$vFRZCx!G25g2n`YimU8)C4kfT**ztC#Su7(%o(18rq?KE!{ zF$#v*l*YylA`9d2SED63mcd~RmMx6*VNz`%{V-FYw_{$cAu+jZ(~L$$iRms7I?UQCC9z!l0K=mH0%E-$Nz_YwMyN zYUM!C;~B7WanSMX8Nvj4;sa+ORHIhhNb&**hD^R4N;vlm8$(|i$2}U=QcPHM8PKR6 zLI~SNI0q5@ktHrbicI%d#oMdoo*`@oMf#8eI0gDJ1ykf9%i+HqCWLQi9r|7MAoL&X z&tgwote8O5Ms?^wh}tw(lKr3|Dt$>53VvW5C0& zd)~efUsCBNxo^uyM5^a=d%H1%C_3jV$(gr+)a7u+)iiUxqX==nrer=LK5Tg(gNi=M z8w=gBCpm<@P5K7m9})V4mQPw*kOpU1dQU)`eL}L#(_P-fF=AKlLsAng(sb>5Y87we;m|OiFDh2pNE^*I(RvM`mt1?Fq zRv=!F3TQE@#<WGn2|G%GDn&&5Jy7a(3gWfhP+U9 z)_Og!r{;(NB?cpRanr%>1T9dy+D=_V47vga?Y7HuBV;?CZ-jz|`N^&3jz@+vwEyBeC zklr&ApQmwkxHP;!jjK0}aNicS4H4+}=cILRUE3MJfvkBBwGC=|9 zgjDJ6veZn-ERCsTX|!x9x#(l)+ZjzGU1z~mS1G1wYB`BsCN-sUhYLr5hblxlV)Z2bby;LY|YIVMj_jl-4pfRqX$!#&b7ea zxfVoy3qachyQ*#&)Dyk5SQ;h?MK!viFxAP3L64oJdj+Aass3c05@1Lf&?$$dQclw; zi*!mtt#@3HIP~fK6qiblOP-YC8BHTA3NsiIK))de+}DDFgiH1#d=dTuO!g;h(s`Y_ zdVYz&!;IfT<2MJtmv-suIlFUL&!6#IkM}%;PsU#%{*J)kEr=h{wQGmgt2uflDo=e5 z$`(Nvbz)#`#<}L7jJ%&f8Ef!27~wMf?X=D{O#y4Z3wXqk zz@_S1zK~T`KfTji2_+>LU54K3a{b!DRTauNH}=(hF_xx%L2BDm)?1i_xTJ4Vzr#u| zP{=Da@iGoNG43a;@!0hdB`hM(8%vETKX>j7v{IsB>*KDbWzAX0bO)>06h#G}ViTYJ zkd$Se;nK=@o@KBEP+mw}f(W^k1bEW1o5C6v8jPH7f-%;hhe0`kpRU;Ylp3xB4Va_T z$dT70TRDoyvG*~3STq<5JvPDr+(je6yY@_(m)5hl;@wUJZ1No<-X5@Br3%ED6Yef1 z$KWnYZIfLKDoo=bs9@v4KA^qy45^+apDiT^e{2WCK3S2`NDreoBqp`cED`t6XxO3@ zhB#>k9RsfYK$p_Z_A}=Wnk|V6G^wpvi3TSZPzzyi^Tq>24IqeDL7fdSQLfyu z&rY;&s-<^NNcu}KW3!6eymVr)<@%$rN8NSC5g8**`%;EEi8f?i1FaM~Xksd)6*<7p zeakypt5o+sp&|%d4&UMu^$V!IXo^Lk8=zUUfVeV9UxtOIuPF|is~ppOBh@&Z@i(DN zSrTnRM}*k23C9!a)Pa4`s!I@4-aD`bm-9#(zxoU^CKNH)X)RpmRs3KU*jp>{lE;+y z2sAQYFfUcrRtoqMSNtMbg=%`}jd+L}3gyC@KsoeL5mEEqjZuyfuf8tO-5yI*a~s<| zD~uOxEpR&lyVch~SxC33YX9+)#&2w9_%=f)pgJM4rED|zFue3O!o6$^4c74x42R^g z0Vj3+crC=MYy`w`MI@1c(+CV^SV`Z7p{mtS$C#E3o2ivdrQHIRl}-ygV|x09cM0UN zyhKg1(thoeF;}M+GVRZxrQ|IDN0_Z4#`w6NQ{4yBOWWR0oniViBw1)#PcKwm_c8#3 z05p`8xUHP(M>XK9FEDz{{cwr;x)5|STxy@Pw{$qY^$>+IN(Y(w?in(>H5ZIO<39W1 zHt)07)@spW=W5j*%C)r0B7KSNd(SN2L-mFsTWEwM%WwF5?P=Cm^6Qh4U$XP&j&#C063PiG##G{Dqb^Y>BWT`8L)shZTMxArlgo94cpX0E@)~Gj zcQp*znxn<}=Xbzwp4llnK#vFO!Lrb<6(>Y{NN_zi3m7POJiCnCY~~oqd^yjqVz`3g z+-GYUzLep-XE!l?F2Xdgt%MTF<(%IAGOsJY6H_O9JeLo0UG`F*yrv{i6T|dh8@}V5 zS_Q(YpPJ3LAya0;7jqKb33#Zmb_%|zgYYmuz8hi%CIM)WXqbz-V5)DotZenE+CiGk z`cs_M^+&1L&`zgr8oj`e>k3yl6{dkPKa56UyiEpcXHM*G|d2lFjD8^`<$-JnrK@CN+%#cEQ zPw;Rn2l$#qUKl(1*zy`xTLGn|X-8d_&l6*1`N?&JSpofCzI#QlfiJbDN(yn5SH3+^ zG1&fI}8?&X;lZ2XvNGB0X5}S?8a3c5C{jYSyuku7BOm*Z(?O{pFmmGkg6H0!u3^ zf`rx&l}{aNWyNP>&B5P7**q`^&;z5W6#-fxcSEM!0|Y?*(b8ow6?OzR?~k353YU6w zTNlT<26dz3`#ZOdaY9?KEdYYUqGS6PM8`D`$K{YCwzZT+1D>dVKxx$99}7T0VX1H~ zKwQxY{XLP~mC$WFUPcLs@|5|})#^~ll$N6qZJ6Ax@yEvYck12+r~%Q5uIRM<(Ds(# zv7yTTgIa=}M+N&2x^{5v$ZMndPe;c0&yS4D4^=+xbX4>W(6vu=?9(pwQ{*Rs^ASis zL$r;45?WJ;y1YERW=d50&CDB|#G%3yg*VXB{E;QDicT^;zWno&=jX%7IoaI^Ad~#a zX|Bjg&d6o?WhMTJXPtZ2*)KUAEgM_0nT~a~4nRdg(R#hSd-K^M)MeY}rQkxt`_MeG zRBgnpObWM&K$i3?na#kL(EYf}t}__kiTP#8M$!+jvA)Q=C6R(Pf=j|V%xd`iZHDSN z^pbOAS#z)(c^S@MxWLtL`oigGv!;?CB`h_Kd*{C9m~*Cm6wCLS^+V8aQj1(nu`NLe z12AnIuD5)r(>5hAgzKu6%~5oqbNtOoWl;VlT4 zJ6ifI!W%Br#GAjR&qDdM884w~J{=W54pkEpHxnB)VjDZZ5E_BFuo>pAEI-hv+*RoOog19 zqgCf{r!0NS6nJ_7u*`SWBa)WhdK|&g5L-hlna&X$8ub-om93pGm=h7j+By8LMbMT$ zj=DY`@nT$%yintPmK%6u>{X5wy!95EBRJ5U=y)qK6?hz9w8(+GNMF5~Q9VprlDNxM z&xv+W^)QqUx{a>Kx+SAt7D09pkouE*>;LN4Sf!&#i@2HJZ`R*UcucPSfQAL$sx+Ox zuPXn%ivuf_F3)0@*72u9;dHdG(@|5NtM)TSA75MgEJhDSM_q!S?0HIlC1+^LwvYv& zM;wTW1U*6oFZAC7a^*GJprPJjdk#Sd=*Tia@&~_C6F>ceJ&66rXkToE;?)(oMY>V; z<&5sHn;!F&ov#SOy``qI`$!VB{J7DLucpncSY=7iNA-z}wm# z$&#OKXvq7@X$QdN`B5;1OR=%g^nQ+tZX%c@?sTHj!|HF`Eu}R!Ln2C-cW&v^jIoAg zSGN>EpcAAb&V-E+qf6EEIUG*;>%xnWjGtl>^2cKQUJ{ElyHfQd3^T24Jp)`}c_BqP z%w6~3HIsDL1zQ_l!DL?d6HYmmr3@^7o$0_VP&6T~-TGpr88%XE!iU+=|x^ z(uV=Z-+nLcrM-2qT0X!P@M1pB<+&ATuo{3A0fgByoIP6rZotQ41CU_?$`w^8vLF&$ zg(&91Ulu8!kZcX!#~H~O*2!>mt2-tth$==h{_14-gk($cevXlhVM$h9j}X<}LcmCP zC0>(<2oZrqVI;PN5kP{!%q<#cC=w@N$ViRM>+m|w$edw~Q=t^R8SjfMKu!0#{!TmXR3=FT`s!&SxZEi)W~s&%9uF9dHJFV+&w!b?bpLa?0~m zmmh6wk&d0r9bTh_m*=@}kS>&EnMZzz%1!~z|APmT|3g)fo&P^1{D13vCjVzB3;#C( z0^N+25Z5H&|6fagSQlQ1WSajo1a{5uVAo7nsvee=AvfE||JUqg@c#w)xGp>oPd%$- z=l_I4h6F=~y4=;Hq?dvJ|HI(_jQ6YY&~OOCewm9|T7E?BV#0#`*E$NPg~0Mz5~R8jWLR>A<$>pi~hn%y5g45g8MIkrk!`h9a@0 zcw$mDV$JD*u`(SnAk%^W)<}#{>C?et#4uO>l1~Ym#&qzEZ93R!!0~s;8cYX9Ejb-L zlRh1+0*E;sFq}PG@X%U(G^YcGH4nv&g?c(zi72ARUlwUj2Q_#%rvrv{GHW`hGm`OF zC)3lx61pAHC7qC60SF=0T~!)r9oXC%G`&rmg=G955rP6yZN zvyYe#nsBf#V>(!h{qY~BgY3+{1F^<>qY%u*5p?4z8=`uD0$Xvi#fUX6%sHvwsQ5`> zA|>&$y&y<9$|s3zfJOOh2e3s8ab&$B2NwMRJY4m|B72isN67V>c&t<^4|ATsJV#ZDjFoL`vjf!JG05(r_jyIF>Ae(MeXH87 z=>3I*DZVwmKiWU7V4?SLd%>;fJ>4oeo!$?lrAhCJ_2d$JmfqM20(;{Env%Awq@_<& zTM8p-pVsj89fObNLQDc94Sg&;(6;V2dq#TxCVbx=!9z22dL#49RAU^(nA4rY3OzcNb>^4+vhpvGO4TKN%pFoLG5wdbP@cx=Xd48W}Ftd#zXQ1H$4J%iub z`T|~)#jI@xJ=*z>EsEPef?;a<(k7K2-(P#L{qGYoI@?SC3dUl#@1gpBun?(-7=A8} zpHWElHo+0RuwdvdVJ^XK7-%z3q|Q{_&Gv@QIf~PF*m}<&)vY2onVb9@FD^RK85)t} z4nKvo0#}Yj8~jz#oo1PmHdeR{54L9}W5=emHU!~S!-g4$E7A?6g^s0l2uhGXhoZ+g z=}cDCs(8!cG4tjU^~B$Wfh0!{f3xD?zzB$T#w-!I1xT0^#UNO^S~HZY!Va?Lm7IV^ zfE6W%;2{_X4UD<9y;U&YDj07C#?;>Xnn$^UrxHILUBV@)Bmu5sDAJ@FyJlZyb4xDqRf=0ZLe1NrjYau3*IE|hcN*M4dbyP;d~ zcO2v(_lk`;{EGvw4cNPBQO{tuTIZkvNV1$D7yso8yz?L5CgROjFzma6a3RyEimiCK z{A*N0nW)&ssTcY32j_dEL-=WLLiWT4C|?@4;|1p~CD90MwBw9VM|9*S@B453rp6CD zQi(cEufj4$K?<`>_~JK(>vkAE`N__~*S*mJ_|*7(0y{_lW8Us+VW zm$APn@GCtpq`y0`q|w5j{@yR+ed_{qe^P%}>F<`k1A9O#!_K*&OS({yVpkgf-IHFn zu%tV}e!N9})xZwaqBwB))7X2ZNTsMX;yeH?jfSVETDBdH4h3DTLHGd#h`9qDhD8n(Wfe}g?GVN zF(^)I;WeT^8m9>8_p=&Jjchwhv%jd(e`9+T8tn~hy$nMMHRI2mHvrJVmez=y`Dd#t zU2v$}0br8joF%ld$Pp%9WXQDBX$elL3cg)M>2h4%6Qly( zu=$|m+#BU?dl!8mw9&C`GmMj2XMBao*iOgQ)iL-JbFJjTG9*pXx^vq*$eChgW)22E zo_GHF-nk9%69=jC1nk+X^ViEPjP&kjygd(UnBj1Y=EEK4aT5%X_q?w6`t?^YgFNWL zz#eKG9E-;@H@F|3dBGvc;gTVw))M8``5{&EavfXNT&ljTl~NG8dF9Ww>o2Fpca`KH?*p;L8uP? z81#X@3(Dly3Mby0VJe)qq?Qup2Lv3iP&QXvd)nj_(M%0i!?2NJXUoMP<2GBZFIw$1*}d9-4O=SZZ(zBq1_ps|K7PORgK%% z8vRUt%kI#@Ueh+1^d~J}v^Kc{6;(NQ!}LIXsUV9b%ns9k{R+}!A$iM0C@A?4nXRij z$9w@7;JVxsnK>CzC~)1(#oZjzZ6wta^F???Rus}IXU7NYC2(cYQF)@hz~=J}#tB9Q zhTp8-{v&W>k$w}M9hPFxA9)m@1e-M*^320ovu{JMp%h!br}P>I8Dw|Us|*A8+t8~R zyZ7H$dfoUV^o8BrzfOMp+tKR@7~Fkd=`|Lruw9`SPh{+>yG#pQ?Cj7;x<@X39h~N9K?oxh4 z$By5}W`1vW!wj|4_3Z+sN?Lx8nDyNNVRz^A+m_iLe=+m>kgiU4h#%!S)r`%hHue`o z_5IEDQmZq^dZow>`iAw^)=T;RfucXkdTF_Ax2IbMa4DLj%f?Lu1-_W?}g4?F|zAu~fJ{kK5d%!N^+tPcA47>FH z{S>UitZKLF-;9c=PHSkP_eguet>_&RhRTB5ruVrPy?>3(o9`jL8^xG6o!%$n zOjq0Vp0~y9W{GdZzi&z}Sm?bTCn~IhThY6>RdCz%zI?UWzyBlFiQhYZG7Fw`xwV#K(Dj%KuNjU3*De`;d4=v7OI35>O2ca0qI zvj!kwhpN?3LR;8bz#2Q|qg*NM7Q+Gs3rOmbp>7-HD|Fvl1F=d?M;=i)#9tHj_J<;_ z2#UCVQ1KPQfdpPtjsw(TE}9&0V-Dsq+uh+Rq(*&Og6GY|6YBaP?ustN)q10R1=pOa zs)29BtFVCw=MdP!8~D;luet_%7K(nh;hoBghn^scE6D@fks+cn%j2k1PKmk+GCCB# z>aSEWk2tWRn|cGGXxSPVBg0zfEf6R93sucH=o)Y;q(5*sJszYh6xHQjOyr?w%quHc zdtwWaZ{A*UAX==YqMy3fDr71%^wmUMEaVClLTey*OaVLVB$&^GV_>@Wr6_R^nr&T#2$~((|3z8{2JBGvYbev#ISxb?IL2cE>n_54 z)JL%FF~pFWfZ{Aw*{WG_@ZMsn72T@18s@=wxnw93B8nCs@BQu zZZfi(ER4*zIpW(9Bb$xA2-{37jEtT^+ht_^#6nNxpOC@GZq969%w07(qr3&zj92?g z{Wd~P4&DZ4J@Ac@Wn^St+-X2YmWs#a1h|smjXJ+(W!!1=#KxYQ>sRlrA)c*R8LT;d z|A$$ba9`nPGwW-yA!t8as1Hz8eob#B==?Z`#V~@nRg0lWcov?aYCbb%wFschsqP|u z#MIy>2KZ353`f5$hGM}76cs}vu5EkWVs|$QSHs~n9DDXScX zeTzO!HwSM_#kw=hy3dU>G$*c0D)JjB9Rd*mq9M(c;srh1`RqafT!DiFg_y7dc`2rK??!#Y{BJZzAVGF-eDrzWmS!IN26p z!q`+iqj842#~F6dx)(TO#5*dE4plRAM{w}Eupa^bGs?(Gl`%)k;P=FpsBUs%RA>kG zz-wtdc`;IQZH^;(f{|V2(HiMdWd+v`To;~@p7W!57WRir&itO}gPaqT9i}m3O94jAGFimG8-l^unXk#*y%Nd^2bsOQkE2bo>Se3ok)mz*P4CsKnR4kh+KY=RxpNlbT^I{y7a= z<97MyGqO;TN%poqz(0Q}${16GwfN^d&?#GJW#gYkDYTl>`R9hmzIXid6IiCS!#|&g zUfATHzk+ht7(~azUSS9P^A3nj#`s){Rh_{J*YNc?&&yFx5i{R!XQ45&X6OjAu+TR^8KVM8Sbau?#U>6W3;mKTG;Kx`78({7 z8WR>O>@-+vuu!kbLVKGh+ksOVvB^yyYGGR8W-Km$!-w(y?Mc4c5l_rCY0{dT{v?I% zXu+1;HhELBBq}ops#tMMnylW6p?&}<#;EVtSm{KC;U-4{i#IifBIOs1G3QDfPkkhn zv__JqcM&XRi2a@Yka5+2qsy|4GTG45JS~K4mBp9)xG8n$Py+(^s%xZR4*R ze5mq#ZDVBFEY>UY4D-yhOcaB zW#g|kvd|HJt^{3P-zzpe}Os}MA8G#4T^67EOP z7{lFT45#GNA$Vgd)}3M2eQungIdNSQS$`LvE04}Vzr>v%+|!xwS@ zO7JL=PsbtFlusFs#2t7VAb)y}&{D?uH#l7REsK2WVZvAep3ykN-Qx_W%csm-a%Cq+D;xi;deK5FC7%i- z8T7#Sj(?u=al8EU$B=cvYGuR?!r3k(cn(fxL}YBW$v;0v;~4xipNGOU|7=Te44>R4@zZznq)34v<>-G zSZLVALSn)~g`L{vQz>zJcKOugciH4q8{%p5X%Wh@antM2=?rq;kM)tkO+`MH+_T81 zWSBOFdQ>Whvn2;%sD^whSWpX1`IJ?O#BDtFs~4=oxj2goztuc77xoZ8@YF0k)gHB{ z*Z=RP$){S~I#f-=lEzwSXXCHWK!`AQ3tP*l^RWIg`76VkzcSQO{pl}dzuMxjRm>1< z{~auLEVQ!m*P;|!Df#p`q*fd5{r;{0>ss+wyZ-dfdxXD={`3;e4#xWbtmk*Q{=Wbj zo9ll_vwK8;`px@R8RMjk-KIZ%IF<81dDclU{=ZlHQ%4HL(*#9X@po8%x*F1h(LVW- zyo37FNGjbXEX1OsTh+XD1y8a3-`p{`bIaD@JSE-=2S-o{pBuKkxn2hE_KIS-0FmD4)muNLxeTP=hW2}|72Gib(5S%U z5LLhD`qOQgKMZWYd6C%ewEpxDsT`h{9E72ENPl``Dk&FdcAk163<-YVsjXRRT8!}5 zQ2iirPYW}yCJKA@tMjtkThf=WxrhHCbS)_zDQz={s?R>MaViTqFpc}|vVni}GK*8? zV5dj6uXon0va=0|e(6YvSyH(j2@6;wA!e0N{@y~O5_#FICc&37ED!$;$JUnFq+|Nz z4%rY^0V^>+(l&&&oAfH!Nv3QFw?@mhrrQvXe~3tF)0;|dLs(}vN*%>=ZNGzyTB#wn z+Yt7$(Ifx0v_=8!;c61J#+K=g1+3{IHiQrU&ZI~3%49iBjVh;L8z$W}G-X5h5Xy*n zH`{ClM|wA-ieeg+VMDkn>f2-*R;6qRCqF24)#shtypt%c!~U0FcEfnN3ObX_@$w?{ zla|1dZM<}bHHNWZ>#{q>OFi@+HY8-c9BW4++jyC|)I#Ex9gUYfxc;z>mnp4w@1$e3 zGFLkt#Nmh$+cdkSG5i&B5Qz`JttlfePiQp^^a>v!V&<56ljdp}V@6DOcQ9r)L*lT} zM8?d)I7HU&n7RCMlP1Zll2c{OTr5?ynInoZEwuSCSGxjq=a>--HZYliwIh8TGh!Ev zF_Vgic^$4de&a)vJHX|jCpKXWjPnlrwbb^1Xw;+zt&AV>uib6HOEioiMK|MSl24Zk)~Ut@`S{7Lo`4-Pyws8jER zkcQtIBuDz3?6ub00fSrPXqoG6Ne;#(jhOe$vWGz9LhoTXnRz=4S?k@7tI-=& zxqxp69oxI7E!E=fhYWs7$4cz`E9nR&r=k~qgP|9wU*GjbOCpcF24mj|z9zUEGERuN#`iW4k_MI{<3IpMTH*BPGYE~gfewjfuo?|*rp19R;J`+Z zGr)Y*tVd;_55v`!f&l%uABfA*S>2`r#IFvSAz8RzsJR!Eh~z{{(89Zk;_2^uI$|w_W-_|Eu=t|LBe1Dg6z9o}roozk2=FohmvtUsG~I`rE!` z`k#Hv^zL0q5C0i$%zx*G_eB5u44RTm{yX|F+52B={#&%8{%6jAbEE~^o&Q4Z_rKF` z(4An#e|!ELjE$^4F#o;Kn*P;L`L;j*$r`6U{%g>G9rTeqkUz%FZlC_IUH3hq|8Pvy zyPy7_t!hpG(Qjp?zis}zpNZO|zd8TySpL|Kwrp?yJN?@43H={JrFTF5uf!f`CjY61 zC0>^PZ=3&M_D_AS%@YyP(@|EXO_ z-}d}>C&#~B(!N{Qe=rox?0=&nwPx#osre7 zzY5DPOrigM`WIlIdH2)*Gugd1cfGk|1N{dSuUY!PZT=IQaQuF8|$* zwrr37pJTWBdqMw4pzPZH^uKaBtCvpyYABzx(BC%y#hIuB^k1|>h}Rzfd468|^uG%8 z<9A4Z`}}u8bf=1LHUG6hwYC$ew@Uxww@g1{7t*&q{~bs9i}xbzUj3&ihSU4sXh^Nu z`d@1P!%)!u@5=V)zx}lGpuPS#y#oDj09?ekG5?){`4No>-RGQ~J*4-PlxuawR2boy7X%}RgU{3n7P$NvuK|Mb&By!Pln4(sdo=)X=k;de!U`}m)tmp*M3 z-Dr+xKm3rS1Op&27J93#7O2d$9OxcYO7iZG-mKm&W@31zqFz+IQcp(Z22M zFMNV-jq&Av=D)39>3QFtpubx-%hTz9F0`Uq=${&2i({lo2k8HE8NKbwH~){lD}j%q zSo)g~Adp}d1OWjBjhZKi;ZRUiNMtpl(FBd6f`TGOL_tjyP%alV%NoH06;D*Wd5SzG zh{^**0-lIZMFoutI+&<=8Zkg1-@mG-XJ>Y2W_Po@NqArK`&D+1?w;=Is()8k_4Fu& zZ#MkDM)j{WIRA&ti3R`Xb4=XG|LyQfneg9dU#7w)vFE>PUrt@g!fPl0PXvkY{EYr- z6!L!~ochtnpOlxVc}D(^#zI09{`>69C2Y9Z$-m0~!Apbk|FS!R$iM1esVDi@k1q+6 z!|M8g@n-#`$nwvLF#oVRXDGhwJkpZ_TsRRhL9cm+-5UpM|CCK(d{`*H8u%Kv4z+4Fz+#Cqkwe*Ak@)IQX% z4;cThjxhf*5$4~?eVY(g{jJBp6JX0k-@iAXL*;(@53ih={Q1Ve*;4+j{HyBx@6CJ` z9y|Q)HV*P<6JNL<@(Bp1J#!L0@%XfL%$zJi{3~Zc8lunt6b_Xe`9Jy%Q~vA5znLNO z|HP+*@?W{ep8vnX|I#SWlyS@$dUlVX0og`1e$V`Nu|>zegSNTaSNpFj0?wd}02gK>6GLs=566#y|Esll%qo zZ|`J7+1CE*HX8D06JNM|0t*4Jt&Z8y#}S4g!16a3YUe~gJC z@c(2slx_L1jIrncx59*Jc>eD|P%HZUpAS^`$KUO+G)?%g8~@lRY{!3f{ByH*+4BDh z*cZ0)5BmfV-thb%J2DphPgxkq|IzSCoA6&Z{;^Lu1pY4#Vf@4V+K&Ix%5@z}dVWwZWAb9<)$GaPEjD@^C2^8_y_g`Nymp5&^8*npavXeJ; zzSnImx7cpJ*ZU%SdAm`pC#x@g*UQ@pV!m(n=m2@^$ZWBMrhxPl$44R$m%*Bf0sga$ z8tw1x@X4Csk8k`2fH8A`JS-8RfROQFzP;%fQ2wDI;EA<7EQ^VKIO*;{d3Xn2B@=n@*(V9?vkyTY z5-;b@w3COo$UkT^Kk9gKgULggSo#^VJgf`Bez5M}X~-RYeV@;vbU*xuPuQ$~HG3cx zG0Twf|I#yp_HVcI?EBYMzxr;?|2CL(MxXyF9^#OZ|D)j(HsQZ-{9STwi2Q%$!l3+D za_#y5o={OMAvZ#1L}!eL*8IPJPAvF8pLNp6|Lrh2O!)5`?@}4qL%=r&j2jGAcKG%L z{5y8|=7N8y9>+Ut{?E&b1^>l6s7C&ee$15rzVT%V8`2^0e>n$AZ25l~jKD6TC~^ie8L_+z5Jvr-5xQQ zA8q^^2b+S&uU!w*dUe{&Lu`?8PXA4w>j-s~OxaZbgPSB5=R@Oe8AfAlUVc41BpqgA}M z>aTQHEc)w6c=3(nUAl5Te847n>l^Q0zp}3V^&NZaZTsuz;r9KtkByy#M&Dn}fOXN= zuSv54`|BO}j7|E>H$En?8wmIuihh;k_Vel2+AHXBw*7VeRrdXLjtH1E`u_SCJipQJ zuYb=7?5{R>l1YF0#?uR#>vid`ECw^%{@P0pKN~!JRLqhaO@Fml$1mEU0yl&8zn0RWepr5LQ=uLd9woZ}sIbjB)uV#<={?PmVr+tlsY}z(^m1^&h;v zNN+#%R<_@3t}mMXkUEN*P4=gL{lSoc{k5>e&_g@}uvL&QL!cl%@r5vpH_U#zg_+DV zu-NUc74-e;RU=}-{}djejr<=CpR@^H`Rsuumxj#$J9#Lw<^NBa_WU2u(Kg|MZb1Hz z0HzVoT8Z2A8fW>~iJuXBqwApe&`>7&p8 z6b_{u`9HeYl>ff*dI|eHL*oB8?7p$(|0U*v48>0tq1!2I^Z6C%rh zcZB)RtwVlm|4Rmklg+C$=hkC8$7e+eAhcKpARyRe@4uOI*RA~YubxgiX^0ps7Q2=h;iF#joa z$ZtLV?HLOF-yiM$Mdq^u!zh2-G1D~Bf8F@U4I}xRtaBcl?62GrV>Wuw&RyKCFQo4u z<;Pjg{%F_{LNMMF+YLs7;O~WJ#)AJTSXCUL|L_r;@LxCnolBWQ;Qt*kZG-S%8DP)< z9h&vq!2JIj)6f{mKYL64qP;{$3EeNb1`YL4Ix@;b)NO{SCF)%8COviTrh@Kx58nMlg4dPoE^~PDDm<=AtV~JDuH-7m zag`nO@@k9n_CqP11m!8{3bc+Jb$}anAZ}jXfucMtZgK5L!)gYvjih0LP30@xUIa?r zYY;%i(w4+|88u>L6dA(4Ki+F7ARvFR`^M~IzZ-r1{%7we3jTXDs=c|sF7WX$()()v zn)5%|i|-@lC8n&7&r#Z74i9gzUJ87|qt-{JFG2cG*gIsOKGB=#UW-o>C3;#@RNi08 z0?LmxyH|VX}K&dQo1jJj37z^RCvt=j0h3QdZ}F%NE1-U%{TI#KzTr z(ju+@p$Rc;|10doY-H_+%KO?6FJBDX|J><~Q2wFvzV;(77sK{HdqyK{KV;I^evB0{ zZ2wNM7q)og(tmaE6ZnsSlYRTghl~H68UM%A0FY9$F<0qwsKx`V@68-AFT1t~rUf0k zl{l2{$rw=Xr3#F!tuPi)-$7zLTt z_^}oPc#Qe6fM3329ch&ELGK!A{CEw37Gr)~+OKiT$Ekn}jUP`TU>9S4C|J6tVrZk3 zk6wTbjUV?S(idZXya@ZHG4rDqjcR8n?w${aVmt_=8TazIG)<~jSX z$-&35lgY0&Lb-`vf>@L8-r}IK)aC5IDHjVqlJQbgVvaHf5`qbcCofq)2WhX)K?eEc zhbJCpbC6y6wYBQk&26V4&N@y*v?0i3{HcHnY5dB?dkWFuS0**uieKpi?fCUFzj$G9 zvos{X-iC^4{OSP%I~x3I2bNg!%W;w&zuphQ#&1Y|-3=Ag`1RjYqr50QI~6Lc@$V^&gVEsMedO=A;@_;^!T5J< z>cPXm8kkxd|Hfimj0XQkfJK)48`>)v|K=Qj@bK?#sI11n9vCO1!M}E3ktP2eJ%jPD z18k#W68*~a zwrzTTIQ(zoS9tOgF24@;^ikE%QcQCkj?$qC^aFJ-%}C^x$b_cwdj>wlw?ES3 zP5ri~{}xntyeFq0b568~ny9sC7fhtETjXmG7RzL%PzhMu2i|$+Wuc#_yzFF>0w=cU z;j>PjECJf>37HAByLxi59+yGClL$dMFt$(b_y9P56#Sy*oS|5e-mQjc{I`vCG z9OaFPUU|!jf6nNYclGZmZw-ZDqto8Fj%e@X=#@9H70T-#z4HD<^h4Q9A=c=$_gC1b z%B<*>H?R}ROOIZ8&mBPjmQe^by!KL{i}W=Y`k*SQnFX!sr%c}?p@Y+tmEi5r zoepvmcg>krQb0}PJ z{Jwcj5twB6K$HBK4`B$#M;Z|rEsbZ(#kz#R{KmBU`=zrSY@;kT1V5n{I(R>y!H5zsTmklKc;2W-wTvUm1w8MPIo8{Tt)#?{5WG+vV@_i~aq5 zyX^0ebJ{)XM;{11<_zdx2DfyRC`@OMy<_LmTr*yQgTgg=M3wa@=r zt$q7>${z!KwYxtR z&T7m1F1)Cgm5i6)It$z_V#NG@Kc9K{%r7tDpHF^(D-69UD>4&ul+U1wgvds2_@{TD z>?k}84{%RQa1^xB5I!>j;P0Q4o~F;Q0o1NP1Gpm6`lna=lYF9{w1l7L^@(DJW(UBA z_BjG8Ww@W1t5hTkWH+z9TL0M5;OI((|7qAM5%J*^<-R^$BEwDgc07j9ItpxTa1{+#Sc?S?{!6% z;^HNAeA~XiYSqJ*nCE%sK8CC6g)O+CKK%H@=#Z<|jHZK}45LN=kCeDT`1W-~h)4eX z91E4EkunHBx3)I&GwUznC;u1x9E1x>9^r$ys`4|9F3${9 z6a0KF5Y9v7qA!_0KhF(~pP|WTb3~1$km=+z{U=lTEQS9eO!+(plQk)yCwC)8v8awH zBYx`S^T|r$H7mzFtTtBV^QvT{e2zU9=T?H`W0~!dKR;^{LXb~&zYXA{a&NN`(uax< zb5WQH|CjAB<^Nd-@r23$Mc=YKGt*CEdFI1m067EycOae0|JLm^{{Pt8$p7yH%{N+#{R( zyMH;wlUIeeLz-dY8${ll%ByYSUz5C;4V`=~Ci)@qw}?LQ<6cXSJI_2ihQ5oh{xsuV zVDf=G?l?utZp#Y#~Q7$`M>j#&ffAfEP! zs+PMNRg(bEb5#c$&gA;nrt&RxSj96qbFih2_ue9~)f+!Au_zm;LEGWLrsxcRPs-}H z^gim~%>_v~LkD@X6U(=YB)s*3dd)q(%8@eX0V+ji?;*0g_g-Ca80?so)!4Alg<`Nn z)VerNUSj#@xQe~7sN7vtuE^=GPA}wV@wM__#8onCXdfub{R`zrUS5z!TQ|YfnHOJ# zH(sf_{QaA1zK3nLDjfy!<(~zW77HfnF01_NO<>FbuV-_O?w~F)Y5!U6uk*Re4KwDIJg;UvN{tgvT`HRaa#*EYWh&XL~4MQ<1VF zA#rUr8H4K*g9QBb^|>hW`kWQb`rO)umOVzqpT{wsiW+}D#0)&b`jjC861DoA8hL$k zqFJAJc1O&g5;&Qn#-DPy$9(<8JN1!%@pg`+U)Y2%n0~#{J&N_YEb{ss6V3YcfIlNb z{y094qC8h1JP=`hR&I`BeMUuIpR{P!=Rx?%BjnF3aMVUazi8aVNSv#@gpeZQ1Mcdp z3%Y7UGTmH(o5gSd8D^2CQBe*jMx}>X^$ef@w|7i5kbTFyg1sd zNHq=U9ElF#0`2_RcAo11XAy%nHm^_za_lzgC=6xkxNcPT9rAc6=Tmrca<0-0tHdlr zAe??BnUx|uU$=9z`t|u~Re{}kq|fuu-}HQYe*5=_AOCp%0ST=3W_3S0JCS#zr6iiQ zCbrczTXL`3UzlGslEQSL7j$>%id6v^Q_1RGLaC52ojpyJ$mTnvbnO1YJ3`R4o?U`MR7rN-ud%D+)xC zSFu6^SY71WCz3oV&-dbq`?0lgCp@tR3*el%zfY~nUex3^T&H4dP!l-Avyne<@8I_f zTH^b@1E>NtPPaS9)X7j(fec$n`hgipfPbCpN{X@PZFs=LjW5-rbGD z|3<;P2e0Kqze5YL2l7_@(Ada}HsW~29BRJ@37xshe_@?-YpPM~9@LuL^wo3Mq|BLv zY)FH2dDUty@1c?~2u?|EMZ8obFBM$JvcUFyb%(sVgRXkBmBHCN3TT7q3s4DfW^#^l z{1$#Dz2Me9SLrIw23Jy%WioRaWuE6ME63|kiQf3Zu4KBsP2S!nZg1mFqoVpYvTvNO z>ye7LMtObsGnLP(ycWsx$mI1agkrh-RC(Pb&wcWG^mg^hs=OX5&toUA(_uwg%j*^L zZYc8l(h+I{Re60xp4X$iPWwbJuM@@D|E|225WY_QN|VP9Wp4VAkO9)@@#QGOi zUa_fqj&h4UXL;o$UH5A8%1M&tc@*Wf1nbvy_&QV~sK8fhunu33l6Qm1D;27YL@bsY zxQ8~2&sDPIc|FSO`ycA%^=)zXKQ6D=uQkf+Xn7u)ycX?Li{+01UnKA@yz&Ak1j)PT>$giUqJ5%Su z!p9WX$zc|yIIj{fvQ^-vHYHcN=?jt)yb+%0iRVPg?vsxyY)ju4q4EY}Kubuc-NgU;B&Uf}x7(>1e6Smo>+IxQOy8 z7Pjau?9gs(s(_J+t<` z$9H1Uz9YkJ-_iE{*TtrNwOAnvU%$!tu#@k^qJ2Y9pRoGxj8ARxb1>J`V*ImgU-Ou? z?+TP0R{O3(9Lr{WzYGg+t>kkE-!tpKWB5)i`fnym4y%1`_8VB@=WU3zTea^BzGv1x z7vG6R`<_I}VYTlW#A$8%?@=t{xW%Wghl+~GiJ+3mcZgZVjvV>cn9H)DF85TN?66Lz5 zc56XA<6z(y<3=`zr5{i7eTpB^KfkpKf3xGqe+}=PEwiaS>{G6=*VOI%po~AxsnrKj)~C}stYXxsyU8Y(0;4Hke){K9pFU%ZHRw|rUYw|JeVS0C*QX3k zI-;mgM{*oTV-M@o^<>gZ_W1OP*~9wuIzx1DeHu1F=+iksUrnEWUnWjipI+WBPFSCM zsVc=`NB^z4`j8C5y(-6nwlbe0V27Q_dGqk?-DfLCY zK0S*;GwS2hC+y@m>Qgr|(ItC)`o!#EeHsVQbFUAsPY+x#^l2{MGSu{G@$=$@_37h3 z#R==v{b(*FV|_XrZXr#d=IjzDJU+eggE(P*I{iI9G1sSmVeqxrr`;1~DgDYrRekEu-gSdMU0zlH z`t;KZy*@4er<9H;j!!c=2w~Kxk1(8Q?D6RnvxoJm{l?JrX~$%tPrIKJ8o>76+NZ<` z>(e0!B9PXwJ`syGeJW5-czmit)9DWDQyeCsbi(>{iJiT-e4XT&mA!W+YIp%?4Cs2$ zG|*k32S87O8c;pLezd7R6=B^-RQ2gRj;v_{!{gIqct=_j7@s~(*)GSYAAx!*0L%GP zCN>VJ@A2uSSM>VSo-NKO&!0}f3;#N}VS8^nBI6o+eEP)fVSQT9i=u*$PXh{sKK+b` zkOr_m^?XL0us(gODi`b1U=*wA)4Jv2g!Snf{roBEFL8(U>18{8Iu!Ff`|;_)n_D}d z0WAZ)19~6yC1?lezo4*%x&bqo>J#nD6jgmX04dZ74C~XmSZ1sVj8C5?e5D;eU8!%BUE35 zhi}0k)XxPP0lES-5i}KaC+L1q*h1Za8BFzQJuGG2_!PN5T@KLGi3{t~Qp{5|aq;QX z&@ZJv{rQ$AE>fS`vp1l=_37AG_4>5pekmPM)Th(FHZX`sC@;W6V~|gum_e*hTOjM9 z=u_$pp-;!bn?t(6Bh;aA57G(iQ_W&=!upiDNSv@for4I4rcX1T7ALGv|51GvJVI^! z58pA@r~cZQu8vTC`cyQ%wR0ipY0#^nw?UggUx0oDHK2Ng{b*BtDgg9ERi6$)ulVcJ zsNZzr;?t)}iqWut?-^JTs<=pfYQ=_Ved|*?yeU45@8t($pijT@`Y~;S$@(-H#;u7y zF@sp2?tldsiar(07W%XgmY1ea7j6(ItWParkkB30r!U?YC#+AWtAiDfPg_-mWPSQj zor1AG_5Y6ZnCsI-SSNPl)7Dw7ojXB)fNDX>sBdS`v7r8-u!Xt-Gnnerl>p?Z>eFh# zm%lzG!-uYki%*{hjg$Vp3*OMgMe5VP?xTv;w>}-VO|MTE#bSJV90RY8L99>Z@K0+D z@{Lc-Al9dTuWJmlok6XiBlKygssTJcm8gos`t-v`I(?e?vQD4ekBAf2r%S~sBxX=! z)xnDOsk1N(&GqSwyY2NU4fQ(_lnFW?GzxSr=oXM0)PU*{_M=VpsU7?^QPrm#0BkyO zVSDdwxQjG#@#$01cXE7c2IrFB__U4ZF7>TX7s4~`8=v0xNa={8y_XI5vyMTmPmf}o zRgFPDePRZ&KK-yvW00*rwJ#F-wBS*p8>~;0;RDg^y?Y)LCp zsVxQ?y2Insw1wh?^=Y3CdH(&-+ zeOkv8NNv4QvtKf(yw{pAKcDt8aZ8|Dj%=R%mD& zMSa?jN9Y*D`g9Hguo{DW`os)keYy|R+)(VjabBTM7cLbV!1`1P_G|j&nJ-RQpMF#w z4XjURVD3Z7Sf5(z?Y+UOLb5(}5(;UqPa6P?cJ|)Jd99tFgMI-04ypmQLY)r-9Sv$g z^$7dXtWR>kj9~k-XLV1aUAAgG!@FC()L|&EDSbeH{J-Rnw!fd)%rdU918-!>n^*F- zezek&HrwF+{cN}OQ}JKj&+q?9d8D5fn{sOM6zluE5hLyI8HcS$X&X}Nz4*d}WpU+4 z@K&U9TTQm1Z`Qndf&p!UpBVMmu055aJzIV4 zfsa^g4;{<)(6MX}9n1FMSZmKeQOuj5r$7rq?}0u6)n9woJjDI;0)9mQd;#}>Y|s02 zthQ%09jonGPRD9{p2M-$p6MvY1G*7(HE1E|Nl^W@XTihVo+I#%0r0*`CEK?H>l&i2e;c1QYu|80HzR4^q~(F_dj~;fllDFQht$7>ShVkM zta}LTzdx|DGLrVq$M~X)wlRKg$4F$-zQj1$f2sGyp#Kt=n6>X~uriYNy^5K!fBW_W zsZH9~Ns;|G?A{o(Z}J4Q_B|3||9$dmVEek6w{P(T*?;3;-bG#iiYJ=2Z}_ap`tSEw z0^4^QklLjG$~w#T&4D=@_4X~xH*4SNY}M4=en~ND-{|$G?MpvIwr|NjQEMOhZzr&& zIpJNkef-V0BVl~H*LKQ9`~@3O_r^hcz zJ{CSRJ_f1(uaKU))Ss4nhEo3Rz_GfNe*_}|tu(RcPuDt@-~8&(>i;&D?$xFKXWnd8 zKHh=R$qR(>fEu`c!h!IJ;R`d?GW@-H42TK&5Lyy{Z_N!Nx} z{yPAVx|IJ01`TuhH}Yq6SmopUvNZp7)od7gD#4I9HxYX{*O2!gU*rbM-0Kr*SNl~o zAI4`X*LC9CD{$KfNrz(+iJRU`3LnpN7UlLu5wshr_}=Ak?774x2AyRNZ~L!? zuc-(Z#*|-QVGQ(_uj7Ex*CFm0@Jn4^fzdIJ2W{OT zqS;4c^la4kecy%NkdaOUd1+>MjOg?YUMvmaFG=IG(iy$@T3*eD%v13N9NX1h#_vNn zm9Mv)b@qa`J|~q~n_bhyf5|Dm{xr#t4){pFU4M|3VIuN!JIr|HpsD{P`>Ja);>u7e@!Q|3;W@F>Zfz zSUckR7fug&{*Q<|MDzJrJ>xI`%Qg8cgSq3^|68WT{P|zP(IMLZXdwST86WfKw}Oa^ z=a(5=dn|ujrpEmFHHb2Z=a<7};>Z8{$He^k%_hm`?B{L#brTUS zaemQnD1ypS=H8-CM0SnB_DT3kCGC=qH6`cKW=b@W^>WZh8U1zxcU5>?ayRhwpMBN2 zKv$iy#_HhRymaMNtku-!MOtD}9V$oJT_~&b5pSFXCepU&)p#%0z3XhO>BCaxzA1OT zB6d|uS#ihE^|X9vZYTVJ<=7fMWp%u}I=`@sIOC1dYp{(HPBCTRH8HKxuF}k2XdpH8 zYAT97fGMlny7%@k>@Cl7X|etU_j- zyLy1H4%o`cSBE6zD!-g0D-)GXbnh8gaHj6;+JZs4vq=TV>&^=4;O!Yld27KPh%Go$ei2Fqe@GT_mW6Cc*Ib;PB2tpn<6bY3 z63$OLBTgY@vN%&Y-bS3MYl9ZNvJQLuy^DQl(O(5P{s6~!g1!R%1^OA(7WW*jTE(>z zfAQ+C{-;^1gjUVf3oTl;YT2q)qR$rn|9GVOd+Uy074Z5rFn*m;o@A>x-~6XVy`jZOGrTDf3 z`s!WK033VqdnRZR=nc^Gpie7R`~V3*H9hCuM_mu@!4No9mcO)urP;L!|VzXzt()j`1LS;r18^af595s)i~|1 zJ|DJro`$}1gQ`Ag?K}s+EkKum3PIO^?gcgBS3Tp`N7)UIU(4Xx^vACQh|Zee*Q|U5 zvUvXJ0`3aHh_?OJ!&n{0uSxpq`0$IX!}zrVeyXtWYt|OVuaWp^!Y`ipHR}1}Z<|{? z_kY^jc?SCHbsQ(*cLUBlP^jH*B=(`0$IXBm7@lbwb21$2Q^r`lboL4hsL**YJO#uiga>z_Ay< zXMz@i-T*xh`V`cJUlHLKN8rPXKQ6)>WB&eod>EuY-#B&>InarzB)eq;_3+h*Cnz#62JJPEY|VIHD$v8g&)=aDlz)M46#4^ z_+yD7{#cS5Z-_r8AlPOZf24={;*TYnIMu};6D;G8C5HGTo%!OAbmogc(wQ&*NN2wI zBc0jAAE{ls_@g0^TF>#vKHtIrg}!ows=kH)3%@Numw*aE*MRN?HQ`r1%E!ChJ%0dH$GwT_AqVn5_d0-~6#` zqO`x>J4XUWwDIdH%&2v6D*RvAp~M8gxH`iBrBx?H{Bry*{9nH{;g_ZVs}b2>H~b3! z7y9a5&;T5J@p~p{5$Fxj^Po>bP54#M`1Nz&2DiT^<24i=Uu>nK&|k0PI0?TSaNZfeCxVUx z<${{0 zuq75njG@;Uapy#omZELAJX~B&S&^GQcMEU9JP23%uNm)gRTa5*<8?>0!ZCpx_AvsK z{Bm`{gb72bsCW3nW@J3n>#Eo=ta(*$Z*~Q?5A$SKl%Gl8NvTv81*GZeOT+t#S1N^C znzm{=-L*8{Jn%oWue*9mK{Cn{Z<3BI>_}f*sZ<7YPTD=X#Rk`bxbg)2cg)K^P?Wt- z%Q&{6ot80!((QLpy8UtUT>Fb$d-27=eb_G`5vilFjr;sEJOoyl;5!w+P$8b@6Am{%_`k%I_04F+~T|{Y{pQj?k)KYEPndp zOr_FO7Fm!^Thdo5hw}y65aCELMC=2%BWD6yr)JJo=81>Uc9WILo3Pv|;j~VU+fNWh zd^u7Ij8!$WL>J zcsgvBlpwC)KD}|7)SOORv`kD&ice~ll+-#rt^VIht-c==20pEcOCo$)fFJ7OTT&Ss zG<@2ME+-ISe7ai&9>%9)%*f~tZ69zs#ik(jE@#*}tL&B$Ky(KuOpFTR)51-!V3-3CVB#HY@D!4{u}i-!n&`ngR2K7E1l)*hb{MF|3*E^e0O z>X?Mx)Jm+=p9fKKE)cJV4ITtw7Ipwr@cuG4H`aWsdf$H)4%Z6 z3IPw}(~0PLI$?aePMw}HKAkSg5cX3q72p`3)~cAs_S0y%l&Ap4rve1j=!Eg^NR;HExG(eOf@agZCNzRWz zzkqrsCONm`HvzvRKu3UFpthhvpwXZve2O(bEly#4nv5T^pSoZj6QDuEr#?pr++chf z+d`Z$K0SzjB}8F-sv0Iv7@umoixZyTjY<$Fj8FUFaiKhnPahsBP8gr|cM>OzPklsb zCirx6YF+WEd2>H}szSvCu2}n@HV32$#HXcNnsD*yCeGPd@Tt|wVd2vo&4S_6V9e}8 zu%C8aAo1x+S)|0LT)tq7PhY^7fQJZtns{OWJ{_W!X@yS@h!O-oJ(Qf}ydE?U^Z{r( zXbI>K&}z_5&}*Qrp#7jGe2O(b4Q0PdniOtDF6_89sM| zfBfHk!QOs)G$2hNKHaLN2^XJEXnW(0~r-5ygoNYkIgRTR00}TV+2f7?I z7nBQ{0(uXRRVXV?7biff3gtbXH~tBv`csYM zP2-qdg|fSq6g-;gjT2XOk-QNc$wMFy!My5Hmm(v170Nm^Od!=%isV%&uki&!s!l6= zBb_%}8SfdEjTn}~F)XD#hr)RkN)aa{K7Xnd55R=%o@})TfwHb6ymE;E;)l34Zb4$=Bg0UyREqh@#R&_ zUPm#$5z2)v1%@GeRx&;uhoB*StVzi!&aT48nkv*7-)gK%CJd`kn#(c^I6zmSRKZKY zBNojw5q_o5&utwsAstUtq+&yMXSP8iR2^YREYJo^%{9iQbD4xUYn_rtTx_(BMH){hg0fM>0= zN7M<=-UoPywlx|&8;bsdH5L}0HRER3;@KQ9ifpnVc=j8FO5oY64q^@Um5OIi@CEdV zC7yK`&mfbmLRoz{pvZ`4qqHI|@oYPzIoV{4XB`JiJbUf%B}s*d(~AuTXMVr9mccnnc{@;Y>cp| zgnf3(UIAf@XAh{T#dy~FG?9n#>}2(X@hl6oDgs2tvuhwZI5Dx$E|PN0>#D-Rv-!KL zpc0ss6sY#u489Nop5<}E5b&&*_J}&+*{^?54e2?J2G0(M$rvu49m~zI#k1Gp`Lc$OocA@FP@EG<7go2eCPiDzv@5fabNI!WT$>?4z$7lR5w zZ-A}=-2>VNdI9ta=uyx*(9fVIJgYxEn{^!HSq^>(&pu0LDADGdXG1y(XL!Du3IU@N z#noMMylm6-!*jd^0yS$$1=T z7-%kNAn07j;a$Ns6qv)kM0@aztB zuZCwX6~Y+LM*Xd`&mP5c07}MqcHA%G4&&J{H5udC4e-cPGPcjo!Ptot6Fhqy7+AOY z=7c?zQ)i!D!WTlovvf`v0-m+h9#JPe+gL5z)@bnT4+LYv#j`kWhOK=TmmCtFeUGtJ z;MqSRDhB)PF}`4jXOClIq501q!BoHx&o0%9w8XPZMG+Fuo+nUb|5=ZJBsu?1OLDfy zZyu;6s1N9NP!?zsXfWtX&|RP=JgYxE>)w~~tTJ8TS#ucGfD#SQF4Ws+a#qRq*-p5! z2!Yr>drJ)gFrIy=Vj$aRGu3G+hSC&fsQ74wo;KgAGUqQ zIdyne$`?YwvnRA?28jn0YLBQBo}HvUr_tcqpI9{-E}l*LS;ZdfctGFK;sI^{EAgz0 zEK{@3_<|jteWZ^ETnuFL!?TS)Nr<$>vw6mNz?bl;2t505Z^QsVJ3z%1L!M1X8L*bvz9~%Tx2F6gy7UMJ zOEz5i`?yDAA5HhPRLAsA^rlyh(iuKc{xn|d-(T?-o2eMCFi6=}kk|X$)Mvx*Rcd|q z!vOHB&li}WTG!_itQUxSeR98*_30rOKKl4G4Z2`mpIgAtsMqHP*ukQ|Zo&dOKmHsF zs?Q(pxnn~+r#^qU=L_C5<`45c*Xv5e$|U#nnxtDV#?Xt`OO~FJ55m5f()hm-zmXp}EL+tCYk=npytlmW^Doe#PQG#WG&G!Aqf=q8Y@VPJ7n zvlk}B(Y69LN?vnFkHokJawgL$eLENH)o zcW{TUUc*BgxnO8k`8=-T!_$s}R$f=NdrE?%@E=MAKmsW}83SN6dNT*)C>O#IaIYtu z(vv~oaNdx4s-ygRhKgQToK%ytBC{_&(wmzw!W);P490R3_*eMh1;;>wSt(z2^jf+uGHlBbj;BA;jYAY9)t^i+IzP}gP)Q4Hxa^V5`H zT{*r>V6Ep@vtx;icKrGbQD!5*Qejhs!>=SP;X3&EwHbmOC|@n*S`AD2dH@!MkzZ99 zslwscH*lsNeEj<5D>HsMc*I z{kNF$YbLL{u+zscKJ%Ba|G;Mw4!`;wlz1;R&)@!9ur-)`y?_XcQNEV!43A$24odv` z)D*v#eiMvemyz4kppOMR!sFM+a9kXG_|*fRqd>e*{~{Q_PTu6NkHg@I3`ZZIz?jm= z`IU_MqnN+{2yljYD6g{Okvof~L&x*$NHt0t509**m_D|rs}yudb4GbaZjXoPf2qW9)$#AAHZvnQ5JGmp_-VSC%Ed( zN}IiQG*0jmO^ti)P~`x-w+KiNQ?IPR)T1{g!MP_RO}*MD0pgCSWafbWYw+?E-klO} z;?yW_`AkW)FpDzMa}sGv>&;Ba@wOI6X*70I4JjZ)kG=upJzb;YjnF1}d?G3!k4x~H zb560VDn~hjLu+ZY!(okb3BTk8{^8Xe!8lZ3_f*WbPhjg4?*^H2G&H<_<_%jqj!PF6>ONh1DpDVrGx)cnb_qrKz?r*|i17>(0(D=&C!rq2LhR*?EO6 zake3&@6F69)VUw508JyJHdha6LLX)#b^h;@_jiwEI8^2$0xR7AdU;RqIZ+x|-Vebf zMofI9yl;S~EKuH0r>LK)yze?hb7h1l?=xV3NV(qH)+ggGR6t%YCD~_r?*qwquUF;$ zSPnYb%KH#T#~||lEyC!s^+tK`1+x@!d!2Y{@~)7pj|Dv1@}9ZjcBwv&Fl{{+N%KP~M8X>S|qn?WIlQpx~e|R_*ZZ`{gf0hDDF_HHX7%C4^ zd>=+pY{)yweIUNiM&Lv>3L9A7`(V-{5l)yEKcU8f@_sqJ?`w+hbKa9BgemV&VDy%9 zU5zCZ^7v|0Kpy{0vd{8<9wc9r_gx$5nYQwN1t2A;yg$X|nAtPuVnSmf@7JQ_*vR{p zUmmpb{?W%m-Y;b&_s91qSw_%b?A~ffd_SGtm3n;N4MQMM-fyV3lJ~Wxb(Hs4FnUY5 zPJ|&Xj|))&dHgrYKFj;%kbF(vb5;eF_etz+4r0$Faye%5J_^WhA@6^D7%O?d2}9*U zitlayE#!T%sr~*`qp{!5`%X%$wBK966&NV*GiVSu#rGv>sT%qS&z@QRwNI`)VKypd zoTfbTxFsGdo69ki_lcj&>;d!De(%Ie-tYMIpp|zo z)_jsZ(+Bf>pFMMe>YwS3)ek;{+hSe2)xfhYXar}af5x+pz_b*euMlYFl{3L&srhP3Y+RQ|QVinMnQgWKFh{%N^}sl7805M4L< z$LKEQJPklBj~BvHk;fhJSXKTpDroq>V|j4-haneK{vYFVOywU&yaoQB0ELgveAZn4 zF~>gm@jqJ(l8To-Wd8C$R?g3Oe%qk(k1)QFUQPbtMmLdvXob1_KcxA*$)6LB{ez)V z%6Zye-|<3NF7kRuied5mb_UN^Rs7$NlVJ7_47;H6{|1+1D*u~g_5l393BiI`%0Fy_ zgJ1q9q7{VyKY)*c_Rl}xQv0vr<$rU4{KKtoBLC0|bNTOx@w#sKkBm~z)5wnlezE-z z%S9e{q?neFf1bap@_)sfD*vqKyYpe#1(pAfT#l*yZ;;sowA|FN&D{nzmF|B;kl4gXPd6ZwZ$n9Kh|{B{+|P`LPyfnLfvE!dF93t_p) z4ze<`^9!>|h~|9M=Fsr*C8E$pAwFll3n|L~t3ocK@g{L2A@IJt0_#Pp`7IWD;iX!A;e}pT;TK+pvrVJE@KVr!%Xm*-O))+q ziZ@!6vwRjQthj%YTLxFl*n7dcjkx1OxSCQTGSEO(0WMQ!I=(?DEsh7}D$l(_BJ9LE zCinCzM?p)}WkY6qT=|)5;tV8y6OJ;+b)Pz#t>fpvgvpS=NqS8(ogRJ_Kb$6s^xAJX z6jGWwh;pf=>|;Hw#v4HFC0du@&^crxJoNclXa^`IvBkGe3_&;{+i?7RiER#Z z`Fy@aR-Q%~DW5|zOI2+z6Mmix6G+PE$LJ4@pDh3%cKmz_iT&iWHT*$-^7$?se%A7N z8G%?s^7B%jNtpAKf);`D*}2A!pEbf^&GI=z(|yS23Jjxm{LDpSKYluSC?)p%#77UR@TzHC|4rjzZWZU%Ae>aCT>FcxE{Wg2d62A9-b4^WRdT@N zi*ywqO~~v8##GU#53u8Z72bHw^*To=izWC{o6k-u$*!6GeJyenWmj)-?GYIhDWf+x z(Hl>>iu0=J*);ke4{gp-rVIU;yJmVzt|UhME^2~SNbn}Yd^F-?uPOw5lAY?U-yrO$ z7FIqZQ|VA1;iEpF`^Ix~{@sg7k8heL`L`QpTB!URBf+*V{QCt0nxmY?a}K8&|283k z1^-^btp?}cE)JYi)AjOq^6Jp}*Ij~ZUHJDBv^7WBzn0b9jDH>^u;AYfxYgkN>-vV7 z{GGBSbpDk|Fs%#!CSa(@QQiSuVAwI^-`PlD!M{GZ)!_USwynSXor$guReu)?;SnGZ zHvT=!_{TGMQ~tF=0t^2AhE8s9{)s@4KmS%e6*~XM2;r$4|9*Lf@egoeA%B~Yz=D6T z;8y+ckNq1MwrZ5C;lG>Un9!PzlOQ;Txj0Qdef|zk-~2aU`hS-PPk+ZoU-};K(FQBO z1;A6*=SToSu=M9c9A)}t4~3BaVPE>qWaj976DI8~R($E(>7wB2U%>=XrvJJkc>0%NearMyY1(JXA9qEX2lf-$T)lFYqQxZb z2_9EPsjCc@k)zbLgMK!+YGG|vc=9T}u1dFp&s$Zxr&qR2x$Ae_#HS3gYfsvoBqzNF zSEVeI;k$yi#jdg(y0i{>Qsg>No>H7$hPTkFl*y0qg?V`git=jN3KV$@I4^V_dDW!1 z!AvW1?ML3cGPWxZfmMSG^IZGslZcZ=#=)EshA=X!=|0Ddq{vl+jA|`2dD%5Z z*|p^ZMaKBR+71V|id_4AwQT{L3m4|)?L%!-R=8?ao8lZ=ScTSPzpcll6LGcFwUzi* z>e@y>;z>yzrXUhwtBL+(OYL# z%6-eQLl)i$Ec4`T^}2R=T-$KfJr%DE;$l^4W*T{(%DdBUzE#R6Kq~a(Y`ho& zQM>#j*pxpDkE0?!X2%#YdpPRho;Ju)(2=)lx^AN|%JKGGa-w@rI^K&T<9+~(jDoEA zN}4AZMzylRkxr+%gZTZTDo>7BR<$nCvEYZ<_L>y3raeyK3+2 z^{vz6b=J3s?~?kqpL>JkO4GMK@MRnH?OUY5g#dk9%Xtm@cJh6cRHtt}F_;ACTahLL zn!erlAf?mk+mOfjf>Gbj53KD;KT$fJzDOIZMMBoM zTgXNVLEp|pIvag!_JFCreF3b}^sNiGBv$%1VlKXe0vdQHbWHuFVzv)4Di z{RK!i=v($ze8H%1V>zRtwiDo!GU(f}JUm;EZ`booki1M3BCyi8zhOKGzJxlyoq(2x ztZyGu{3`@~TS9>e>+x+B%n6h6?d~UZ`qrCU5-WXMSA>0_LC<@jV<7sKG#SScihYA+ zH_^927!vBJZ&U7(`nKj?DOcL~_A2~K27Q~nlP?75+Z@ho(6^UhtQqvJa3x2%{;A>uCq_GG)j+O7d$81(HDL}~2Cw_|?{Wqf;Kf#gf5`gSwSf{^uX zEt(sOzAZvJ8-449sgsGmy$u!9#BXV3^_Px`%5dIb3KQXj zP4sOeY_~e$#pU7{|9gvjb{NaT0^R?PHVHdVE{&Rprlie4DR5DO7#Coou^M=Wlns z7Mi|YigY&m_R$PeeY*hOAx+=jn-xoadwPD7^IOne3!q~l`jwP};|RsR!Lpm^+eiRc z9rbPGLaA?0zZxLHpTKA{=-YyC`9grcjpw`ueS06qnnB+dLSO>)tv6>h=vyKTCxgB% zgvT#ne5-=?`dPnak5W3_{B0^LsuCqe0&?cu>{ZlP6(1 z6rgVugY>Iy(OOEU)3^5k?soR13vd!#-&VXUpA@RTo$_fI`Zf)f3`O5YAf1iA^}&K4 z6MfqQZ@s2(73sc&1| zQm!<6@&pLALEoxx;|l@$_88|i=-Yx@DXGpsxzNKGjPtjvIHN(|F4#cn^!kP`gY>o zB*D7zZ386KY)XcHD6c`^j(C8Q>c+Q0n5qTXlk+*FVSL+((ZQf^*C2cxFuq;H84dc@$$$QqDHPB$ z-hC2$48irS0*?PS)AlN zALZ4AWzBy=WnYx zuR-5F!6k#feKC_S812c~oYA0f^D$T(^ld87%lyW-tiamRzFUUzZ6Js1t;e@^s8Miz z`*wP``gR%lE<*KBD)0t{qHk-E&PLx}f-ly@p6mz%)7Tjr7^=M2zs&qBx4 zUpgkL#Ce2b-(cBI^ljy|I_q2Yi&Ed#Pm*$_&EKxRjwD#8Z&%;T7Xs#QMV!~5Z>JYi zQr-AA@&&$N)VK3Fqe0)Av!d$eZ+Bspe!%#4SYT}j@rbIMzg@|ZJZpWsNZMDn@qnc_ zNWO$>Pj-4H41Md1#G&Y0E2Oj0w_K>BiM}m*Ri|%1T(9CwOy+OPpHFiB272fP=opB8 zC5^#xgDFge4_5W9ec<=wQXrTrUgOP|L|!FWqZ|h@WP6CE>JO}?Qwm_!V=dwI{%ZxE7XeA?FwIc;y{a(KT=9fzTa z366X%alZ3d6hY-E&jM@R>)Yd<*2$oWyvZ3Be|m3G!2+xFs@%WCdGLRFRm)p5A%(T6 za}$@+x8JMr!u`C=PDOF}3IU&t_hxn)?};nNp7(SQXE;g0B4lqyr$zMYQJg22Hcq3L zZN<)M@4lSm+zi?W`cD0&W1epZE;W3J+zs6woiGP2+ zvc|N(MjkKw>n}{!P5SGb0^9yt`Ohfz*Uczs7U*TreD#-(i5>%4GCaZ?*8TPBvu6EO zD%V5!^sD{K2>WXp#wP#%I?YeXo&ht z$3*9XBJ38+?AHC&?m@Hu8Vb4h)30$*#EA6EfzZEyf1US^X@7N^B>QXOU8enY8)k+) zSuw}MPOn9&zdl=rbts@D6!^RPOUFbtIJabYgg31F>!hd6`s;}a0sZy*>k;->4m8=n zzn;LLXfl2|PL}<(6B92J{rUiwpG|*lTpp$Va-*OHptnFzs=sthv=kI!w^(Mk?yu#T zQw5G+W&BnG=E*)hOn~7Vk$x>EV^e-DS+zHQ!=Px=Uu6Sif1L=&lu3Vef&FaLUsGO> zQh)VFK|?{;fzDTd>6mB~$dcg^-mvbk#3#-A>q&Qjeq9J>T}1s=iO8>if1Qp&(WJl9 z(qwa!Cw^(Mk?yu(3AHi=DOM8Bz zod5asYYApm5%t$lEQ|E-uX`{kn)O$@?61$UoXe!Y-U43R=-1YgDD~IjgNp1MzSO*yLw#R3WewQGYFXBCx-{#h_@?UzJD8{yGNkJd^%P zy4JS8ir$P;f1QDXazM9%u26sJm}nv>!fvt5Zrxv#t}yGb%~uEX*Dy?XBkHd*yprUv zUwtqrn)Fxtjk3QAq5dZQb=ftx{Wa*VDD~H$tMDEU3hN025^*HEU5|e|?NW(WJl1PLloAfxXlL{-}Ld z+4k4NtE1Fk7oeaqR2XQI`b)<|w}WETUAp)2@m_9?GL+8n-&-(#zc|Scw-D@nb?JK_WK6p92@;bri?_b^xMZWUdVChIW_1iT% zu)HlWfn|Hk!)$M5ZeV%)#`(${b#Zw0OM(^b-`;OfhOFNxg!IE{@5Q`G#n>Nv;I5G6 zO@;1-Q{HS=YGZj{UG6LIA3(uy%1g})Z0}a6uB_j_`QerKE4$;2_4@$!mMrhHk>QnB zJ0`Gxk3c46c^kr%=U*=jEbmr$?qqo`3_YRo4-WLwp=pWiv&RQ}d%-{Nm=H%V{nse7 zVLMoqqUoz${$s4ABBcDc7Do2`s}XdIr2ao$5Ly1+4@8##XgHW6ssE3+Mwb6Q#9AVG z{y(9Wk>n=_b|m?SSfiY3Z_xLEA;Io71F(NYjnWN+xo_?zb}g$>dSYLMeds#-hn~}%GU?CM3G-BCY$r?M!3Z-`8DBQ3x0hEw}U^w$j+`O zex1u!zQ25}$Gay{ldn4`ne%HB^wg4Hr@%Zgm9NJMG5zH0oAc_8U(KNuf%5e<8<%o! z8zFvO#E$PkeS8OT4NHEthWTa6ue;H~{`~s$%zEQjg~4|t@qXNrD9YEdSe{~rUyne9 zEcx|yu?4@f#>!ki{OSee<&vWLaW`|kAAP5pd_BXXKwaevpB2=PkJnn@{hOD_mYd-H zOHeyg`8w`gnajtojp+1x;@1qAmxVn0Wb{PF$__?GLA_kR3pWr6pzwU(RkYd9}rF|ogT3=ibj(NafauaEDa zZ6;qAo*zYiePw}P*9?^{H{sXekb6^o{L{q#x(UKqPxAFFTc-ZY9f?sU-MgB^!D^Z)KO;M}0b2PRB)O$B|`J~gK{uKG-DWcArLxN-64 z+(uTPw@-;Cf5i8p#IDJoBcQAEm9f0*?=ON&#O{9582kI3VT9S`Uv;|u{aS^)0rl^QfSTR?&Qt8~_sFonKg{T>4S4>aFikC<&%W}!@%HyS(=5%reVpG*o;;iT zi>&*X^Pd8ww97xi=nL1kkMoz@W1s&avTE(>2Pc-@{ikSTw#mQVT0XgcHzT5DmLKEk z-$g>4{6%I5s4+Fcjn zb(T_B6&WtrMx26T#o1M!?6Ts#9V5h++^|NRxynFtkLQ=&$Lf3e5NM_w{ zj-*mk<|@eUo?h*^{cxm6Ssm}LPAyEqg>lpEU!0lJ3#$xCvOPt@SH;SNgl!+{ zneF650?FVH^Tcd z?B92Q-{$>$3_JmisehNu3Zs9^*dWvQZ#)FsR)0$(*58f{8lBwLafNXosteJth8M)7 zf5-Hb{ks&w)JXf6d|?*)d+123{&m5!YfSxH1Uv~@e;p@Nfft*4%ra+Ec_>kzPHa&-Y5`KMvi8aQ9@_GiS%>BOrIBK`eQ;! zZ*D&f85M?n{>|<}y?i3@Z;wBr+YecNAY7{buuEq@Jj5{rqkQg!Z%LC+EpdJ|6+z`F zy%0r=6n|(fga!Vz8(<}$@39IC`AlmB_QNx97l({L9ofBE&;47%F%A`u>fg{a~fPUovPI`}Y|5CrtWx zaevvr6SE`lUmN@3Gl-A5ec1e@#?`;mu;w7-{#}#a0R8*-1bV2ke_e=TnDp=DOxeG8 zV}OrTe{K3V{S2%AJqF0#F#4;v9|~C~5-=6@WSF2xfc@YKGku3J)9+;9x37=8B2j!_ z-i?n?!4*&=_t2;zzr#Gt$9)bn-_(|m)cGyeFJi4>m2wUSXR+Qppcvu^J}D3PL*dc+ zuYcc8S_BiONq0gK93DDxL&D>gFW@ee;-;p|FQd#FKwp($@yJK|)Cm zEbHvo1jDIcdv42#pgk+$D)nzq3zPQD`dPLoC(F>DrAJeH=J0?Rh4#3rO#4^YF~{bw zNrWD&rrO8oeAzb@a4Q?z(pxzN%d%zP~Wky4p+n{)nXhy-eyq z?RL}pKio#vf9;vkt$!l;Uw9-w7U#`N_OyiucwV-%C<_*4qSw{llbO70Avo^MZl9a7 zBF~9MyXuGKAlb?=HPjubo@A!GgkGWhvVGlG)!f&8y{``JzT0loHD61d|H66He3YZC za~Yez&gmCSHfT<0Cx-s4J3ltUOCXlw2I5R8{OE>vTKvWNIxM=@#M#G>$s;8{mZKB& z;v5@(^w7x%zNqaS?=h8-5N0P1z)CFE@QyG#CVO1?l&oV;7FPK9R90819G5eA}xJL^7cb?XD81{!CC1Y9B@GT@&XxOa8-F+ zWyRS$a`_ve^iqN|NBI)Y1k5kyu9-0eBP|w5xc8P_Gg$Job-?12?8(LmdM+eI5O>h&N$ZJj~z#7Zzo4oqz|C_v0d?i$TEivFLorQ_7W!(+( zS`rGrjyQqy#6Vt0h}s0mYk*J55?_f0(ZJUN)?=d!VjbMZCi2?7rIgoJyxOWsUajqc zh~+i?i16k0>0Yst*QdL2$&El>*K_pSD6j3{1~-w{>LaDRUNVTP|Gz7*e_(|5Po?=IR!98~ zj~x4F`9t9Uxc<9Y_&cGWbe*&L=K+C)TKbX7n%vUhm%6s)1ga(cL- z);QseqD5WVJ5uHx5IRM(maO)k;k3fb8_#d0SGjj#2|cM=vs*`FF*N_v`=RT^euyx6<`L>z-f# zCz|v>d-eVLKPgK6&v9zM{)gMxr2iK**ZRK?J>0DS6Vd;m7HH++pt|;FxcU70|AiKf zxBruL{VzgZM*K(B1Mr{S_PjSrpzcu$M z929Op)-^r%f2{56VCDPlZ(iRXpECCobzqk((|OASpNqBw4dyG!1ZG) z)xvZjD?RaCuwIQ<#_RmDrw%vt9$V@2#^`!aOPoKMilB0oPmiZe)O+OF_Ga}G@Bd}? z&6z*}bnm@XBhC8JmYjcw5hq-`-l{)UeUN(Ig+lS9rNo___j4^_wlRy#gbo7 z{i9C&+S~Tv=hrq4Z5#P@{N<+na^y&U-I!*^uaeAu_VVTEdGPaV>6wB0xEE0z6ZzVB ziR4$tadqNXn-+ACPV~BVadx$G6Ba4b?=vtoc}I_wx%UAR>C%iiS}pPs zhaeL?0MO|*wFN!!|3E<(%CKWCj(MSj6EI4sT9rPbgA364U1 zdnno4mR}-E_BhMw#dzh2+COVCxreABGMqRsTD{??2whLD}DD^U*@+-$UZh^H9K{XUXLEfu6VzlqVRQ zSv`K2%*|bTR!{H+K_(vJ)B#rD#7zy0XCC0XO@0b@a#sIh>DJjeo=NiZD5oxanjbn_ zMLwqF4ou1273wFlZ~)VgM1yX@Jl>U_$3KITvBsiu=mOoCy}Qipo#KG3>d32Vw_pf; z19Lc$;dGDFq&VHrm-)_1O1Bp98!1HGSZd>xTSv{VQE+_M3lq{VPFxR34lJp&$hK@7$fuhaF>1*Wn`qisBp#kZC<#h!B_wgih|8zaUsjPHog|K&f`=*s@Ol=2 z`nEq0j<2eqHJq&pYHt{ezkDW?t6x%Q@xaJ0sX)V_t8|uy0`uYP!I@4Ssr}$nfldMK zL@%O&65)qFK}XZ5O7#y>q2+iayyx+X2YkUkGI2u9K>c!ec&_6+DtKrb_GtY9<@t2<}9d^B!B-L03Pi^$AZY=VA|yvv~#6+(8?i^ zH^G&^&xtJbg*TR%VOwEN!Rq|-qkM~fKG%bt*-4VWA~Fln0QCsGOo*`akkdi$0XFrG zgFK@9su1i-*+gv^F5;Ufz6*#&p1KFlf5VAG%YVi3L(G5j(DHx!6GO{?PDz&h6F`$< z&}1CwQ-tS2Jg0Yfs?#R1T(O5vPA?gH?V(^KQ(O4!FYhcaY9)Riw*c!@ViLWV_gdz`SjysSbtZX zWBGQ6IvvhaYvL8zVe0m&TTw!{$`{>#&1Ki11rm*HEbN7l$zPd~|B`h6V1M}$&jK0x zIl2G@OYe0*IZjQ*z1t`bD>Q}M^txyP= zI#5Lsmj^v;pOstM*bA?0M3wdp9pAVI->W4m-Wy*xM`WUlZ%!t@_1MPsp75e~7SH<*eC}bc zDey`$*MK9e4}5!SKF9820Jlb2Q+d1;LW&pU*FNs^b=<-R=2{oK_Wd&Mkhg^m?L) z?AOy%K;uN%??XZ_;jh@^42FXR2WGL1K723q>%m^Oz2&#q6SB3JBX~$8H2A_`(1(4f zpUJWoh#&Px5r$|9_f|me1xq-Ubx>%9Tg6Od_*y2nj$3YqQ8$i9*{kOQ?C>)hjBb8W#xqMEkvd>+bS8xtpyvWm=mvAb8RfWwSts|=1qKDa`apv=uq^LD(xLrCqO)6`H-ceiAN~T{h3PE*Q zND?gBAdTos6#_P@KqOto;DFbFlgm&Zi;sLY)u@)nMEA}YfJGbB)mGEEufe>>0!>{Y zR^wLF<68iy2x0yzM=dze0SPNiv?-pBa?8z!rHORZa1W8bg?dwmvgVsz#Jbh%@NAeC zhgy%4;Tvv)1ZEnyyo`hS4vG~*YOQZQ0tP&$iX9?1n_<;+vgnGfzXjq8(AU2*7U2my zmtYo;SWjyooZZU&kP5hu!e1*4Pa)T74If}S%;5D8;>F=l$|H1yze4RdUT8-KJr!-+ zBZJn~bo783y*zr&F3mB*qi>Q&&&Llk=5|9CC4K_1hE12{>_#TdsX6#4oO*p$PW^1D zhd=sq>V>elIW~k-7fO|F6n^s#S%`HUtv!3-)#u>MHoST#P!wMMT2@|tQf~#)1!`+h z(Gk9RGfYKOTyEWr@#^rI;nv!kE}@u*VJE%gq1ZZ9-j`v|bg?7sa2sdNf*CvuxKeB5~(YJ^Q1nn3qpc&%s&kEm5#|gv`rMiFB>x_DQiG8C_6NRda`(XhXF)q_p6nhV6K&oHN!A-GLFftU~?quVjXz3^@ql%Jn;j#Wsw!s@5=O zSsf3QqIW`W<8}jET#2#WgNY@_G zgBf5cntgkPYH8Qao`f%t5Da+n=^e4x5%g_aGX?J@Jh`UX4mZb=I8T4oBgIUEK&^TZ zv&hb7E3{ImR1$vB3a`-32Tvwu=8m<(_hJ*HJ-s0?KGX&RgqzjtaE93(_AWal6p7;; zmR0H*B$6Z$?j+Lq&`M@rq4Hp8X;Lk*YUaE#AWeVkp3lKXyqVxdQ$@p%E3ob?%>ry{Yx@%e>(r|&*|<8wFS)*#z| z*7)38e*<)vTNZy%{)V0)^_o5U8=$QhEPkK-4adf60={ZeO&nrbyqPeD;i%CksJ6sh zZ|0mMBK{@f$~+JJ4_2qCDK{!Z>IeEyBp97Y9j$eQ~0 z(|_-I{*C7^??_a2RMK^{(fT4b|Lc%Wx%zo4O9Ys63|7CCt83tXkQlve=dXq)-Iqzro$xDX+npFc-=5qDD3H|cl-A6n0doiS5 zyc{PQHmd|=?TfIEhTu>d9RKYj`rRgHS7eUgZEy%>=fA@{`q1yGKMqL0FNp60{MW3i zpy8LRuRPH&|6L~alK;~53u6t@`#`_i_9C1encmU?<14P->FGHHmBST}Q*&zqP4S7l zxQz!2G@|NQ0AV#S!Ioqz9^o^R8~A_)8uJgdCC!STfCQeR$c3L)1K(^(v*Hu@oM3^H z1fQ+MB}}RE$2Rz_h9W-eJYhflWk?z)N&L0qr|?;T0>i}2px;WI#iR!QmNf9Q)liM! zMB)S-1ft#o=@M~1mfHz}sIaAqO2y3`Ji31!YxgZU$By%%T$ig*r^$I12qk; zIjQ~i1B|KwoNWzEg#CbO>sS$xC4|b__GTCu_7E5K`N`yc+^Q@fGYVUj1pBoddw zQ=@X&V0lDg5~b1>qLr&7#z=!fz1W$)8l1uDw{v&4vn==%MwhS=k2|E zBuMY^0Y-g*Rv@2Y1%e2gO>E(Ua<}&y$cL3``IG3q!|`K!?;%jdmU>GBRgFU;LBfK* zM7vUTh;^gsTRlqSMSDMS4RWF5q|H_X-|RSlt#}8NcjW=ECkmSvcl4`|o zWVwb#_>HY&wZ13>z!bcS9SlPAnS`!y;8R_LjbA&?0vKK_U7;?A9~eW!iWl=+1Aohe zzy-H0M@d`KOAN7R;VZlj1cLzC1#4IjZ2JV$)l1y0q;g^}_{Ixn;{`J--idZu4P9(q z1D{98Gf}+^#T-=m3~0W3Nv(@(REeW4a7-n?#YoO8K#shkC49}&;fj&!N%rWF6`Qhc%!?L_}KEGxdKIN#y@d3~5M znSK*wwsnR0wc~uY8{|209iG)=%qBz`ZHSW3>b$HJ^-~V1#hi1(8r|tXs z{)Q&Z7b@M;{E|j?k;$`TjE5;A28Q z-ueFfGL7|`?{9Mw%TdF=p6?UTm4N6Y*;2eO=KDA3l6$}B`#)kYKxV`LrSttRsO#e19(cZgn%Vw^ z^L?`{HgMMQe$@K?t6-lA58Wv-t$wI@9&)P)ela*MD z-`G0-@)RZSI_CReY{WE9KXne^?KIIV6&65m=e$=1c+x2@2Uz(0Qy2d$ehVH=NWOPYtPZ$kN}>l6-UTkaf=8v&Sl9W?WlDTGdMfZY^-10Mk0kYHl;ORW6x7fJHPrp)!&16UVN;SG)B zpIFz8(l~j3=aT4n4F-Fl0&0q6CZXUr!mlMrrGjWXv$LPnPg`hMbn$Cq3w{&05~yJ# zAL5c2Z^Ls_ycxe_$4&8eKDi{A7#*vVq(ZKp(F~D#F(sX`&P{>alkLNd08W1pPXz!+ zPUkZQ0bE9Wvf`KU+e3zEUlX4d42gS@YB%t=tbsWe5ehYuLMw@cp%9;iLJ2-ui5vOt zAz_nBbumPtxK`I7)sFMGEY2LD(CH2$LX)zDp-_WRNV3-DYI+Gtn4FA&Bmmxy=lIrw zcsH+g}`OK8$-!Ka}d?6hHXEXo4`@B~s&4l@^yJu7Ub=G6Xlhv>pZ+4u& zF%`1(!#ci}EWFT8@Bt3pm0t`5aa{Ux{BcpH%W)MxJ1$2)6aD%GpXw5O36KTf>xL*0EuHgmzx^k?Nc;&kvw=_#53~i|&gV5; zlqTxnt8)#fEuG5lhZ{oA8rP(ufMsq+UWfB;gsazvoA@y{|5I>na3xOB~e5ESY)^$^S30@s;?uK6q;Q*w_T5Xqw zIHH#$6&x-ykI%%{PVmV}EW)oXLZaZ84SdOKAT2HV_0ag_jG?%8y9~vqcr{A^9NFt@ zf&x>LzeSQRyeiexQ**L+-c$4c&lJ86SsAcl;j^SLQ+uE(p7V-<-w^OvhXZj&0U_%(PX^q1hoLev6psbgf%dIK|7s?$XKfN$Y4 zlkqo_k#E}Zd=%DEP}d*%`9Sb2{5J#t`EuQVIqs9^!TbG#v&cTG=_3jZo&v^S-`Bo5 z{h=)O&G)e)=6$hmz6@QlAN%G(_rUPm`{psIlO8PZhJ^4% z&r=6_vFy*jsdBI^M+s-5xKOZUifiBe3aew%_Kok)&Pes$G2$EDL?nNZ$@C4QfvCylU|v09Xv35Vc*<7Pwbn;_~UlRKDKY3fWty#xG(IRMJ}{~ z?VDL{KF7Y9=BA*f+P*1y(D2f}v~Qk$K!CdT%@fed%@7!hebZQ)Vc#rCL+NGT+yT2S zi+$6w37__neX|&zRM`2M_RTn{`-8G??hE|bFh z$i7+kzfwcmzS*saT3`ES^0OwRW8XX@8PoPn=v5Siee>5F0>N=#2?USDe_s2=W7fEj z-tU9gI6uny5d}Ut3K;ulBYYE?@tb*=#q=7|UT(v2wDh&xaH}VNL$4;)cKVC?j7RuR z_+%v>#BXdJe+P=+SkM(cmV?fIp4tXy(SY{NVH;Qu_RUOG;8+d|#0q0d@&r%(hSRu% zC7%ULac63!IJRyXQwNCO{29uZ2TPs(JoO1Lmi^f`QIV9ua)v>HibJ#5H%v+1X5u%K z9;Gg^8A;4g4&`IEB_92RxJTi-X~#DP1`xnG3ye>xCTC4gI9sBR)=t$B43U= zAsqTv5yD}EObAEtS2sfG6ccALz7XU_F>&~oyon(k2NXj%PVF}UtoC#hEJ8R0iwg=E z!XelS_13)x?Cp3Z*y{x>-;(1cgu}QBpc@)YjDDH9*1}bY#VDrC3z$REx@Nqhb^N1a zIIDGR0x_Hkn2tqru5ya7DC5W@%57S1@M&ywo&RRa0AWkcuo8nvW zOP+KzDTfFXqeUK1@#J)ksqHE0kYmzGFmu>O9mZLSr#?!&gf6UjIlt)|D%AHu0a4=b zMylPw-?9eg&|w_$QrmH2Sr#YW4CC;vUa~Tb!#4@z@WGZ)mBcLArsO64g>jz67lQzN z;(TKmCx!O2Pi8?AFg)f|Ov*(|UDlWwJ;qSQ7N@7Ug;^bok4YC#J*kP5n@)nlDMXS; z&b`C~wNiHRSx0jCWF_YEo932EwLm4vW>)YUP4BZdwf7FhkxoCp2M#z&=|{c2H=TW?lnRUG(5Q} z{u)bqBngHnlSC+dFP+gDqD#_AriyZP6zD0VZaE6Z*74Vba|F`02{sMk9DcCmrFI>Y zoNx}GO*rRnmrI-12vC|kBK=3CD^9%t8nKZ&p2Omd=kPDY2J1vTXNuvsASM>G?2)A0 zh!rTN?Ti5~L1u>m{g@6+P(=bd9?ltgCqBs_D3hRd^$~h7rvo~z03;)q4-Dw=uZ|T* zoq!I9L#6usk7YPC#TVh#Vd~o<`LOc=DNaBqJ+SXUsuR%RGx4<(e6kYN_|;+q0Uf^N zHINLJ{CcSD1a$O>Oo_4qgXcPy060?S06~E%#^52KjDQXcm#ZJ&WAMKQuTDUR#|LSX z!~}E%3lq>GDN2NHPC$o{bU;U%*(;#4`w^)j9jCcLpkIbUnE{w$`{y?t^S$jK2y0s`qJ3@uJk8o%ESDK9KjFo)U;9TK zd%f+SHexvgFw*wVue=&YIjjUT=VY~i-Z`|l{qtK9f?oS44Q3zNKd_DsUaq>p5RaoS z?AiXgK~y`0cow7eGQA>{g&mTl#a`Gymp>`YV9DwVg1uhA-cGOs*+0L`uz%o}MeCYT z$k;Fg+CMsXJ8}-f2k z{qs#@|E%;%r(eI|_RxE?e{R?I5B|9Qv9Il)G>Wcp+8g@^TA|^|J=j0#jLr~Ul1@t7 zKcMHnw|{;vK-2b5y5b?(KgF0>y!H>);hMJhv41cfWV3&6$EST{|9lIRx&%xz>>o(J z56=F%?`H;u4Esk=*t7lfM@;vEe}?@7p|sEJpDoLz29NzC(EHjy=dU#xY4M2tBN;vR z&laF%?4LT=KNjpC{O7fAJZ6vk=>7iQG}4bseMEr|jsjx;#M*-ixwZtC4RM!6xI;}C z1*O^?c{?XBvho|)&9VYNY63igur~CHi-VZ;d7Nz|=S3u!(!IhnQve65XFFsC|L%r7 zws6G`9?RDusmc#eD9&2erz_tHg&#tJ6{BqVoMDkQtZWr4TYZ`kBcF@vU07}dXT^qByC(!)O;L|GB#7j=Nf z!#_zZN7wxGZNoou=~X~&U83o8#7|uMOo3Gn`pmXG40MTT?p_AUuS0EJtnDjKZ7u_S z9kuO=flU3CsDEz>l$C!D%%IP)#JCtgY8@JzIljJ}jXuAQY5MfQt!TzqF_!A}rqA0y z>OH{DVr>&y+l5YTE`9zvdeHQlg!=apeTp*Wk5bp*jtvk0Y$X3QvPbXzZYF({I^ZCO ze`+8GJObc4G>$^&W(Wd9AG*eSjjy5xLmq#@qq(uJW2=whr;+kCF<06h^mS7@%~5k;7#j&?3Kr>tOQj&diG-R( z3ALIM>H<@TTG=QiJsj0Nd_V~`mE*7Map9=hR!-_3hbl%yt&`#(ViA>1KAkcwgP+RD zPcz6*zv!iJEA=?q*e^f*7+pj9ya}z)$fqFs8YIf#r$51$B?@;2Kh5`2E;~Q{wkZwJ z@Y7Q=&Gen|E)qA4m!EQgU~hifaAO~SI(}1ce%gGK6x<^}U53R|;6x8U-Ho*z1I&2B zPbt&~3DqAzT`t8x?EK^kqWs8pWSj^Y=j#d5qOjKmU&4Q${L7fXj`^o+TVlZc!y;EP z|0T?S*dX8!i!5UPxy;{oM^=3Lx&IGA=(2FI`b_Lrgf4^L$-{lWkB%zaP>p*akVJJq zuL?=IWt*$>CpE(I3m2)s!9R^{i_l#jlB=-yeAS=OBYXX4vHsPlpZ5?JtPWgIw!RuS z3cG2D_(&QtIEWbhXd}l*AqHIPfx)1l>zCVhao?I;Fo@fZ0v3;iL7hRX0*7LE!x6P1 z;OkFq`lx)B-Cpq#{dhIte-{6k6S;Y*G%tD9gTUW=5M<~7_f#IoDhHva*#7meaQmreg}el$1rJikT>4d+r( z{4yVM%&gBZn|WLQLc-0RG}OD4y!5hXKvTdK@__4C=fZ5$q~4SZ&A!{7!Ar;Wx8K7> zz*sLJ?Y;0j z4!pkY{S$2Bez7z6Av^LG^mE&L)PVRsyDAIBtnGbfu7h8H^t)}a@Z9!Z`E3VY-}a{1 z_k-(S7hb^t@V-BIcrN|^@)ZZa{@VLpSo{5A*qeSXeqVvrn2n$R$-W<4dtLlO1LF5K z6|epvX2tK1-^z~PrF+0H)*diUIb7gK84K~k!|ibORwtL7^AxzwvZ_G!XK-1_0nw8p zz9;S~;~{41viVd(A*;F}-Gh}Xg_`i53GLcY_i(xX78e|jf|4m0P?|IGQg`$Ik?LX` zm8T(m4=pFeP&bBlutMFbA@)m*e&k2*B%xPrJFfyu@5kX(7TteUPO@3r8o<&0IOMu1 zek>2j#=lg7o#3-9x90<;rF<>Rg=0{@F=={ze(B?-Tl1v&=qIfBIOMew#VjGuZdMCf zO;Q6t<3Q{q=%tX7sc*;D5dmNIR1iLP#{Bs>W**X#LO#I{*36~!SK7JQ4nUMRl8u3S6KD_bLO;3h7n6AD*3!njaA0&Z{{%-jh^)Zcrl~DXTdnR)o*>P&z?C9mt9`0k%%=Gr^cqn z$eHTbZZO}<^tXPeMYoq6`f1dFQF%ocM;8^icn6->jG)Ibp zmt{e^oKcS}iTu=D5)*MIazVTr@q+#~NXqGks3tprck*OvsS`y3F50E8`P z@Rx4g`5RX5)(ke7<PuTUt}R zh^XOTQ+%BJbcy?PnR&AHwFPoPgoq@h3+0aG!#e)<6fC)yHOdtqb^}Xd0N%_%sN5uB zNByNeBc^{df5dY*W)5F1$zux!wp>7h{GVoi-c2ZkFKsNZv=an{4Ph)(slI|B5k_do z=y$B&5O-@G@y?q4)bCNWrK?L$0jB!e2Q?XP5$Un}|BvKmCKvAj%DH16A_cvzbGVd; z@S8p=-@S_f!`|r#9_G(20NiuLXLgEo1Yg(@#9OyGc`Y`s>5E=)ZXA*qXg;6CWMNAY z{7a+&zn93>FqxOV@UjDaGlV5~4WNVMG6G?Axq?70A}Eu)VQO&BH46w_K0t$)+$H(~ z8H@=5g6^_sEzK{R_09b1QY?yQ-2#BdfD~X3qtnmFER_j#Sn@^?I<}6fxE)hQ;4O5l z%WWW#xOQNvzE>liGIMFSC0CEwa>Yia+8@z9$Vq(#&YEJ7vBcbbQ_L2uixBvN&+F{^ zx|^qW=(El31hYJ?Ml_rIIvV8MbGZ`d=^d85=}R1P7kpgbA;N~us_il*UmqcPbj~KZ z9Rl@ZnDB-OKG|`$4d+zi*G}+P1_U1p>c-IL+rZ~MX>eHsJ8$7(IOv6Ga%TxyVpc6g zOg@sxEBvb=^T~?)@T(!`C6@3RQYXK@^l^Pdk0lq#xcn!%ttDel>8H^2`flt7!3RUK zg4<%!0Ld#i&}ibRW`rN@-!P}4!W*TJkJvQgDO01)+MvHjkc*U*H&3%-U3v44>5caE zdWWuRgkYlavE^o!(yf&hwp@;b-K4~+LRnC?EV=VUUo@k;Sc`)*n8TK9h$>YT^l?&T z1`;i~EX3SNvk(^oEka_?f(xC(c7h49B$~LG4=?#Hswl5i)6wWW0Wi8@Cc$W6@{IjR zgn@rea%~K|C$^5cdRU0K-|4e8E2)0^vSgXPzi!_>2qC zy_frx32zs~o+35mA{DrEsh*;5Gbl3bVGiyVeg?vv7&^60yz^kqF(oVT~=XIt`s zXmeqoWn`7nmuD&yUARoj%|BdU%>!Ad3&*yCHf)qrhaQb=h8c||4Z6aN4;F@L@<7nZ zmW!H78*!v4(85_&L@vSKGP%^L;2XR(c-}!cO^|5~tg0ZkQ7GugGaf+8Ddq_jlxNvl z%S1cD-!d8O^XEJAL%vX3Sej3@LSCbR(w;oHN=82i{a3DyfeI}5-B=C!N+P-Y#z-Io zL3DSy1jm+4Amvd|^sG2hOU`Bc%m~TGN+N}X+PF0gM5Ivj-kbx73G9X@w~>#aM2q0G zsQIJaJIb0c&yaShr`+qpg9^~e+D z8%~ZMULP8Wse6~7ZI7C5RqZwqas|R{JG497xG?slf8wIyuqV&Fg*3OW-e?<)y<%*}Cw$hDk-Wu>=~Y39!p-%6?{V}q zXlDH8nBcLs!}uz9ztOAX*lm2K>7czemfWwH&{x_)nyDwQV72sdl|HEwaJXdatHCg< zX`jkC9|p+B&d6E#ao5a2V_>E-U{a~xxl(ADJPAd_EYDeZW;&y>XN$1vURJaM-wL{Z z;!L5PRiV}x0B@j;R146Q;bs2$IBotj$Rm69`G7t9{8QI(DSokihJR#NJ1qb8FqzN5 zJFerC7>?DzH>i*J#f_Nw#euj|;Bg#lY_d$$1<&iE`wrJ# zp2GYiWFCR)E7|!Ae_HSCa79^(DJFZs&b8uv!9*_EC*ap`%#&aSeU1&;m&(&je3Xfh z4|+pqSzIbuvJU)!tM8cJz$QWMx8mF=1y2NiebI^fYnd=ev{(acTGAj)MgEcfp)#xT z>YdcL_2D$ET9>pE+z-(dpH6W2mpa^T;Ikma2YrI5KwwVTcla$!Ou%pTg4jBy&9A=R zZs0?ia467_E$2;3;w~Cei;PyN?c_fhWjM*^K9arcJ@Hp(v zkR8mh{?Ozx@?}Mad=Y>5VP;G`{0&39TW1&bGcv3OVTnpQrB1nR4 zxLpU4)=^GJU4mY~1+)02(;5SQGM(0tEL@(Xw+@QSn{I5d0=`&5I<2MmPIoZ)8P@Q6 zoz@evq-8IAO4<*BLf`UcRExiPPkH7*L!Zp^hmpT@>%(wW`gZfu--tDXg_a9f*uU>!`dHCS9m2wT6n_KqijV zU+^d#mt7MV9aQir%%^wGyyXB%Q4>>V7Cef7@h1(6H33g4IN7>Y@V*R!coMA4Fv?)^+uw)AXmC zZaGnZx_Z$V{pqG#uy6~dlEu)IQ~UF)+>+H5QyRMgY2w9K@N?qfT)!oYzBafELk9Id z)_%rC7vmzNDf6@sbOdMia3NfUvd*(~tGW!)Qhg(z6>7Gswq<@j2VbpFt5wxz^5e5Q zP7;L!LV@w<_;7H1xYG(LE8LFj!$wrKSMSHmz*716g{q8GWp+V=jt{p&F&$skW`$d< zs_k~DWkhH@bMBU$yM6WH-F4xA;_9#>=t9L9SK~v?0(+Yk+H8fl*j1ZHRBef(#JfJi zemAE+^llwEP&8g*_RK99LvV9JfA7X^4ORcdRX?F!+ztlq@9?YG#n=zscqgypvp3n# z!5$xoMZMiI(wwFEY*UiSj*~$_IIgIZNV?P7+#)c zJmCQ@L4JXk7oy7eu=xnj7LuJ#P4GokaNVU`&Iq3jC0l~OJD;)=+wfWDKd8|XLcFtD zhRegnsG(%@nF-dh0D80-6TI=95749er>^060^^jJCqdlUJM)?MIHZcs%?IS=pSlLB zFPV9xSn@6)z!fM~;uPZpjuqsey7+kfLi1*6Z0H+-5==n}XR_Y{)(}PMEcjj~H75VW zk>JH?9vnWL;&lw$ig%$&bc^%vJQ6a&Co541xVWepzqqy@zw{yTFDR$O-m!IjMLcSM zR*~Qf6j%Hf-1-mc5T=wgNI1Kp6EJo85{ZBd6dy8>(()Cas4)nhF&~n|V;{tKqQ<{~ z2Gfnb3lc0{_1MjXHcbr0PUe3M%FAfi%i)Z{lm*g18`LSiopi2T6(4G9;F zH%1TSo>#EGSMpZ%)K%@q_uZh~{^0rFfS~GrXdsxNYq8h_qUDxD%|rEUS$=XbU%|K4 zlT%ml5!!QgMd~vE9>n&FLm*QNvHKMIODLdy8L~->adz2eQ;)SWkhx*(#fZXb(m`3o zj~(pF`cOye)cTM=H4&=r2@*f|v4MTBZESFHRdvQ{I(dd`OFWJDVTda_cpu@#Tk;;K zu1Ao?J!Z+x90}eA5QL*1yq1kEL?hF)`<~m^w>|Kou{}^x((PHDOLgQux938*4cvY( z?fC&Vb@kJpVs3ns_O#8}yY_VQQqePfeZ6kzB4}0QQ*^*Q|V%`(g z>p$|K>}HOX69nO?lQqi51ba_9LApQo4*%`4hBp)cdDOpJH|Ed@@g?o*^R$?dC z_@PH9hhy+-J$G^qv|4DsYGU#q5E|5KYj*`9&kGX2m-mqW?5ofRy4+St3j1r{nZvXL zS@cAHPOfnaceuIlbpY&2XXe+W?Sh$&RV*6xLKnbXrfJapoV?rt^QxQq0vA9>Ix{~f zC%Rx}!`9WH$2kDzGRZ*3V=~VL^QxQqO~@)ug^qM?eoj6kUqFx9*hZ%zZ;&L?V=mJS zXgnrYxL{^uE1%B2%mFZ$NhUKMlV5kiyy|BDk_(_CotvMNVF%3Ykq+d^E`YgAGobO9 zEOx<^WB0hmBj5n|9Fufreog)zqMU3|`%bf)`DIBXSGIi~3RD(DatnGZm<50}XJqzv+Ne+=$6;PVAsc+}>nq=iWYz*;R z$dcBVuuc;p^DOqYmVY%tU-hxFAol2m%$<*|201q$3^NX{7JUwfT7I*@NflkJyiVxu0}nbt7a?!T!S-3e4;7F*q4Yg1uwnM`<7n#VfWfaSP5kQf!;W8w?20`f|)SA3VxnHA@w&b zp^H7{5Xqi7A%Ew3s0hC53H3REu%xm2 z(>fvgCf1+f0ONZnc>dTqkM!)`eRE!OtfQxN1Dxph`Eqh1h1%^;GAko=i;bVJ#)=A4^Q#?LNKhK6RTXZ?|QA7J7qsvEo={jJ)gh+?IXnyKX;*1-BI!0c_+K){;Z{V^Hx2W6C<$-@K zY7%_^*jf;2yAw)WyM<-LKK(y6LShT928a9) zx)A;giFRDDkFRj}j|KI7}O;88Teu|N)cpx{{RvMYkMJD7y`M!IWf1Z!WB zEbrt-N7`eqxn@i-wj+qIKgQSCjX-1(P{hI(6oveaTr7hQ#zqkmSsq@t-$0)bUph~f zm>{Wvibyva>9()rGL|##OC4wO2#WslNa00Ot5|H-!V;u=;*3cba`NoDvzAt1!)V&VqIzM?BIWofgr@WQ)soo zDOamZIn@MJOInMK+|f@+^@W%)yDC(|WU2`S0@iEUL^?51E&bgJM>2?sQ%I%rMGsfbcbG; z#tt37ewXQc5~f`7ZVn;D-QF5*l^P5ohzX=~x%#v2;bc9qA|rnXwv%2Ga8u2Hkh{gm zhd_G#s)um|7H8Dxu%rd&l*9_B$#i&<@PR%ap!y{E5i29hzv=REjyglaK8EGhrC33z zr`+UJ!Z~~H9I_bZR{oE{M*ITCoV5 z^+k~?G78EhHx_a-t%xJT5ovZHz8nVuR77qBN=D4&sEs0?j@83B^-1CLomdx1J{Rys zMkwepVizU|q%tyNsRzg{0>lh~H2M|l7a9_<$eUJJuKrhE(G(nBQV{==G&gOJRm^Q!x@4mFZv}Q zRC{A!?IYWFN3qMTEB3V_U-i+EOTLrt+y_0Kd(MqsK4DK3#@0`$h`gv}SEU*|lNqqK z22$lJsW3lz8MtZ}A7cRfazL(1!x9eyB3^ z!+>f5M?=T)I@TG|+?_T+jD;`=9p$UO8VKo)$C^IDSVd^5d ziXqwQRITRr(xx2DAwKNe%T4`sFx@El&eu|$(^Jlj}xx?g`VzYE{YaMI(lJ{qoT4P%#lV2@vom?g*Vz& z8!>I)(|rG!V0q7&=0*~*HCEH=i;h#(Qe|_jrdfKpS@&>q5vv?SS~CVF53ns>0*jq* zhg+NQl>}~Wng)#6%+{tU*eXXfTbrhepvG6QlQj*N36g@4I=TSdSZLBC_<=90WLP&P zU&y}z)Zt?u>>GJN2vEKuNZDhLp)k$EDg}8E5nDDaA888$_DFuSM)ECoHZ2Vw)-;ac z1F*tDGTav3>WIqLd&CyOI(XouQ74)~YZ?}ewxZvy3d{02WG@;IRG)1NuGB2SVG;noUukj_x9Z1a_+-u;`D zvO-(H@(2?4DDaRkH3CE7q2pyJJZ6Ws*x`xZYFC4z!!<>!!b~|+u`kH;Z`~0W1bOG_*kD?7kU-K1;IP4 zO9;0hX?zt{lYr5-j}Ns-xz@7qb_9~ETJx&5$(Po8e_i-5slS+xPZi6uhsW$Ms!gHS za!hJ{=(QBQQNkJsIA-#}dkP5knPD;$gx>VO##(p96jvUB$^S}XVC{;!;!Uz^V1S9h zEpMb?e)V{aE!W&JR2SekPa379XTl>!hF zU?t=6;gy&NVmB2A=Z}D3hE`~Wm(y9XoEnT>wX&>gc|nZF*3h4(=Ds0=5oPNO{dH9j z5bBW&us|bnF~lFF;REIBG#Ql=Wkx{x0V{kj;oV!T;nj!kt(!hZsUQwT#Tw}F-D*EP z>2q-~_zjX>5Z?Fl(t|X<=qgcAAn3%!!goBu=FK%WZyThqqeHZ59io!HZ7i$A;kDEwA}7?l z){Rd+bH0bb&>`mHW2O%AfaEYUIPjjsDZeI|Qyl>c+7lMrm0yh`g&a>=ZgsdD|xW-7ec)52$|+3|#h zwF?eXrSe6q#mTk&f=wGZ`eOnn3$r`}qG22srW^@z4<_m;S1XStY)mJ5od5$Nx1waK zn5qF*tX8T5aj$0NxC%Lhd9mT(C)CUUc4z$Yg7^~fYV2%kPd)Rez;wHZk2FE~7ryfn zQK*1c+3*E8_Jg}O!rLjQwrk}|^scJy))+p}iWHTq1maO1P*60kyj)|`QsF8Sg$wGJ zXk^wHs$VEtt|li<_raHlnX=2yDVtWf08(GS04+xeg3G2o56((uokeN{9Q6qZhTHQn z!oRB1b#F%xBWB@33kOpHYN*JXhJ1jbL@&dq0G!X|ScVs(=jk*}^C&ZyRdv9y_9xPY z^{+rmhXY4NJpBxaW#Nu$EFBUK!wDkoNkvhBp2A`eXo6il=tZpW3uw8I5zAdF*yyR? zQBMV{zLZ%3jx)2Q7=hj>mOH&JIO7an0c$ucchO!o)&cs@j4N!j2k51}fsV4Il%oQV z6h#;4S~I8tV_A?>rE$lTFs}CAC0Z>St7ZMgAj$hL>oWxZM=wGFN58$Qw|?91&!XSP z&h}&I(c5c-Pw(LimS>(hEPw}^ocv4OM;=mh3LY9$h!jZA+|=cphVhxoC5rmgBeUs4 zfd6$n+;R@n6+zc=hRUngcsSXpq1r<6Yf!$&nxtZadtbCuhd#bf_4X&IEc7wH-JIxf zQK*wwV|Ho^wa|ctRaI8X7C8ce?qSTZ%k#|x`~GP-pFs&_?W zTdZ+hxq9`_EDJv_0y+ip+Xxjk-2^`_9LNB~eL!vYG(R+#whFaEa>Jd>G^$ap89r#A znlhEmas0NW08y^yJB84W3aUY^Q$Rc)1Ok_G?_@}|P|Tbk6{Ds#hrd4@CUL1I{$+QLU8`kE_|I5>ql!W;+|5LY{VdT+2Rn zi4@928MQ*k@D;@GAQg#;>%#;Ut~Vf6wLEBwN9Q`!KBFIMPc}s&6WMPPD*>Oqhu(=$-@y<%NYOkP!t}@Hs-@a(el2G{eQ1K`u z?f?kFQO`>k7bfdiiwUUbAfWzrbn2lnqtgP?$hTI?w^qtG@gm}wYWPJQ@fCX~KYBED zMv)n++20xcXBM_hF(xjx|h_>Dv$=S0fttKC30h{yZaXe`#}-L%&NTA=Q0D0-Q2G1t-hs+8 zL&F|1YPW@0n((I-Y8P;< z27x%JmqksO;T(S%teGe9g1L)nXx=j=UM3RTu=F+I3$VTjU7SVv)L$h1=|rY|MdqeNAN`goVlD4nE;HD zP$UTf3))XB=jA?}7#br;L!7mKaNx5eBh>^! zIO;4JDuv1G(H5{${c#zrROL4geZy?x>=#!bCDSk*ZX{8Nrs+$yv!6bG?%I(cMC$3R z`Womad}dU#MYDxl9FNPenu|2oYJUuR$;KWcRO`uwdaRkZ!l?5ocG$Uvs!H ziRub?JKgOgZstfKov*@{KRts~Duk$e8H~xG0cY%XXTY_CfuNMPTUC0Q=+TiWENTWt ztEcwwTueajpum#SiK_K_Pwj4IT|42ZW8B)Wmf8{XLhU>?SB86=)E>qjR+*onFI0PK zf5lUKVP@@!2u@U=_tx%a*0mFkx=(nEZT~YW;`Ui*8xmrc=AdBge;HPDi#TY+r6ebp z7nRJs4RROW8;p&m7zl9Rq`&6lt1MrTule#72S#G7;a{}%uINwIkg_H}mutw54g~x8JaB&KC(C>L!!~wi(O1FGvp+6O z>gDHEUzQ}%AZJO_ehue0RBkGu)C{q5uv~jA`dc}84zvfy#Cj!Ti3Ro7fHeaLRP>71 z?>9nfeC)lBgg&HB(~tD%J-#<`2~FChOvk^QLfcLUQ=^Y{2)1=I<0-F6JmodSQ(mhJ zzlzb;Q;oIbRj*>(ECgUH2b(ybIQ*ahBVXLH?Y40$K2Ltr(z zqt4A7Swj$nqplL>E)>Hlb+d6UpaXw;L`DaSNorNW_VxEb`or2pI6A*N&@_zRPLU9} ze8}%Eo3=(W-Q$Vm!VxaS>(fbBA7DD^U*)ne<3Uzm>r+Zb@_FF#u!cj%W6!N&+dS{0 z|6?xvu5=z~)g4oaBr$Za7q((sF-`|s{zr}gy|A_V;}imsr9W^5SdKdGL{FEdW}>tN z{wWmmE7j+n(pXCxg#wBIVe{Rd(y0?XrMdDRw~SP%o`ad{?_-Db&+UCvjl5z^HYn?l z^|CIta5&-izU|B1-!Q=_D2BD6Dv`sDcdaSJ2oH2PJ>?9bL0;ks#!SQM(~d~^L)g<+ z(I7ve#=%$aGQXQSav3NbAsqDu@vIbbL*GJ2RN(-Z9k?6@r?GHf2MHE(j(mZb;zU!z z?GvSsm+(-%JSzA~kWZO!@T_so# z72Xbi(tGZPz8zyyq<>=VIPwq*aUsL;DrbBsK%vrWD(CJiXDVOAdD!U28$46_0$HZ( z3KeW>pQtu|-a}V6bEKUh2uF<&wxxDD4WdCD0*KggjTtv`b+D^RDB1N7;q2@IJ34X# z*w?}0F%K3UvM9pE0{g`#s&l+pxS2H;grnlZ{={Of@RsxvE;b7(R<5L%(0jZR2!~mf zRACQGo}4#>KHH9iW5EKg=m zeMLJEJ_)AD;~FDKl)%pB@y)16j?dXv65bw5!X?+@4(k>f*6$upR>m4Q_;9-|#6P#~ zdnU=sJ$*kIemaALGYT0s4g+7Wt3a3H8EYaJ?I%M&$qn7Ic#9{bRI2aD{up>sk`Lp9 zOd0))!8@Puh{2OZ4BqG!WJgM@-gLhTUFEPJAYTc{F8#Dv{4WPu7O}YPm<&+?!wsW^ z5xeoBVBf;ltPfNZw|ct-Skc3%r#^NN-NZNP=|G1;BPjSKba7Cysu*PTiV9v%gvs>5 zJeDnTY)JO*c(^0Vs=DVR0^5x_vK&sL3#x`r@|pP@v$KT+<5D zd1Wfv{!>xzoT;SxAP`CRRCkxF?L~$xeVxf(M9j0`1AC>hkG--d|8g&9R;bNcvW{&( z9yP2O;e1C8`_y#lUb7{V%iB*>4e&X;g3!$zSxgY3hHV$;2LxeiE|_vHCfUzR5i`kN z>V&p^s$ew1J8K0*%P?)OVDY)@Tv78a`!>j;tM%}Xwes0k(xqJ;g zgsV7$A5T`p;B0pJ(ajuD+@K}=IP*wy8O?&^V~}lWqj+i1%YJI>pWxplsh&!kDyhyM41UvdD$ zw(MuZeBd1-UpTl4bAyNtm=1fPw3zn!l^EHo)5q^a4{BjE%^?>UGy3IdAoW-;m%D&-d;2z z7#*=biM^z8yrzz+-!HZ)r*8jPQx43?>Jn6VlFk|Zi~T(EMX!$iIj?$jIvaAF9!up! z|7uU45WMt?D<9k0M8MStJ3tDSa21qJjlQmdRO^o@_V%S$prHTC$E>ljrhL}zrLR6Mr&-UNJmZabReFPj3?aMB2Y^k z2{(WpJ7^c{h`x`Ku41y3NJ?YyaN}4`*Ge)mmo7q7mFS%#jZM(=s>6I;L*qQdUU$^J0w3a9D+?@ z@WqarfSR8Bcbr~IyLPNmikSNIbFfGyv^{w`SVPOi77^QdO7O zC{}ih(+XkEqa%vesI#^ieBhiRH4Ki*&rOm#WIRYZnfE?uqR>5xdo4N^Yjp4o5cj#NIiv8iz;o zQ%Q6L!JVVQ3FSz$VDzgDM3$?Mi(3QJI(J9$u%xC?A&zeIr7Bo#e<`*bFn7n^xlv&5 zj_taHdYZ}0Elte%BHWBv%j(RX5fhBbM6< zyQ46VR-0T}+ZB5}pCTUEo@B7S6`6Y~nesodH&|7xKU!jko2B)W(br~^F#GGFqj^|O zKow)Z0F3M8N;DA2Ko`V*gli-YgC4|M+3M?59L|L%-;t7|E4CwtJ{PRS#WAg)mRfSF zCt&nl{M#PQfd=Bv~g$ zFoz>fjcR1(VJ7oeB=bh8s0OIqvoY)w;T5X=Yzmas^eX)N<07E-vhM>~<~oxx^-Nl#^jcgM-fo3E zaOhu`ktiJ^QIG--6Nw_9N}>V68)x8oM9O>|E{LJ9S{tx^MapMbt__Mk5bgxjPAyYb z<0M(gl*9VSl!tZJuHHgrHGEkFRn&>$;|i4)_pxe=Cc-B)B5;P|3^frdN(+@MAvDkc~+c4(A3v5&vtMN zarl|!S*xW=hmk7nlq&6LIQBI&^Dj;2nXtKI?d5(k`@GuAA9X&j_R^268MOAYScCJ38l$~@;ay?%zM@7(+WAs!Fxtxz2Hz~& ziv^zuq84{nme1*#)1wxCj0C}c`W8>(#iHXawW^kBjb^iU!1WeB!;;@eA7m;uE%VNX zu1$?++dOQGp;{Bg#$Kp9Em7R3$b$u{R^ea)JN#f-c-g!lGp{PETAHEz@b-r{QT3a$ z15}XJ$_d2CUlAqbZ6(UNt%Qq?x?)e{<2nwqL-A44t;uPSC88EGaajQxP2IvDJ=Lyi z6nS>LPnk2Jmc;N` zT@8t6bR<@j6UD-b4oWjeRl0&m!a6!ZY>tiv_JrD$hKGAJ-vQE*-s6BN%IvGA0ovhBl^9V}nWN>GVmxU|+ zn0ca;mFseCfZFEhWNrQHWJftD_Y#$>vDJ)}Sn@hG9#>S(M4Nd43S*RR;t4PYtx%m+ zb-O0aZQ_K0GSZ60^rEM=QcoL}WPiY%5ml`dgS0H%tVJc1wJj8t?NHVzD*1(?vX!E8 zg%w(f(=^J$w`)Nk^UHS}4?O1N~^h^#yxgPQZsc85rw$ao}E=Y z2?64Al~whiskw8kuKBm{eAuB?IEg0p)zpb1F~2EhCbBQLs_r$}e`m5UmF(0OQqw3j zJB`q6r_k&$LX)%-C2=Xb!wN4mFlr5qnF3>}UA62Zx!G5!iu|nL;(%Z|kKx^7eG%bh z9cHRfKl+C-19lfxs2^emhO2xJL>w4i6HEdw93Z^e;P*kp!(i+WzaH9Q2Hx&bdk^mz z4}P1VnGG7hEcCn5gWrr4aos!meFGMd)840{G7lPF7W(}bR-yxMg$(>b;+F;9YsG2& zN(YbM8c4KTv|CyD2ln(M>7)#%mG5gHl@@#Qmp1aWHItH&-Nc6lT`s1QfMR1IvFtB; zYW&xjF(420m_PO+`=LLK`iH+;{0mw0Gia|Dk4by)keGCTxwEx* zcGeR8<1-HW_fYWPZ;0@pl?X+DEf9QqwfB5XZ~bGFt-WKjmgv8|dX-96eERT1nFLV= zpZ^;YAjq1(S9_1kO8so@-3eQwe+u>A-bF*q|GgpR|I)zud$rdmlDwhh#im8}b(oBX}H6IuVDHdLpRuz2Y7Mr8x$_ zZa0F$SmVbf&I@qN09MQAT)V+7eg=x$BLx{`lZVvr2SBDz{ipO(|D1d^`mfSf4`v?x z@xAD|fxhz;5U4;{h%rW1FQ!{4^+U1bS`FFqeVt@$)1G49EY8(=JfuU8pTo4<_0%gB z$|vq;lEhu=U5Yv;N0u@k>i-dbj>QkBHwM8#HAEiTh$7B4+_8fXT=2LDWi?Y(kT(Zk z6?rzx`iz@khr_(#`i$O}^#FpDzo#v8zX}#20!6IPycCuh%6h0Q`73H`{EMN%%tx$l z4_n%Gei-eb^#ihilMAB`f=!7#a;A_9qSR zCV`j7Mb(7&tqgcH>j#Dh<{*AbEde~V_5g-SyQh$Hhcfvvf}b-*V3)eEF&f2hsni6i zVc@Hkz5L|TqtM|02rP~AImJ@JR#@pWKG1T|aUJtx&&zt@yyvSI$|1&_|mK|ho zep+JS9WVG{DLa^HS_ZH)vjcPb!-L-`2Hp#>g!DP80`kpm-X_1gU)Cn~#;>hKx3`|~ z<^%=Uk28SXnH^X^_$@Q=CJQ`BF|@Zb1K#;Vf;Zj3dmTF(%eiQeEol6})mXzM5LRl=<|JFFyM3*u&sgsK+@${-TTPQ1{$l)B3=>2yE@P7k9J**j0N1=8T^T^%h!}+1^9M)j>?a zPdqPKK#trKNJGCL_ks5ZFuaSOC^o85E|?ggv1$A&`@nlemUjq#qvjxNhxX1LJiOdK z@O+1P@WVMUfLAz#1+XAbx@e0;B)08u-@_eZF;^z$9^ zh`Wk_IsSG*%h3mh^e0}Vz7HgSS7{>x{#3I^A*#`%-hz4xjG8bdV6bJjA}#UK`1LNo zelN@a83J?g^{Zo_$YMWCZq*!%hE46ePu#&@smHUF-}Q33e6SB4-0~~3m4C#P4|NS& zJ`g1}O-ygHL|{_~`xm!_@{^&(WR2;q-po4}@ca^)~Qqo$1K8So^H>d3Ell zc8S%RXr);N1GosmHHB88VLo$69Yj@Z?Qk{~=aeqT(LiS542>3CriUd4yhQ}N`}47) zR8G8mY6tPVJ;*ZHgP*8cS*iZ`5~*H@^&Z2L`vJ(Diz8>$iGUcaFz11`4b58!;$YRVE|Bt1IjkdM2QG7&*ODfB{EmqQE>rX+cwH7O_C;>skLlPA=SX!e( zjf!>FO*LS|fRX&a-!u2#y?3(-;G;i(|H|jX=H5FqXU;iu=FFKhGiOwqRb+{}0(ntn zCzLMEt3-WERAUEU?qxFzRX%$_{DehN8Oc|CKdUeRb;Iy z)J0B{A{(Q=wdxQSxhzp6jfe%TA`R-_m|mckOexYF^);yXjsgzV>v2MW%i_U7a;*xY z*|fNV*xkF4VS3+_b?at1E7A%Uy6DxwJtFXGwASFz8Y-#A5#}wky{)rgaBq>6E%7&^ z6$+Di1d(wgIPEOBDKM+)7rRGR>Q%oR`o(^MM=VIIa77b6e3CQ3{q>QGmYUTycqrGe z-ex!!`~lXK5Q4}|5ds{5R6lr&jX6}{4+l^&5qX)SQG8=R0`u!Po_S3}aCmHrOeGyE z&jySka&fm!+HFzWO~drQufSsp9^mo4X~Rd3rqogtsD zSq+mFxpEPjr!hV7Rw+I^z5_XZTvzr4`0o;&+1%L|~J!xSMKL zk$m8dU+f6O`Ckw|OpF$W5APQn1zdR(xa*px=_RjVhx?RpuG_$JI*!M$Lw`uTZnR!k zz11K5UY9w*CD9yLwf4tWfpwW_n(*m+K=>s+2_L(+gy$`D%^+c|g7}?&k{N#~9uDjR zMTjr}@+U&Ie;-2+S2+9(vatq}RMp z9Lv?lS45GEArqN3mnpFs_$^b*trXTd58sYwf?qAL5(tdQl&h%zhK+xXq=B=YNX7cF zq=Gp@FusLhvu&zbE$o4ooI^~&hMH9~_<#U1vxxy1&`&;~Kn*LVK;b5t(U~Nmxl9e# zwc%L(he*Z8iuL7cfQ1&1n0Gkz6Uo*r3^!9JtpmC-ZciNBne z|F(w~_%T|17FpeU^GkJ=Y2sl(jnKIa*k@ZUNy^Y&m8B**a~NyZX#si_G>p@nIZPNv z2Exd5=Fl+2i_ouf)J2!AfuS-=!;0g;vJD@@W!*C?p+1wG*T5}9X5<>)@0@uwZdL|D zxyhNsq_5H-?qX-ML7b$rbZM$&7F9z(-PS#6l5HOV&W)l3TlvvvVNrQI(Sn0(re!Wf zt5qFXnPI_vPp2XOK>hg3wPe)8OBA*jE8# z5c^O&P!%?yb}4TYdrn7u8UP<^t9UVCq2fwR$+?e)$4t6ZEdbD>4rLgX7wgK=@c^{l z1lkUziw+ha!ZKwnBXp)|I5w0-lg#7`_)cNt`SNTTw^VnsHO5WqxE33h8i;c>Vp`wU`3Q$RdHGp`FOBF z<~NuVU=k4aHKXb?Y*o7-HL9*?Do4A)IHO4>vjLZyDa)m(yxOWfkG5zlt~i1WK>kq0 zO{fBad~iwxYrr4A#Lrf|fC~4jw;BF9bgQSp#hZiNtKNd+7w-dxx~gzdhkI2k7JTrY zR^Y0lOVi3f)D;{OXaIJG?N)iNV2$9Wle<}mX}CFyjIyeTj2ST0G{dWor4?$xj*RmR zEmJo`lIRpPzc!BX3}wq;q7u1_Iv$%&8 zGS$V{4-2r|lMoz$+X+|V9X%o9=7cMter^(D)ew5Nt0~Lp3~$2S`Mb9PaDjDSg-!-P4hwq64u4;dZP+6XLY_Z9a~TQjIc*?Kf&lo`?Lq zT(m86*=hoB z*z9dc1-wPb9vXWAEeqfoSRSb!L6kRp)u!w#oy@P_?5*z!WRSYs0K$M{1Oi@Eml4BN zNf^HWUhfz#-t1kR3izoSc>Fl@sstm|{T8T%pgr|hf`@pv?wRcO)zAO8(v1E%3iBo0 zNKdQn21u90+T_t0v3TSJSDOSX91?IXPK1JF7%BoQ~)!x%EpR95Po z0ncAhm=M%~uaS4T^#`I2V>8i<*bQ=O|AALJ@7z36%qxcIO z)ryxqBruF9YVTL&7?ZyHuux@<;&OhfShd0CwCK}0HGPDjPQ^X~i@t@lI^dFGAbs>^ z9Kg|0@9^3&B?4M8CP4YYt=b?1N4l(9bpUgmp9@ttxPsY`Mj@^Xzvxx$*bo8 z7v)p)>MfuRZ#pbMlpXGE0k3!hY$NqX7WUyWvZ#0C2HYT}y^L5lNH0@=!b%TR)ADOU z2f{yOmq?8LW|L*j!ZKfT*tedJ^Qs|%du=Q$Gg)?xL}ai;0vV52%dl#y58lAA(>XQE z2tj4Ms#$gfDu@S#qHE38{~>57lD&=$j8~!h3uR4UWD&L&@*a<@q7B0n3Qc0~3Mh?3x z&(rT#+2sXevP@N>^`YwG$Hxy1Nn+Zqh%snHZ<~enBPPORHclikkTt&aQir|DUh2!E zQQKR6ofwCl_1&OlaMfpYKSJLr8ySf5E@ zu^Rdl@KC@V%{@yxIcz~=@9Qe`Wk?zxGkZrI(1mq_>c$R>AE77ATZq%SUW;2#3eo!U`H}P88RtVCucrufimeW{+==6m6oF2g z2y_;a+XyhTUA-e4wwfRik#{cX(|)(h`j_#%=kkCt6+Csw!}r9G=8paFbI1e6)Y$Oz zvn+`~Q*YUzddfsx)C(BpkO_KzaKaH%8O`!zbW`uFPAL}Svx;~JPak4|S!AblGbnVl z5+#F?$rF+xLXxh=VoK6OGL}BpLo&Pw!vM+P#mwlI`-uz`LU17&XJMXMnio2V>kP{B2XC^%?!tt@Ug zw-UnqK|luF*$nF^_AEe&vgn|)_!0J!ZS)wwXa0ads3pHla9w6t%Rt*2w^%$82{bT+o5 zr?au`J>AP;K!)xAwCb1PL+lN%7d+c}V`_WE?Eg-CA=Gx|vt0vy4fyf4awu+n_Oqb3 zfg|&LzRvGOeiQPxdw5lQ1ut1Y73Uo5YeoCDqo=k{$q9P-(u|kpUQjdmVbZ%BcvX7~ zFPYv#JL_KMTp^VJB>0t#k0(J}ucf(oY0{IT{tKnObo1?f{Zn#2Y%p=?rL?hlYAqRj z@R1mhHalMA&q_Z-?!>m+`3ZX%gAM$ZFnDq6EG()n89m`@>~vwo{Fk<BPgfol z*n(*;o%?MtGs{(5GYfivMW>3umBhb)hYrI6)?j0-<)_y%W)Z=fzjMuLOYAs|&;0%f zvVz5ikA@hw3xSwPh#*G0&7lssL#zv%z){z^neEj2L%`iVi0OQox>n=c% zKgj3Pabe%?<@531YicIZ#lC0qnKkufOBRRu)w5XNa|&p{uNLc%HUV8(IW9>+&zJQv zEuimXJSB5a#@VhU0Ua($&8ii{*K(lf}ucZ{w30iLQmq0*=;l~ir z2{prPa`PCwf?Yz_h`8XWr@F zYSt=)Lk+BlI2|B3;j$rd&Ev8mv{#CNTFu-qjmXd&Z5+DGhRsz@Y>;=9dK{i%i$hjs zjSbTD8zvKcZxa@~EdLK3+cP-RB>5#v3)K*NaBi@JOx3ED>UvQ-i5@!+?_lB@_ z=B|>R?8ZBTG=SaMIGd>G);1 z+y2kPh;&y(;Pc6s=CFq)fK&gJPo%LOER_7xqRBCXxa0!W>&R`*7u-iecg?t|-`G%7 z*C>eO0Wh!cSvDCh{K*cuAQ^=J5Pa%)E%p%HvuqA}Air1fd*2cG4gAfL8e(L%g+d@m*c%451q8t)Bd6_-j0N7BU6>8{T zB+-a)DQ8-lD%G&!Sg!1H-PRAbalD^w0N*p&6#V79wGMEE!#BsGF2N3tb{rx6%T_@O zXU7;&6uPAd+m|}(ry>{dz#_&y%eXP)lO335F$g={7txs>BAiHQuc_|17GD_Uzdb#8 zI9{(YUo(O^c&+4XHc~UI`eTPsd@w^rccuriWZId*qcEMBRbXNprWo-I{M|F^dUhY7 z7w7$L;hc8JDgxGGbZiXN!q$inG#ToqL(z?jQ`Kq0)6D{zGkJmOqDPvl%lwwAxZVc} z`Pi%ZWlh@%unW6YfHYT|L$M=u+~JCxJE{(&q~Jiy?XG*XJ>5fVulrrL2dx&mDc^N# z9>RizZqDCldRAlYbubeF#T6f*pYiC5$k%Y~Sfqtk@|S~a{&NZQgLfkYTAq|ucekve zn?t>ky;zO^&^EqW`2({Eg`m`L#azw(PDAYZ0wSv~r38+VGR*A?B6rT=Xji7LJX!>C zaa!yF$w$;(SoZ^Cr-24^kR~Aj9YiA7MzFCiO6xbYlE2BQFSMcV!$_I1TCzkenh>&M7;q8 zz=Vcy9T$;8EBQ;*AGUG*Pd3zlg~82+y3Ss#He-HfSv6LEjXFW8p%&^Bh*IKKBHYUr zsVIodoZSXQ{ObK9P1KK*e8iZjQ*t!wqF$($#I!-c-f%7VNQ74MHyQQ6+E9NLGcp_M zI(xA?!j8I?--i0tOHHoda|n556Bta;C@=-!W|=zCLj7mRS5sXu=SO*-oZ8!w2+dSj z`$|sj4S0rS;JCX8mfZJcmHB>IJ1UU4u2qB7Y?yGGrD*TLtl4PqK>qV!=>@C>kGd zDkMaqyz&Ro7x2ND&=B$+&_>vyZ8$hVhlV!Qf@WMWX$C#3yh_wCcNyU#KRNUbXdl1? zvv3O$n$e&d+L0EtWJ)IprB8fnKx@V*I7rR6Lpz1g9F)E~q&G?@38gGRawlsgwI3b*D%_-k&?eQ>bL zMa?-3VlE^=bMjfJkSBzx4pl$QE>H*wF{f;=+q%F;*|TWsOy-6BTNq#hX=T>(PdMso z*~v$(bI(B*BeA^vvBbgsxOhs=)83DBmhyg3-8DcdwP|j-TJcME9qf1h2*^Wofw&65 z5RH_Th5>;ZDQhsv%CwQiXCbSOPcVW*)$^ri+sJy$M%HKWy(D@z^A@Y~u{LgLBrCJg ztx49e9yh!7YRsOoGE#_@5s+ov0z7NqWHxK2%i0dGXR_{0B?2zyvh!6Cw8Vf z0p8mez?%f%u}*-wc7T5bK#qR`7lTMrlNH;VjL*8s_!O>~7pk6@++^EqO?DofKei@A zUW|X(WoR{-mD$#0Z^9XDjDJ8W(PSTqBz{!LCi^ILlU)zPL<``?TrI>sIXp=ik}q*E ztR~B_kU|HThq4xj*WLx+!RaCjh)18Q$+QeKN)!wW;9vh`QVD?H?Ex@$_-~z>bCOj^Mn=Nyx(lumTf-r5 zv3m1elO(7RE3-|790jMeZn%j=jM{;N7J3uAmM1bg*RNV-H6=?XN#WXdAX8av>w5CV zoK%&o2VfoO_RJ(i(U69=6tYcHkFm)ppM}&YpTfRbq3T)5r0!=U^&z-SY@{M@vFg}j zBh|`mBenD~lhkVlNgG7Q^2%n=$Xj)_TKrfRmP}GxG^xgzhiE%>{8Fx-!I-Z}{1zZ# z`cnu1`ub;UbpC;i&Q}TR3Sv73N{tMJVCYu&LDa1t8x#1f+nZ0}iW#Bm8Nvi8Aalsb zw=sc^85@n2J2L~3aF z2{klgH8q7cYWS?1luu!al^V53oh&QAjjSskHOcy= zN4M=L%(=3F0Oy~^!6HPo;1|Q-z<{z{w9|GOC$}e$lbg!as~GMz#ls1e6c@NK>Qjyj zIFn@)x@<)ASrg4C>}Zux4Mzp$*~tC2jog2}U?-Ph9g5X)a3x#1*2=7DB^)(%kxA== zh^a~G)0@h62sJxMjc-TJ(hcaw#&yvdBIN~`s`^!iMblL%EyFy_cs&7x84rT;Z3OXI z2$HYi+5p}|EBVV-v`yqnbA&SOn7kZsm7yC^=q&^cUT+@UPm|6}P2i(H7LxDm(-#lWM zoDzvLJsefgy(ak)c`H-2S>clc1Ac=_teM?O0GoQ?KUXY?mp*VzbCzM>kER9KUO;Tk zY0gY?xm{YI7fZq?0IQt<19pI)?UxMj{=NW?7l6k(0Ul%rxX2Drrkoe_1@Jln_{P5- zB(Fmxbc^Im05Cox^*DwNu5kAKk6BvJjb_=Z9sT_E6hkVY-)fwOoX}LzD|H0n`{(?0T4LdE^s}e(_P#%?gHLy)o_cn*>#;y!c1ZM%p!O+lJ;Lj*&T3>-qLiNK`)t%s12GpMB$XIE{ zf5Z(T(9O6CLDwuHm}rM9ZO{q(P1+!ped7~=wN8N7*#Y+J0q_rf0UR#?Pj&(vYzMf+ zEsgpp{)nm*ryo_FcKRiq1mP}ieGLrw1yKlD6M)9>+?N3N9^A@Y+@Yh}H+cZkTX6=$6~~DJ&LAYhcB`bqZpyRSO~|>( zM1GMV?^_i1EeusJB=UB1>3$pXkI53XITSH(vHA=iTMKzBvqoObr7;hh%@qW0jb5dB z1^fzd+w85!3poX*GoBmANuTwhw4(J^?7&yD179V&>@MlDyQItRO760%T>TCf7NkquKDbP4D#0gZiXHbX8wQpc?2YNQ4Ien2;{0#olbnR>5g z>b>D;vkaR~l^m(%S7-^C_1BA-!G)$>eviV9Z0Us201h=;DikDnJs4=IOr7j3{Zo7C zOkMgjjQG;@dd5rF5*%nU4Ftw>O^oLX#uamMX;i5CPO(UAPNh{gF?d+k;Vm&h-eR>K zE@Vp#tjt;r#8)=Y_-%+DrgnCUWWx%xW>bxkF&Q7bIC?F9Lo4}9lDllf>Z>-AUw+!IoQ&+n>JV&pvf9?luSq5-_5J%zlJ9~e z3$hlPR)}a~j{}3o+6e|K(I}tF)IUXuF#I}jo{Uc>&U_Y}>-ZF|yA;2nmHZ{nqh3tR z2sYVpKGcb`&R(phfHM}(R(_2$L8(XYGjZMw1aK`_hTw-SnLN;1osHd?xR$kU9IEFY z%C>MVA0tuzhNENnT+82kmW=??pX@OIhHE#W<$6i0+lVxQ586kd^emvlg+4yhYZj^F zQ@CymVHiemMBd6(Ok^Poz8`a533bHE$`x%Ah>0_ab(O2TbrQ75$G}s43;X+w(_Kb8 z1%b-RsMKr*KC>Crr?+DxN0hIT+*#qe^#F$vxzpsm=H(m^z^EUz2(iN@%3O4J!)C&D z2MlTIZSkx3Wcq~|96M^s^}=xNTI36@lDSqw@BJp*bK`HbJ^KJg?euKVr+{-1U_4)&?Ww*a+jBl(lti*U{Q;vsn(f($ z|9}5Qw&!WUdFEHyo)-b$`W3WgjuNNOz+UoZA@K28494K0v6VFiHrAAI)@WPa zFk%^)hiBpob+L-BXeNT_coOYlVvm3kbJg$~Q)V zD+n#4A1N(oCMOa&JCR<61-^esoP~e5W>@@UR>iAqgR!|at2h^)BJm>N=)q>pG+g)m z0a|SeBFRk&S8PMRDTt1aEI2ra$I+R{uw60?L^=Xc;(aH4d9Pw$$`N{-c`GIwZL*me z7+(n#Fn7krIvf#?OAhWWYsK#NHras>%$dip7Tzs+7}q^#rWc&+d8l-jx)zHu z5jQr}uT`JPk-oKR?oYT$KWAnmvSF>{RWxrAjSJ`BEq;Z z&LFCY+uK?Yn{ur>UoxknZr!hhI%YZwnc$rSd7>{`Nbzl@m^8sRe*?ryW>iZ|vBJbn z#7bsjOGK=e$fQoXS3bJ`lk2=M<5b{UwKK4-d$#xG*rD*k@cn(fBL*O%7Lm9N`euCj zq2XZfCzv^wyn+T)>%8wlmu=DvLP&sSDzZ%y7;jUgqFEvy%>nsxM)XcZ2$VCT%@N-m zTsdBq9)AUyq~kTCQFE4JlkSR0#fs4TM)rE*uQWd2-fqk8-zd)P+BC zPNp9FB1L=FhpOu{ZahBXt4Hz-Bm=9opxr<*FZV*7$qm3UoH%EFJ_^&73E~kI@XVGFn5c2ZSq{_ z*y75brzTtJXlvY(un)p`F2ByiYm(r_jSTxuKS&lL_x*9h1? zM{pT^MH51ArB#)}M*wvRX{O@=$GA)-jbRG{B*Rt&c^N&cN&E@u3gS?RW2b);$=M~If>c6J#&&hlceCk8kfcvO>>35GT#d#7W1^YoiN2(4qsPPB zL7ao(i%4@X-!E9m<&o2bl;}16T6!4RFbDCo3J%Icg}*ewmKw_$YKjVsw(h+dao9_8~T*;^IyTDc^_< z1{@Y6-EaOW+tc_+wxey@ z3F(>m+>c57NP2%a|Li;GZq)Z1{C@!dAI1OI@&BLrAH)9+{I?C2-#q?*zyZVFDV~TZ z(l}vTg;9!s55@Moh$}LS%QazN&(r+~vxmEI8Eg-y`%i}z$W!riYnC8;x$0j{mB$nQ z=J#g#{^70iooA@W6r&@z#g|qdW*QH^w&;X?5qWT*yO>Fz+w)_?El;xz#?k>)h5eNO zeLvQS{;m#);t=(@&??N@0hfCpr~E$xBFj$45A1n{5j4Xrz*ss`j)?^POW{wy4nH`J z$B+dxXOk#@;<*2>P=g$%-mt?w@IMSj1ZF0F6}XlU*ocJ#|7n_9WEGXuRWH@j7>07i zNqp$2E>wGrt=ePitpnV~!Hh(;hxV*?6?h=kZoMW^?d)6loM}}X+X-K?TwP(Wn5=s8 zDYB}SkAC3IX7|k{H@{9H0FvbM?^kI=Z^6F0J(SNZn|!v39RBEL&7y>S@;FAh`kwyo zkk66H@;T)fEUe{ou|!V5Y0LlVA)mV{HKL!w)U?az1Z3?^K5@vu5Bciy33O6W zO!*{HHu>CkZx8vLC-MRLY`QujDBr)yDJZ?j=U7{{^~-GXDLhNa=Pf;}{gzp6nXTIQ zr#Y+bT|N)Qu`5G97Xtw0^HC^=ucdrWp!!^-PW>VAT%D1g5m#w3UTvs)3()<|9-uqHM0X3(MWh+v z`wJ(&S3X62aVoJRBEeQngjpgYv1xvdF;Ud)>?sDuNbAsP_XvMQ+ZrfO6qH+037giu zx(hM;(YyBw=G%1HZH zRWg?~$};UF%A17C+?%|&D8rB^mjgg~juU0qN}>$=n_Nb~5EEsV09paRDmGCbYNCuZ zqKveXUQli^xr{3kAQ+syr{{zo#Mj-)@nxo9v=HT)v+0xo)^|CvZW63pi1l2#4J&~- z%fU8aIll^uU~v4OY_J>29f{;%GRM#3;_;q#wa#$Oe2w0(oaoJZ8can!w=)@itgQ$g zpLppHYO`<>Xl;O65-I42+{L`*>aD3sDD4e43jqSmqQ0H>v=n&r#19g@VN$tz_WC5=h~^s%iJ>6e zMR#6!4uA2bamHdi@SkxJCAI2C(W=~I4>k1&(lm47h|mE>duY|k$glw_lYu%B;FTU$ zZA*j8w7_k2wF_MvX;~Y`jq zsbEQ<$M*KQ_+ONLPe8M0e4Q*=b{2}zexoxHc)XtfZC{7 zyoOZ3@k5DX7CRLz2{g5RTqaF`wy3$npaRLHLMMBAp<=B`#af|aZK!%JwDjJ$#ac}T z{a&DAzLSbMYe@xS+>#1ru~Wg4K$D-#RYaNqR6KRLK?RaYg-$+C=5l&OPxOo3_27#f zJ-9PGhl>Nia)A@ez_Y*-mC4$HF_>(io2k?Ir2Z|e1$Kv-*mXo^5m=d8EYm&Qu+tSC zGaA!p2Ka-q*1KBiffUy$fYbv{q{gl@kYaKYQu0Y%WFj@|GJ|D6ib-Ya&@YVCr5Y)Y z+BT^?rqMu($w^4bC$&Zx1WtW)X#y!Gm8qZ0H2jNjii-;16o)4pQf_hTqWNSYMH?|@ z^T{W5f{E1SHl*|lg`T9_kcwq=zzRUm^sV5WVZ%&X@GHL1>e&AW4ykWQ_=W?0a6tS) zT=~;S2(bC@2tI*wJ&(sR=bs1*G@P} zi3!Wvc~CQP=}F2cd0h6Abx-UjwnxbuZo}e5@yc2}K$N^F5ro393ygPqm+uBtq~{S}ME2~WvJgf7BPR*7dHhA!k?6YXeYENv^@^r zBpbb(;ZCu&Ir5HDMSrky-O8-#l{kFYi%E^Ri4ClW)O~iF_R1_Ivb-$;hBheK1tfsE zJG5g+6_zV^!69szMhmGAe7d}mV@%xqxfMiY*k1z${xV7H)gAU{hmxb0vX~r z;6M`oqI0ZeQ%tjUfctDsQT|IuQy}k1HD93Ma3Ke2E3JjDNpd{A z<5J|d;?0e~-WJ*6(c#Z15PSRY@ApTvp*o zk8Cm7!tX!F8VH^4T!|MQ(#o&b$=BA{FY(ogQ!U#rx@J}EV*1g57IEQlcG_(}E}U0NF(ETZdHQLHj*EQoZ;9JI1$d&}LV-3DAi9iqjFgcn*tu+t!Wg zC&gKH$#d8f)H%zyvr@L6T+US-Y$3wQgAAdW^ma9Kq*2Mu;2+;Ab}Sz?uWxTt?Dq7?3^bjWaF}#7G~K`vb4mH zm&8@A*upceU#BqTn$>uj(64jV+iu*%=-bHbo3IE$zs1+4-x>CTC6ANOPm;&9yG?mq zfR=O0uNeC!$m7$P zE%lVgkyvxxBYB+8;(f~FOI)?-LmvMu=_%x~4hep>L?)f7o}ERS4* z`1;8sR$a3EjFAN+_xEGiA`;LM121vGR~+P{MydY$e~N} zc#q`a7@U`540T1b+i^o~?Dyyg$kjf*>bO6`{&Q6w8M<|-+f{XVe7(9KZov2v`tvsZ zIesJ|1{ZH`dE@xS$LD%P`CGubPr(LU<)N~RKW7|b;ji5P?ouN!U;}14WM0zs=3Voe zv~o0PNuKKmd7g6BdcCxHYFV?|&sn~{5X2SnBs_%Xehr|cAK|3{qw$m3=8(Xwgh^X@ zQeZLOFrB;|ejaOTftw9}EIK?B@oJ;KZl&OA^Q(KrU+kpJ(JibOQ{J?ILRh%~fg2t( z8K9N3ip=2^UARM;QtS@9<8Omot213z`Q!(Szp4-(EP#q;*4P;==^Wyg-8(nWqZ%Mh z4lWq@WF_`bD{q+V__AajJd8!f=Y<_Z9o>1Z);v!)wh^u6x!25+1~V40?27vfIAyOp z8CSkbeYoGfwa5ML9lhM|ZmcJR^MlJpehlrY3HlR|jbKUdkqSw}0FGo#fvg+4T`GHo zB(0HE<1czcw~4>&+&oX<$|ARC@&ZVk%O6_1d;G5`>xqASmd5}62`2s`wu8`4vL#DX z`7CmUi+fO3Qu-xQrdvzXhiO_Rj;g{iI{F$`k?1*+j`7KjSb>A&d5z`_&yfBZLwHPV=@5J0wzTce8y8d$doR zi1!L9s=GR_DX#n!GTzCh@_W#-Bl8-J2U>zzAkQ3F_A&YpVOuBFpP>LNOJs3H zCigD0+}-$!mwr_^D%8<9+Rc`cfl2NlKuTJb8=<>njO@+k9}At?3@(s0qp<+g5xObU zol|=VlkpXMrD20^VfgA**M@yq;m3^^*aVNwF2XOY->Ony3$H&@Ms2*c6mWsnMy}Ii z%?5$R+n1!f8g4w+c*vP~2hc(**Q}b_-F>E>C+>6ObQt8_L+jdK%l07S6DSd!7_S7h z#!>DN3dAo*(>0#uuHiEVxK7kKlh5bqJhgm2UFW%-&nM_SKj-riI?rrAAE@(i6HlDC zDgzET$Y{LFDsgBA*GslSYE5}{_fw}+#{S@@e4f!42=RBGBFzg?k zROlD$Kz|WNESrx{ccdW;R0dQ}ma7VGGj-<~QgW8}ov7~}bv8U6!}~2n&frk`$uJqo z<6F6!`U}aYZ;3R!+onJR64f6u69(hraHD3WRb>a7`EjoPXrP3?h-(Ji5nLbF!t+w9 z3}y?;a70mO{|vKvJxdh41_h4G!hJZNeG!m$gczjmz{&gLOK~>7d|Q7Jo@7;~;f{ri z#2|Icm;USek#^E)H;mF%$9DwDHM*Sek9vjuKgB5ax0`zim)VG4;a`ytu|&8`AgH-< z>53boX34Oncr!Ma~lv= z1!{KqE_S(s`~ua%RsM|8Bg9tetQqe28cC-?S?4Sroj-Cv&>@+Rgeni+6x{ztmdszy z@$Q<{`}5;dg8 z`8qX`3>^2;YqsY!2>$40I138v^Pdv<-R>%obfi7VKA1uRbosQ(badqTJxZJNk2LmU zHKW&bv;NC_6!n6dNTnM?Rt=JM#3VUaOCiQi}6&IQPQwRU4lG-(xDFOhfQ=Xhc;=Nl1aKG_uNX!U)f4BqrGHkBn!BLtZU+h>Le&Kb?g{$wY_$GRlm^7-SOims)^`m zlK@KI2l7iaOUnRlvbJ;sdAURGJBty4Z*`N95FJOHahZB^rp1gX=lxB zsM=BV@;Mn>nOL>uipc8AlRAU|7%vdsi2N;Q={{57PAj@_N~qI>lRhPqhBJUuO4n3< zT=epW9nq672(3%kIjdg1;_}GqOOjxcAp*Co40EVRwYy|{yP7M@7r&Oj#&q=GqWdTbm4R141QY4_C1`?w`%A-5xBtu)C^rqFNx`4Q|$|^Pqs)wBh1VLnfw0 zssOWO7_^fnWpvIs(^Yj(Ja@e6gly>c*X2sykhiUPn=}bzuepT%5sQ_xSo1XC9w^*^ zA3uK7`)GK(TztM~lZlbb+$9YhE}AD^n6oq^@(~;9#LAJEpizw0wpz*CS=G_AnE)Zd z;L*b1@$fH3I>Dim?X}%GGw&petGnVqj=T^pv!Ja*n?Ju{M8Q9>r=)HuXhZiY9p`539rM&CELO4iDdR;!wqIf3(lT0yrk+E@w^MwbEv*Dy=41D zH3!Kk8rj7j7sAV=N$hdL?UDw6N_O9Z*8Y4fPF>3CR*;?{k$o0ZOzfOUXA;DN^xS7|?*48i_>RflDwWNu0ZnhwnHc&ZGTVy-gH6q7a1 zZ=k(0z57()j6F$K84Is--7+yeF{0ED)2aIlGBv4b1z}&mI8W8L-$f92z!N7v7Zx{Pw-R!VH;#gTOF=P4g*v-#(_wy7QG zV_@`BNn=^GSbN9dl!t1FjD|^mxcLPOe;qE~h}qFC&iegXij#afLR!&=xou^UG}|oi zwy1BL3d3j)V^0v43>6G+E>d6};(GYi;e;>sZiGMa9sLd4scw<4xQg`K0s;q?$l;2O z;ek3bhuw1x`33LQOugVrKO2xAi>oZIH^0ECzp1oB@#fB!Qg2%@Un0imSzqkTm($J}C*h9>X`cFP7YVdtVumRkS1#a^Qf2CwvU-&d$Ja*H^j$PnlNx?9+0wx;gD_@L&Z|bF zE-boZo3B1h+5^saEjZ0;hK92hLzTd3R?mOWfFmnYaz=_ajozedK5s!& z9gh();TReRdlvT#fHw?FgS`L@S%x9q1LPS=ofod0V(-yUsJv#&OJ3UZ)fhWjvr#LF=hT_c;XLM zlaI1D+M=^ey-=v1ak;X3+-LyEsM=p6eCtGFl=r0^A;i{8*|Kc34}vzf$KBPq|ngz%oQlJKgN7EHjSU;WNZ;VV;Y{50iY zPycHAyVd(L$;u4176x;`j#VcKJJi2M*&7o;CBGiesRO^9{WgJluh1ccA9dyrSaD*J zTwA=@t5^5x9Q40hdHA@+j>K9^_|dneOPP9 zj%!yCn-<#RnekQTFnej=^;?WH9!z|I#X4Ej>kgh@Q=Ns;e|m5<7vpXip&r4WE!i)@ zn4`meT~jf#cVPtJ-T)nulr~IRU>8Ic<3ECZl&c%QLuO~yU;CE>=&Hyrd5#8M2Zk~+ z=(whcyiol@Mb(hNy~t>s4??J-WBw+4$xaoAzjZ99-BoqGnu(9Gx@Jg6sl8 zy(Ei~x%Ee|qJH%}Lh*(4w#gr|m&ZN8lJ20-3nL@Fa&2jP?CAY)Au#7?DJz zNC#@A6d`(~<`Hi%hpVt$I$_o_;n8#8(JLu<x0OlItBn#+r{aS9$)0qPpBXbdD6EStUHK`-#X*f}XXGz7l7XdqyIz@ zR5UQO^U~mVjGDY%rC!!#($^*{c<$K4VzqXyb6slH!b5EcT*&ilFrnIWo@U%c6XS}m z(h9;cH$yEn;P7m)Eb_L`cF)2F9D^|^FAQssKM|@f0FP)2%2^T}|1sz3EDxZclW3a) zwoPc~3B6+e9izq%$W|{fKf%HrNAtoJZLl%>#<^Wq1Klxc7%oh=CE?sAIJXgJ$j2do z&t@8AHPd4nK>R02S(iq-O)-GdxX@G@7XZ5=ue;QnHT7(D!Nt@Zn^2$#6M%}Wq7B0< zHc@@>&|(~`+tznu+k@612!x^zIG!S(1?`9RDQapYs^rn&^DNVYHb57I^vI8+U7`bB%y71tnnC$9>ze-;dJa&6Y*r#Rb~LI(W(pir$i7pS}SLXCxJt1q@X?i zxK=uUL5<6WS*yXFf}EwI{m)PE51%pzggQ?Mngk>(=FM_7wmX)MI+vY50-SLd0aXHC zw@F;&UU~j&0}M4>v@Eo&l@Vt$vL-$~xd6MEDZ-C(LNwEd(;SgmQtTYwS_q77r z&`A|ELA_96Q$ZVc^iV<`t%Qset%f$V`b|Xyy~QLqBHa4bbeXLGm+2(Cx)c3mb>x$> zsG<|I5o3OZ^pMhLjEwxw)Bdo!^PSkZ8mJ!OmkGb4So9m|UC* z@OTt;rJf1U%54z^g}7|`RC~Lbqg`NBwCkA1VmZPP0gN^?N1Lt%j!Rq=SkYaM`Q9!# zves*p?T=y!c|PAL`G0`ENjMjUrQa_^UqI}2II*#(^G2{w%apq95K-&KkrKmVw;g1! z92szLl$qL{T2{><5;CH`KE*bo>YRZ&$Sz0W)lixJ7$fRKIQz_Af%!EWwiU7=!qKW5 zHVZq|C1I19ut^f=^V^hD`)9ncFfMs#=@v6ni&Yv_Az`DLuu+$8DXrL86_k?L9E%J| zH<{v&jhk{MAt}N_MRRGz`YMD4Mx6-sfRarn=q9Vq0!dhFCal$UHkDSa4ca(daInGQ z2BssXybJR@JBQCPIs9$9P80JyWW@c~@OD@>i_U4|@M>|{8yp@(n?;WM8PhRnb=i%t zTsPn%QJC{I3Uc8KmcR%~yrl?I*&fF-0*(F9j?=5AVsOC40l_PU^vsN@M0;q2gFX zbT2sZyKrEEOrkzVSvSh!_F~EiobNd^c|{DYs#0H9&h78=nK(kB0>=))v0iY@Ev=}x zaQ4}G(x6d}j4qJ+JW}7iQQs2O$0Pjr>iY7_ltv%G=70_Qd4*zIEiaIqQ1ojh4U;5?-R?#qEI&jZ;nMXa8<;k zPJ)2{cTKkJhRuKI*%)to8IOLFYiP?YkPGw)3^Pt`X^lr+=Q^~dj7R6eHEL4yL9<5AWD28SCohkGB7ek+U0)*M>KBLzRG#o->~(RZX%|EI>I(Qp0#xF~o%9$hK*r5ulD==%0% zJX)QjiQIUJgGk4C^Z{hFm+@$SCxt1-qo1MhH{;P)JTCP;9$mh_p)Gei9$kBO&+%ya zB%8MEF&*rT4d#^P?anE7f?kSe*WPeng*UiuuuNDB8z(gi*nl3&ya418>5#Isqsid+xIp@`WIawG9vM^b906i)9PJjNWhXaBx0F*j&%0`jpdO^ zSe|TRsb>(I(2Bi`N#8QD)MFBAWL4m-*4R$J?}JkMSsoJviTtM{WBU9Bx3L>(gI%vjm&5I4t8)Q<;s! zJ?2M)3Tzzy%EzN4G$ra}!6`96N3uGHE>Gb*A*&{YlhPUw*rN z!J==*qpxy2DuWlc+mEGyUE;)-ElUr+%ccDut5Pz4rOH1w8q%${5O~zOIKGWXV zBlz~He|yUMTT|Bme9HO}BbJGWB^Vj{*x36RwlVMh#@?Iy z?Qxq3J}GZ|c;KH@pt&~LVl2?)+bHLL;&x2RWrKj;8^Xgt zIxgOjfNODLKk?at8F)i*s}E!)+_J^nxOP4Q2dymMkj@$Ka1%NqsGob-gobZu8k7|` zuH@9df_gEEtV{2u2T#Xx0grcagHPIUufk4FpF$I1Z5m6b?_)h3$GWzdd#Bu3gf3I( zXNa_zJ7bbIKUB0L+#K#I{`$y3%W-P3P3K5rTRo$41+|^l$JU z3hYqF1|0|u1Pdw%uN``mF_+Ti;(Kdxy+anyq0ky!JS*KLgmnee<4uh9lvDc;a;XnJ zHwh@qejlypT6mzK1)GBs2MRVK{+{zd!IA00rKAG|Njo-p5&L@Fg+^xC4-}M{%z9Vc zXO^(TV@;9u;j4H|Lv&%8dTXF? zSvJhycc3(MZ;Hr3O6uzs-qM}47qA%^8}O&dq2Jsu1n(>xe(FQQ{$lVBvf(#%`yRtX zzZifxejGmP#oS0(Lgipf1lmsW20|r zCZ!;OjnHRHe^oDzn&PL&WAyU`{ZAz2*d0CIq#9G?x7B}8QtqDo|5%2T1Oz{;e zPk8U@g-DCyzTvI=*x8!N{Cj9O=@*IVl)zrfOS}jj4`O;d;iohW1u@O4d(APcLr_Q3Eq*k1%6xA+Zl@^6Ah7tt7u$l{uR`1bu&h2u9Ff0d z{7y^8?;#W3X;{)V%mt^uN;_m|DT-NEZUy*qC`1F2zCGi<#Sfnx0XSL6%v zpBD}7A&n0D7&&(=p(ZBFiFA}d{D9q+SHF|-${FLxKt=u}-~nk^PuJ{8e(QWb!y!jT zkHv&dg6yWpj{yTh&ohw0!1FL4JGiF0i*XEaXq|Cfa7UIpBW4buz0d#6{s(+quQU6e z0<1Xzv^X-8QR!L$tyOX)qb>((Si)XGp~@qkt z*^0p&trdSE!5t@TzB%}BaWRok^OGT<(&LB7jORSC0X+cShqIgRcZIOth9lEIhXcIs znqh2(ApB1jR67@vBn(!EDYL&P}p8&yWc)n$wMSlTI}VjzTtN{GHF) zlnJKVp89OxysLe>Imzk2N^@r7_(_UpvLNdAYJ>j@!xs9V__4YgVIWa>d)|5CXn$Kj zG65R!a@ACTkn_7ZZHdk7Re@HmWjpHs)-Ie}c^7&}8~Z$=n`4nlHyOvuYJj zNhUx13;bZoEuW%c4G2;m{Vz0a zoGW-9J7(E9#NrviHq6xO<>Ad#FH9))1dnD%o;HpFmx71tuc4c9oGeHB@VGM7_HV7g z(YI(ejYFQ$O@N&vi;d&_>M9-fsF(S(MVKAGvd~D%MYr4-b?5><`_(Y?L$hIc@k|Eg zy+_v&`Z#{8QCqc^OmV+enX1FQ%mkJmKd{neRI=O!CNj7{2YP=`=%)Tu&wiFD-%rIL zo++_0@~dAXyJmpk7nnbMe~&r{o#jE&W>Jd>{s*grKHAE@us?$~9WBkG1N*0Dpq2;C zu3(-)MH4pCH1-n~f=)-kAIaaHmt}?{HQv|4%99G@eL?G7Gg_&J-ZEYx z)^nN~{~?^uJF5^T&>hLF^IVnZiSu5mNLDSMWqmQLt17qh{ASw#DM7k-rq10i4N4B>1tvlrf_01Iys)KjVD_W zp8S7U4P1GJi9j^Z(Ygp!RHWX31K2`9=QI!i1a+i^K>S43ZZ@oo4U6ObY*;=^_yD7k z_>SGSU$~L_XhCT|#547rm*hWdbJt(wce&Iva7p)m(@bM+>to%#GT7Bv+iX0otKIS; zz6Eg2BEoJ*Yv0A2UsWiIb`}!fv?WI0#ao#grW1L6aorYx3G5oI%l->5es!=__GL#| zyp^dgjJ*IX0)+$3?u=U{*5Cr|Fe7UCn4VMn1fC?k3?@r?h2ZSy+E;RZaX-Eyj6F$^ zwhfG9XPkzg$^iiv&XGig8q5*k;xGC;tAcL!%Pb>5(1Lv3c?IZxvYLmhHa+3Gdf*%% z&{)gA?iSeP@`U?;m@iO(FZwYWC7&?ml<%#-A7p%AubB!J&>dR_2bGRp!9X94wd(;B z4=(i+oUMwWvN`ymzK<7U9P}0f)q=7>9L(4F*KK*ZySrRHByRNFuz(1y6hPJA2I+$! z@ix-ut{&v6JfiYImBkuxbKnV^NOYm`c6OjY(=7MtKLmYQc%I3#?2WZeV1_jJbc~E_?tAe;U5^*t+&1Ba z=#>XXy#b`y?@Y|lyZmaEoOCP*3%Jlq0V+*@f)hWh=?AhlnB*nGpF)+!cd0wq+?&uqx;ZuGb<`5&DlV)<**B%<6>;@M|r^!`(FN@YOW4U@t7Stg1%#C_SIP0B;dMWG?N%yPK(iVlGl>%Ja z{!C|y!p)%3{ZF&)qtsSqs=tZnX&TSa$SoKIT~*nkk%|vFGtUK>#@ZI-W_vc)ZZe)Q zp$Pnw?ar{!$b;LnSTtP6tnr+P6ya5VQGN)m6bQlZH`dNK07UEfRBrG9vRf9BvN(ty zu6-CuktlzSAoz8BhPK4f|3kILmO7(^5sp%q$9@hZ;&(*yhY8Xz#pg}q9J97#tM9kMEPr?!Do#I+O!!j8V$nGXvEXwvkk9+;^Z#A zA2{{HM&Z<&&`K6TEX3G7C>I(@i^CNxZ>(Ly&w>q~98Ae$rf}UNe2+x=Yofwujmp4? z00_&N7CQr=ovL6gM(NN9F~7QlrH!@oP?EJ_kc;veQm4gsyiB1p{fS0_LZJax-kq0E zTg@8nLvN)AvyEbUAh4%p=FF@Id>OTH+kCioA!?~v$zN(7gp2N{n&BXeMEPmm%xoEW zC7{Z12>YF&z}Cs^gIXPPVo^L7vF2VPQ!%LB@`|B<5RYYl-5bNv1^}j7=3mlks8QL$ zB#C8IJX{cEo2xTrq|VnYMElW@)$O;xDA)e&-Ps&_*F=QLNlR;T8)zgO%BIIWrw_z9pWw2}IZ z-AKiYUj=nC3|w{<)B26Ri?=d$p}p)c?Pc+TxxP+D7jfNcvtggaNeV*=viE2kR-z`t zhLwJFR_$|^4f~qa-RE@keigBN1M z;_pmkh}7{5)EDyw9=3`Y8qWAWW4#HAHY^J8U+g7V;&vOhX}adPdIY<3;lYc}!3Xs} zcrk3)ib5!q0>90Mjcx&(%GB=;;j9azIYGb>As{hiK5&w588Ty817a^%ZXnTxY8c<8 zKH9LlJPnzx&hibQFL2!&(@?8p?d9r-m!s zOqUHmbArXXIl&Sew%J6=#OxVjmM*c&V8ap|#((_krtc5yz=ogI^gh;x5$UJGpF%Z~ z?@~8ySY4h?zpt}=r|`vU`r0j0`_a$(Ha^k zx?;8XiQln6OjN;=SP)ymf)6lJ@#~_AI-d{t7nLVs@r;Fqlpz-PB2z?uO)U7uFi|6Q zgprIzN)xqVh42X`sthMEQC~*em?ml&3}!&m*zn2D6YWH+U4hRqmho$1!e`S$jj|L> zWcW$sUW}kQ1rn1NSz|Lu2hs8(2R3BT?ocYw!nSl^ z!`;x@g0cEcqh6(OEM%GZ^cvE2P%e524?n_eE!JkMv2e$QsLpQu!v#RH0<|Xy_J!Yz z4O9^J=&siK%*m>5<<@T8@70~R7)xbP@CU=EIS>_0W>xie~KH$9-7{ z?1}FfkT4`6v}@qHEB1#$%^SIof!@aQd#5@IYbyNv*Hvb%2U#oXo$B~ExJua`tD5qKBW_8d+=!ldp*jp^E5f}aoFG!o{h*u5)Q@BKZ-rKWYuW6@f&l@rNe?{%t+_OC=cIfte8zYyl)!v?$fvd^wxe8-S z>h?TQay#0yKt8cOOPB9edmaZ#!bpnt^g;4dwdaUd$???>Z$^La<-F_n;#-Y%cT;-$ z&i^#_3^>%2dA^|+_#eK%clj^hOZdOsOZdB>)KlQkgFi;-+fMdxXnaOq#a34sZP;K2 z&n&N%+DE2SSUK+skJcf~d)ahsG82D|{IGJ4s}PK6Ah9yytpPS9emq`nravVdq>vcM;=;n?Z7#BU4?c)37x+*^#T^ zgFy7!JGB<>vA<$=s*Ns28zk^UrWD(Lbo(?}Qla0uU#wHTPJQm{9GhxPg9WdG*c-tHU4<#LZ9}K z5tEnvEA%_>do72RP?G2R0WVc+eT#b6Ivr>)sh?AnuP+2TMXNcLEmQYv0DF30>{q*g zANX9dnglszz)qFWLwQ-&iS;Zs6w^d5(&x(BO^RYxe(uNt{K7?h03Y(UxQD#8_OS~D z7gORNBChjKWrnJQL8iS${6NdG>gZ+dM0o1k+|||sBa7HvCI&7p$lQdonAE!BM=tAN zwsA(biWaJsQ|;LhxD^mL;l3vPrUef{$JzOWR5#1}PSp2~S`M2f^8eWT9{8w=YyVBM z(G?bU(V#)2MhO%IHHx-iv;wk<%C?)xTCCDii?{|`sqUh+1c*y&mSrt%;nlXj7N6Sk zT3$z_d%^U9(%p8j@@vc^?2#ki_2D=H?Y7Ny5L?fc&uyt19eMAyL(G&HsO!P=sBR^ z#KjtIWBEK$lg3GWK3zY*3-Kf|`pFbg`zD`r^+Drk?=66{8voYeUjYAt`1dgW+4A%A zbMR08%az|e`*1qYCy(?eeSQI&49+ck6o=H(v2F0ZcINq=1a~sQ&9#?#9U)wom%?>NF8O3+Rq`8{6dF0|6D6rl8ZdM3uf6@L^OUO7p|g7SF>G z&(?6&R<`9~0@9c01%7O4%UfM!aOt)n??q~kwJqt)x-EpGqO!RmZQ&MTqvvtfhl^GI zgbNi$fb1HfItn)z_P*D1*pw)s!2b!Rfm5Qm?FHvxz9M#7pnp>W@^Ler^EXBPo8%Ul zmKi>%;0E!-&^iypijW`Qjihi@i!C(HQuneaq;9lg3;ocl9F8De{YLTv zZihXDOEcT(mg0RJH(fW*rkR1ujUzNxU4mVXC?l7t^YGMYTW5Z{YU!v>G7FT*8xisD zT$-%(EegGyYADv#=kFA^B5+i%!jtrDe6A zKgPU&R30qAQG}z&&02I$F)&0de(!O~|E$qpErk)2T!7_yV~ zfjdUKSK!~JmEdE!Il27D|M9^8hQ-U$OyvKg2jO?%XUqEWv(_7K{6vPO`C^{##gCCZ z;M{8`bvpAxxU(JBvTsVn8+-gbU=ahB8!W=_*x;%7Jv9i&QO60v5%_hvYTiKcy`Ddt z91uh^uTF@@kl>LkSB86R@Pxgdzt|FX{N}9n{-xIY3g*l!n6J}a+w)(?G7pdX^DA=# zTNi^vj-9IaX-?WJpK=nX7>6gj)vXx+NGa;X<&t2CE9Fu#%;45=RjVyH31M0&e{I)( zSKzDYR&H<%jCJMe73lULK}K@PCVEO*Pd;iAyXVi~5GVoY>qT?2$Ik&50Dp*&!(VjC z5j+#W_8@{gVP22nf~9UVvc3h3sJ}rbM)0F>Rfo+$>D9*P7x6jj?Wmr?lUJb|0v`j! zz$R`kM|t(ntC43h$jvjS#%b>1Gsj2ZlBco$P_!An^Wn$vz& zVS7;t9uB^)|F&P{#zXXaTm-a{Su50!#4WTWF@f%vO!6ruE44kq9lPlD#pPE^V6I4EX@_hI<>n*{t7Yy7?SQxkt>#9tGxXu|4KA3k&_ybt2ub9-qSYQ##vH&!dMt?KnXUoPu4X;`F7_ zEX=j0%*2)3wdO)RV;>J~Mx((c-9cy@^z~w=+j9=S{)af*HOCcw1!*yVCoB_A(zgxd zt@aC3aJDaOje0w)<2D=*LHNJws_tLoAa+$@yQj5n)S?fcjNY^wP~#f_2EAR_O0csi zg?F(wDmk+GCHKB`xORA63U|1cL_9CKc6eV3?{hDScweF%+%0z+vyQwJ>cA~{t>KQG z;3(cp8p^c2^*}u0ZN(Z!D#H!jtq9R?TP;!F+W4t0v5gCO(1A8`IFJ_gA;ov{f9xzTg3h&4q6X#ToR1O8NSC=4KG0m2A~Rs~u%^dBtU zjk7UdNx*Ir@TtiB6=vokT6_3;QQLiX1W@7v&aaTM>QO8@+a7M>>G;Sj$c@5}`1Py0 zBFI7EeMomit^;oZWV@8bWd~`

>uE1F}QDViiwArV&6OJEOTI(f;&+%MK6aG#p|j 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 N2~0hK{~J%>zX84?q$~gc From 4d8f24d2ae77a9a0dcb6f44d5c5e7d678896f762 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 00:44:45 +0200 Subject: [PATCH 056/664] Removed old sqf version. --- addons/medical/XEH_preInit.sqf | 1 - .../functions/fnc_handleDamage_woundsOld.sqf | 143 ------------------ 2 files changed, 144 deletions(-) delete mode 100644 addons/medical/functions/fnc_handleDamage_woundsOld.sqf diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 4e77147a51..4f4ff5bc30 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -40,7 +40,6 @@ PREP(handleDamage_caching); PREP(handleDamage_fractures); PREP(handleDamage_internalInjuries); PREP(handleDamage_wounds); -PREP(handleDamage_woundsOld); PREP(handleUnitVitals); PREP(handleKilled); PREP(handleLocal); diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf deleted file mode 100644 index 0b1f169a8b..0000000000 --- a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Author: Glowbal - * Handling of the open wounds & injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter or source of the damage - * 4: Type of the damage done - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; -_unit = _this select 0; -_selectionName = _this select 1; -_damage = _this select 2; -_typeOfProjectile = _this select 3; -_typeOfDamage = _this select 4; - -// Convert the selectionName to a number and ensure it is a valid selection. -_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); -if (_bodyPartn < 0) exitwith {}; - -// Get the injury type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] -_injuryTypeInfo = missionNamespace getvariable [format[QGVAR(woundInjuryType_%1), _typeOfDamage],[[], false, []]]; - -// This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..] -_allInjuriesForDamageType = _injuryTypeInfo select 2; -// It appears we are dealing with an unknown type of damage. - -if (count _allInjuriesForDamageType == 0) then { - // grabbing the configuration for unknown damage type - _injuryTypeInfo = missionNamespace getvariable [QGVAR(woundInjuryType_unknown),[[], false, []]]; - _allInjuriesForDamageType = _injuryTypeInfo select 2; -}; - -// find the available injuries for this damage type and damage amount -_highestPossibleSpot = -1; -_highestPossibleDamage = -1; -_allPossibleInjuries = []; -{ - _damageLevels = _x select 4; - _minDamage = _damageLevels select 0; - _maxDamage = _damageLevels select 1; - - // Check if the damage is higher as the min damage for the specific injury - if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { - //_classType = _x select 0; - _selections = _x select 1; - //_bloodLoss = _x select 2; - //_pain = _x select 3; - - // Check if the injury can be applied to the given selection name - if ("All" in _selections || _selectionName in _selections) then { - - // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries - if (_minDamage > _highestPossibleDamage) then { - _highestPossibleSpot = _foreachIndex; - _highestPossibleDamage = _minDamage; - }; - - // Store the valid possible injury for the damage type, damage amount and selection - _allPossibleInjuries pushback _x; - }; - }; -}foreach _allInjuriesForDamageType; - -// No possible wounds available for this damage type or damage amount. -if (_highestPossibleSpot < 0) exitwith {}; - -// Administration for open wounds and ids -_openWounds = _unit getvariable[QGVAR(openWounds), []]; -_woundID = _unit getvariable[QGVAR(lastUniqueWoundID), 1]; - -_painToAdd = 0; -_woundsCreated = []; -{ - if (_x select 0 <= _damage) exitwith { - for "_i" from 0 to (1+ floor(random(_x select 1)-1)) /* step +1 */ do { - - // Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage] - _toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {_allPossibleInjuries select (floor(random (count _allPossibleInjuries)));}; - _toAddClassID = _toAddInjury select 0; - _foundIndex = -1; - - _bodyPartNToAdd = if (_injuryTypeInfo select 1) then {_bodyPartn} else {floor(random(6))}; - // If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it.. - if ((_injuryTypeInfo select 1)) then { - { - // Check if we have an id of the given class on the given bodypart already - if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { - _foundIndex = _foreachIndex; - }; - }foreach _openWounds; - }; - - _injury = []; - if (_foundIndex < 0) then { - // Create a new injury. Format [ID, classID, bodypart, percentage treated, bloodloss rate] - _injury = [_woundID, _toAddInjury select 0, _bodyPartNToAdd, 1, _toAddInjury select 2]; - - // Since it is a new injury, we will have to add it to the open wounds array to store it - _openWounds pushback _injury; - - // New injuries will also increase the wound ID - _woundID = _woundID + 1; - } else { - // We already have one of these, so we are just going to increase the number that we have of it with a new one. - _injury = _openWounds select _foundIndex; - _injury set [3, (_injury select 3) + 1]; - }; - // Store the injury so we can process it later correctly. - _woundsCreated pushback _injury; - - // Collect the pain that is caused by this injury - _painToAdd = _painToAdd + (_toAddInjury select 3); - }; - }; -}foreach (_injuryTypeInfo select 0); // foreach damage thresholds - -_unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; - -// Only update if new wounds have been created -if (count _woundsCreated > 0) then { -// _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true]; -}; - -if (USE_WOUND_EVENT_SYNC) then { - // Broadcast the new injuries across the net in parts. One broadcast per injury. Prevents having to broadcast one massive array of injuries. - { - // ["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent); - }foreach _woundsCreated; -}; - -_painLevel = _unit getvariable [QGVAR(pain), 0]; -_unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; \ No newline at end of file From 556b9ad7d8af7719fd6ee7eec4c4a3b72f9aab2d Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 00:47:42 +0200 Subject: [PATCH 057/664] removed debug prints --- .../medical/functions/fnc_parseConfigForInjuries.sqf | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf index 9a46e26321..1b2db7c278 100644 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical/functions/fnc_parseConfigForInjuries.sqf @@ -132,9 +132,7 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); }; }foreach _typeThresholds; - _extensionInput = format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _foreachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType]; - diag_log format["Calling extension with input: %1", _extensionInput]; - diag_log format ["Extension return: %1", "ace_medical" callExtension _extensionInput]; + "ace_medical" callExtension format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _foreachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType]; }foreach _allFoundDamageTypes; @@ -169,11 +167,9 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); }; }foreach _causesArray; _classDisplayName = _x select 6; - _extensionInput = format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; - diag_log format["Calling extension with input: %1", _extensionInput]; - diag_log format ["Extension return: %1", "ace_medical" callExtension _extensionInput]; + "ace_medical" callExtension format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; }foreach _allWoundClasses; -diag_log format["Extension configComplete: %1", "ace_medical" callExtension "ConfigComplete"]; +"ace_medical" callExtension "ConfigComplete"; From 4bebedf73e179c8c5755b56b433ba378f916f392 Mon Sep 17 00:00:00 2001 From: gienkov Date: Sun, 17 May 2015 00:53:55 +0200 Subject: [PATCH 058/664] Stringtable Zeus and View Distance * Stringtabled ACE Zeus module * Stringtabled ACE View Distance * Lowered default view distance to 1500 because default value (10000) makes enormous FPS drop at start for low end machines --- addons/viewdistance/ACE_Settings.hpp | 34 +++--- addons/viewdistance/CfgVehicles.hpp | 14 ++- .../functions/fnc_changeViewDistance.sqf | 6 +- addons/viewdistance/stringtable.xml | 103 ++++++++++++++++++ addons/zeus/ACE_Settings.hpp | 2 +- addons/zeus/CfgFactionClasses.hpp | 2 +- addons/zeus/CfgVehicles.hpp | 30 ++--- addons/zeus/stringtable.xml | 71 ++++++++++++ 8 files changed, 219 insertions(+), 43 deletions(-) create mode 100644 addons/viewdistance/stringtable.xml create mode 100644 addons/zeus/stringtable.xml diff --git a/addons/viewdistance/ACE_Settings.hpp b/addons/viewdistance/ACE_Settings.hpp index a3460cddf3..b56bcd2703 100644 --- a/addons/viewdistance/ACE_Settings.hpp +++ b/addons/viewdistance/ACE_Settings.hpp @@ -2,47 +2,45 @@ class ACE_Settings { class GVAR(enabled) { typeName = "BOOL"; value = 1; - displayName = "Enable ACE viewdistance"; - description = "Enables ACE viewdistance module."; + displayName = "$STR_ACE_ViewDistance_enabled_DisplayName"; + description = "$STR_ACE_ViewDistance_enabled_Description"; }; class GVAR(viewDistanceOnFoot) { typeName = "SCALAR"; isClientSettable = 1; - value = 11; // index, NOT value // Can set it to client's actual viewdistance in the init function once ACE_Settings supports numbers (if ever). + value = 0; // index, NOT value // Can set it to client's actual viewdistance in the init function once ACE_Settings supports numbers (if ever). values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf - displayName = "Client View Distance (On Foot)"; - description = "Changes in game view distance when the player is on foot."; + displayName = "$STR_ACE_ViewDistance_onFoot_DisplayName"; + description = "$STR_ACE_ViewDistance_onFoot_Description"; }; class GVAR(viewDistanceLandVehicle) { typeName = "SCALAR"; isClientSettable = 1; - value = 11; // index, NOT value + value = 0; // index, NOT value values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf - displayName = "Client View Distance (Land Vehicle)"; - description = "Changes in game view distance when the player is in a land vehicle."; + displayName = "$STR_ACE_ViewDistance_landVehicle_DisplayName"; + description = "$STR_ACE_ViewDistance_landVehicle_Description"; }; class GVAR(viewDistanceAirVehicle) { typeName = "SCALAR"; isClientSettable = 1; - value = 11; // index, NOT value + value = 0; // index, NOT value values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf - displayName = "Client View Distance (Air Vehicle)"; - description = "Changes in game view distance when the player is in an air vehicle."; + displayName = "$STR_ACE_ViewDistance_airVehicle_DisplayName"; + description = "$STR_ACE_ViewDistance_airVehicle_Description"; }; class GVAR(limitViewDistance) { typeName = "SCALAR"; value = 10000; // Value, NOT index. 10000 is the maximum in A3 - displayName = "View Distance Limit"; - description = "Limit for client's view distance set here and can overridden by module"; + displayName = "$STR_ACE_ViewDistance_limit_DisplayName"; + description = "$STR_ACE_ViewDistance_limit_setting"; }; class GVAR(objectViewDistanceCoeff) { typeName = "SCALAR"; isClientSettable = 1; value = 0; // index. Actual coefficient is given by functions/fnc_returnObjectCoeff.sqf - values[] = {"Off","Very Low","Low","Medium","High","Very High"}; - displayName = "Dynamic Object View Distance"; - description = "Sets the object view distance as a coefficient of the view distance."; + values[] = {"$STR_ACE_ViewDistance_object_off","$STR_ACE_ViewDistance_object_verylow","$STR_ACE_ViewDistance_object_low","$STR_ACE_ViewDistance_object_medium","$STR_ACE_ViewDistance_object_high","$STR_ACE_ViewDistance_object_veryhigh"}; + displayName = "$STR_ACE_ViewDistance_object_DisplayName"; + description = "$STR_ACE_ViewDistance_object_Description"; }; }; - -// To do: include string table style displayName & description. \ No newline at end of file diff --git a/addons/viewdistance/CfgVehicles.hpp b/addons/viewdistance/CfgVehicles.hpp index 63a50cf099..cda9d4e332 100644 --- a/addons/viewdistance/CfgVehicles.hpp +++ b/addons/viewdistance/CfgVehicles.hpp @@ -4,23 +4,27 @@ class CfgVehicles { author = "$STR_ACE_Common_ACETeam"; category = "ACE"; function = QUOTE(DFUNC(initModule)); - displayName = "View Distance Limiter"; + displayName = "$STR_ACE_ViewDistance_Module_DisplayName"; scope = 2; isGlobal = 1; //icon = ""; // needs an icon class Arguments { class moduleViewDistanceEnabled { - displayName = "Enable ACE viewdistance"; - description = "Enables ACE viewdistance"; + displayName = "$STR_ACE_ViewDistance_enabled_DisplayName"; + description = "$STR_ACE_ViewDistance_enabled_Description"; typeName = "BOOL"; defaultValue = 1; }; class moduleViewDistanceLimit { - displayName = "View Distance Limit"; - description = "Sets the limit for how high clients can raise their view distance (<= 10000)"; + displayName = "$STR_ACE_ViewDistance_limit_DisplayName"; + description = "$STR_ACE_ViewDistance_limit_Description"; typeName = "NUMBER"; defaultValue = 10000; }; + }; + class ModuleDescription { + description = "$STR_ACE_ViewDistance_Module_Description"; + sync[] = {}; }; }; }; \ No newline at end of file diff --git a/addons/viewdistance/functions/fnc_changeViewDistance.sqf b/addons/viewdistance/functions/fnc_changeViewDistance.sqf index 7c70a612eb..7d5f8150dc 100644 --- a/addons/viewdistance/functions/fnc_changeViewDistance.sqf +++ b/addons/viewdistance/functions/fnc_changeViewDistance.sqf @@ -28,13 +28,13 @@ _view_distance_limit = GVAR(limitViewDistance); // Grab the limit if (_show_prompt) then { _text = if (_new_view_distance <= _view_distance_limit) then { - format ["View Distance: %1m",str(_new_view_distance)]; + format ["%1 %2m", (localize "STR_ACE_ViewDistance_infotext"), str(_new_view_distance)]; } else { - format ["That option is invalid! The limit is %1m",str(_view_distance_limit)]; + format ["%1 %2m", (localize "STR_ACE_ViewDistance_invalid"), str(_view_distance_limit)]; }; if (GVAR(objectViewDistanceCoeff) > 0) then { - _text = _text + format ["
Object View Distance is %1%2",str(_object_view_distance_coeff * 100),"%"]; + _text = _text + format ["
%1 %2%3", (localize "STR_ACE_ViewDistance_objectinfotext"), str(_object_view_distance_coeff * 100),"%"]; }; [parseText _text,2] call EFUNC(common,displayTextStructured); }; diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml new file mode 100644 index 0000000000..b43f24e4d5 --- /dev/null +++ b/addons/viewdistance/stringtable.xml @@ -0,0 +1,103 @@ + + + + + + View Distance Limiter + Ogranicznik zasięgu widzenia + + + Allows limiting maximum view distance that can be set by players. + Pozwala ustawić maksymalny limit zasięgu widzenia. + + + Enable ACE viewdistance + Wł. zasięg widzenia ACE + + + Enables ACE viewdistance + Aktywuje możliwość zmiany zasięgu widzenia w menu ustawień ACE + + + View Distance Limit + Limit zas. widzenia + + + Sets the limit for how high clients can raise their view distance (up to 10000) + Ustawia maksymalny limit zasięgu widzenia jaki mogą ustawić gracze (do 10000) + + + Limit for client's view distance set here and can overridden by module + Limit zasięgu widzenia jest ustawiany tutaj i może zostać nadpisany poprzez moduł + + + Client View Distance (On Foot) + Zasięg widzenia (piechota) + + + Changes in game view distance when the player is on foot. + Zmienia zasięg widzenia kiedy gracz porusza się na piechotę. + + + Client View Distance (Land Vehicle) + Zasięg widzenia (pojazdy naziemne) + + + Changes in game view distance when the player is in a land vehicle. + Zmienia zasięg widzenia kiedy gracz porusza się pojazdami naziemnymi. + + + Client View Distance (Air Vehicle) + Zasięg widzenia (pojazdy lotnicze) + + + Changes in game view distance when the player is in an air vehicle. + Zmienia zasięg widzenia kiedy gracz porusza się pojazdami lotniczymi. + + + Dynamic Object View Distance + Dynamiczny zasięg rysowania obiektów + + + Sets the object view distance as a coefficient of the view distance. + Zmienia zasięg rysowania obiektów jako mnożnik zasięgu widzenia. + + + Off + Wyłącz + + + Very Low + Bardzo niski + + + Low + Niski + + + Medium + Średni + + + High + Wysoki + + + Very High + Bardzo wysoki + + + View Distance: + Zasięg widzenia: + + + Object View Distance is + Zasięg widzenia obiektów wynosi + + + That option is invalid! The limit is + Ta opcja jest nieprawidłowa! Limit wynosi + + + + diff --git a/addons/zeus/ACE_Settings.hpp b/addons/zeus/ACE_Settings.hpp index 536790ba26..2630c72dff 100644 --- a/addons/zeus/ACE_Settings.hpp +++ b/addons/zeus/ACE_Settings.hpp @@ -18,6 +18,6 @@ class ACE_Settings { class GVAR(revealMines) { typeName = "SCALAR"; value = 0; - values[] = {"Disabled", "Partially", "Fully"}; + values[] = {"$STR_ACE_Zeus_revealMines_disable", "$STR_ACE_Zeus_revealMines_partial", "$STR_ACE_Zeus_revealMines_full"}; }; }; diff --git a/addons/zeus/CfgFactionClasses.hpp b/addons/zeus/CfgFactionClasses.hpp index bf34546727..da8e845a43 100644 --- a/addons/zeus/CfgFactionClasses.hpp +++ b/addons/zeus/CfgFactionClasses.hpp @@ -1,6 +1,6 @@ class CfgFactionClasses { class NO_CATEGORY; class ADDON: NO_CATEGORY { - displayName = "ACE Zeus"; + displayName = "$STR_ACE_Zeus_category"; }; }; diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 7d145c8421..cb7346e18d 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { class GVAR(moduleZeusSettings): ACE_Module { scope = 2; - displayName = "Zeus Settings [ACE]"; + displayName = "$STR_ACE_Zeus_Module_DisplayName"; //icon = QUOTE(PATHTOF(iconGoesHere)); category = "ACE_zeus"; function = QUOTE(DFUNC(moduleZeusSettings)); @@ -15,52 +15,52 @@ class CfgVehicles { author = "SilentSpike"; class Arguments { class zeusAscension { - displayName = "Ascension Messages"; - description = "Display global popup messages when a player is assigned as Zeus."; + displayName = "$STR_ACE_Zeus_ascension_DisplayName"; + description = "$STR_ACE_Zeus_ascension_Description"; typeName = "BOOL"; defaultValue = 0; }; class zeusBird { - displayName = "Zeus Eagle"; - description = "Spawn an eagle that follows the Zeus camera."; + displayName = "$STR_ACE_Zeus_bird_DisplayName"; + description = "$STR_ACE_Zeus_bird_Description"; typeName = "BOOL"; defaultValue = 0; }; class remoteWind { - displayName = "Wind Sounds"; - description = "Play wind sounds when Zeus remote controls a unit."; + displayName = "$STR_ACE_Zeus_remoteWind_DisplayName"; + description = "$STR_ACE_Zeus_remoteWind_Description"; typeName = "BOOL"; defaultValue = 0; }; class radioOrdnance { - displayName = "Ordnance Warning"; - description = "Play a radio warning when Zeus uses ordnance."; + displayName = "$STR_ACE_Zeus_radioOrdnance_DisplayName"; + description = "$STR_ACE_Zeus_radioOrdnance_Description"; typeName = "BOOL"; defaultValue = 0; }; class revealMines { - displayName = "Reveal Mines"; - description = "Reveal mines to allies and/or place map markers."; + displayName = "$STR_ACE_Zeus_revealMines_DisplayName"; + description = "$STR_ACE_Zeus_revealMines_Description"; typeName = "NUMBER"; class values { class disable { - name = "Disabled"; + name = "$STR_ACE_Zeus_revealMines_disable"; value = 0; default = 1; }; class partial { - name = "Reveal to Allies"; + name = "$STR_ACE_Zeus_revealMines_partial"; value = 1; }; class full { - name = "Allies + Map Markers"; + name = "$STR_ACE_Zeus_revealMines_full"; value = 2; }; }; }; }; class ModuleDescription { - description = "Provides control over various aspects of Zeus."; + description = "$STR_ACE_Zeus_Module_Description"; sync[] = {}; }; }; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml new file mode 100644 index 0000000000..5fa8215294 --- /dev/null +++ b/addons/zeus/stringtable.xml @@ -0,0 +1,71 @@ + + + + + + Zeus Settings [ACE] + Ustawienia Zeusa [ACE] + + + Provides control over various aspects of Zeus. + Pozwala kontrolować różne aspekty Zeusa. + + + Ascension Messages + Wiad. o nowym Zeusie + + + Display global popup messages when a player is assigned as Zeus. + Wyświetlaj globalną wiadomość kiedy gracz zostanie przydzielony jako Zeus + + + Zeus Eagle + Orzeł Zeusa + + + Spawn an eagle that follows the Zeus camera. + Spawnuj orła, który podąrza za kamerą Zeusa. + + + Wind Sounds + Dźwięki wiatru + + + Play wind sounds when Zeus remote controls a unit. + Odtwarzaj dźwięki wiatru kiedy Zeus zdalnie kontroluje jednostkę. + + + Ordnance Warning + Ostrz. o ostrzale arty. + + + Play a radio warning when Zeus uses ordnance. + Odtwarzaj wiadomość radiową kiedy Zeus używa artylerii. + + + Reveal Mines + Pokazuj miny + + + Reveal mines to allies and/or place map markers. + Pokazuj znaczniki min dla sojuszników i/lub twórz markery na mapie w miejscu min. + + + Disabled + Wyłączone + + + Reveal to Allies + Pokaż dla sojuszników + + + Allies + Map Markers + Sojusznicy + markery na mapie + + + ACE Zeus + ACE Zeus + + + + From ea639e51a1ef0a68d081b6286ff77b365f6f588e Mon Sep 17 00:00:00 2001 From: LKS90 Date: Sun, 17 May 2015 01:09:27 +0200 Subject: [PATCH 059/664] Added steps I had to do for windows to make ace3 --- .../development/setting-up-the-development-environment.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/development/setting-up-the-development-environment.md b/documentation/development/setting-up-the-development-environment.md index 3de25d3ea9..9dde996632 100644 --- a/documentation/development/setting-up-the-development-environment.md +++ b/documentation/development/setting-up-the-development-environment.md @@ -17,8 +17,8 @@ This page describes how you can setup your development environment for ACE3, all - A properly setup P-drive - Run ArmA 3 and Arma 3 Tools directly from steam once to install registry entries (and again after every update) - Python 3.x, available [here](http://www.python.org) -- The following Mikero Tools (available [here](https://dev.withsix.com/projects/mikero-pbodll/files)): DePBO, Rapify, MakePBO, PBOProject -- A properly setup PATH variable (containing Python and the Mikero tools) +- The following Mikero Tools (available [here](https://dev.withsix.com/projects/mikero-pbodll/files)): DePBO, DeOgg, Rapify, MakePBO, PBOProject +- A properly setup PATH variable (containing Python ,the Mikero tools and Github if you are using it) ## 2. Why so complicated? From 62641bc5fc0dbbb20c7c6ced5fd826aa1ca8b17e Mon Sep 17 00:00:00 2001 From: LKS90 Date: Sun, 17 May 2015 02:02:36 +0200 Subject: [PATCH 060/664] changed GitHub to git (for correctness) --- .../development/setting-up-the-development-environment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/development/setting-up-the-development-environment.md b/documentation/development/setting-up-the-development-environment.md index 9dde996632..04e9ee9d9c 100644 --- a/documentation/development/setting-up-the-development-environment.md +++ b/documentation/development/setting-up-the-development-environment.md @@ -18,7 +18,7 @@ This page describes how you can setup your development environment for ACE3, all - Run ArmA 3 and Arma 3 Tools directly from steam once to install registry entries (and again after every update) - Python 3.x, available [here](http://www.python.org) - The following Mikero Tools (available [here](https://dev.withsix.com/projects/mikero-pbodll/files)): DePBO, DeOgg, Rapify, MakePBO, PBOProject -- A properly setup PATH variable (containing Python ,the Mikero tools and Github if you are using it) +- A properly setup PATH variable (containing Python ,the Mikero tools and git) ## 2. Why so complicated? From 2544cdef4ae78487d0a51a2fb00b68fa204c5cb4 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 09:48:59 +0200 Subject: [PATCH 061/664] Clean up --- extensions/medical/handleDamage.cpp | 9 +------ extensions/medical/handleDamage.h | 41 +++++++++++++++++++---------- extensions/medical/medical.cpp | 3 +-- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp index f6756072d7..0cd31dd273 100644 --- a/extensions/medical/handleDamage.cpp +++ b/extensions/medical/handleDamage.cpp @@ -50,7 +50,6 @@ namespace ace { return stream.str(); } - stream << ""; return stream.str(); } @@ -152,8 +151,6 @@ namespace ace { { if (input.size() == 9) { - // TODO parse arrays from string input - int ID = std::stod(input[0]); std::string className = input[1]; std::vector allowedSelections = inputToVector(input[2]); @@ -186,10 +183,8 @@ namespace ace { return "failed"; } - std::string handleDamage::FinalizeDefinitions() + void handleDamage::FinalizeDefinitions() { - std::stringstream outputstream; - // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. for each (std::shared_ptr damageType in damageTypes) { @@ -202,9 +197,7 @@ namespace ace { damageType->possibleInjuries.push_back(injuryType); } } - outputstream << " ---- For: " << damageType->typeName << " Added: " << damageType->possibleInjuries.size() << " --- "; } - return outputstream.str(); } int handleDamage::SelectionToNumber(const std::string& selectionName) diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h index 650f677445..3b2cd739c8 100644 --- a/extensions/medical/handleDamage.h +++ b/extensions/medical/handleDamage.h @@ -24,42 +24,55 @@ namespace ace { ~handleDamage(); /** + * Find new open wounds from advanced medical based upon the received damage. * + * @param selectionName A string representation of the bodypart (for example: leg_r) + * @param amountOfDamage The damage received + * @param typeOfDamage The type of the damage received + * @param woundID latest wound ID + * @return SQF string containing _woundsCreated and _painAdded. */ std::string HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage, int woundID); + /** + * Find new open wounds from advanced medical based upon the received damage. + * + * @param typeOfDamage The type of the damage received + * @param amountOfDamage The damage received + * @param selection A number representation of the bodypart. Number from 0 to 6. + * @param woundID latest wound ID + * @return New open wounds. + */ std::vector GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection, int woundID); /** - * + * Add a new damage type from extension input parameters + * + * @param sqfDamageTypeDefinition + * @return String with result of addition: ADDED [parameters] or FAILED */ std::string AddDamageType(const std::vector& sqfDamageTypeDefinition); /** + * Add a new injury type from extension input parameters * + * @param sqfDamageTypeDefinition + * @return String with result of addition: ADDED [parameters] or FAILED */ std::string AddInjuryType(const std::vector& sqfInjuryDefinition); /** + * Convert a selectionName to a number * - */ - //static std::string SetInjuryTypeData(const std::string& data); - - - /** - * + * @param selectionName + * @return number of selection */ int SelectionToNumber(const std::string& selectionName); /** - * + * Lets the system know that all data has been added */ - //static std::vector> GetInjuryInfoFor(const std::string& damageType); - - /** - * - */ - std::string FinalizeDefinitions(); + void FinalizeDefinitions(); private: handleDamage(); diff --git a/extensions/medical/medical.cpp b/extensions/medical/medical.cpp index 9a93060b2e..4f25472e26 100644 --- a/extensions/medical/medical.cpp +++ b/extensions/medical/medical.cpp @@ -35,7 +35,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { } else { - std::string returnValue = ""; std::vector arguments = parseExtensionInput(function); if (arguments.size() > 0) @@ -59,7 +58,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { } } else if (command == "ConfigComplete") { - returnValue = ace::medical::handleDamage::GetInstance().FinalizeDefinitions(); + ace::medical::handleDamage::GetInstance().FinalizeDefinitions(); } } strncpy(output, returnValue.c_str(), outputSize); From 2b91d398f0f7d5cff4deb55505a62326173bbfce Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 09:51:34 +0200 Subject: [PATCH 062/664] added extension to config --- addons/medical/config.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index cd0fe0e66c..f86f5d166e 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -21,3 +21,7 @@ class CfgPatches { #include "ACE_Settings.hpp" #include "UI\RscTitles.hpp" #include "UI\triagecard.hpp" + +class ACE_Extensions { + extensions[] += {"ace_medical"}; +}; From c9116456937b463b135cde9261bd27e240309e74 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 17 May 2015 09:55:38 +0200 Subject: [PATCH 063/664] added new version of dll --- ace_medical.dll | Bin 225280 -> 223232 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ace_medical.dll b/ace_medical.dll index 98682d89b99b4fecc4731e5c0d6007bf2130ddcd..475a1e3fbbdc19876090912c596bec42e1ca636d 100644 GIT binary patch delta 58107 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%0DiFR5T?9(xqAljscEK-B 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 delta 59298 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 GlKu}g$7ojo From 4513b02c1068385957fd6d832950e319eaa4cce6 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 17 May 2015 12:57:55 +0200 Subject: [PATCH 064/664] Experiment with the bullet trace effect size --- addons/advanced_ballistics/functions/fnc_handleFired.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index bb0b649da4..3567efc1bb 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -132,7 +132,7 @@ GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000; }; if (_bulletTraceVisible && _bulletSpeed > 600) then { - drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.0157480315*_caliber,0.00787401574*_caliber],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""]; + drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[sqrt(0.006*_caliber),sqrt(0.003*_caliber)],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""]; }; call compile ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(time), time - floor(time)]); From 13740d9f321e0ed7ec7e64bdc0f799a14190056d Mon Sep 17 00:00:00 2001 From: ODK-Bn Date: Sun, 17 May 2015 13:25:08 +0200 Subject: [PATCH 065/664] translated the missing strings into Russian --- addons/medical/stringtable.xml | 91 ++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 9e818e8ca3..78a2627e9a 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -2703,366 +2703,457 @@ ACE Medical + ACE: медицина ACE Opcje medyczne Medical Settings [ACE] + Настройки медицины [ACE] Ustawienia medyczne [ACE] Medical Level + Сложность медицины Poziom medyczny What is the medical simulation level? + Каков уровень сложности медицинской системы? Jaki jest poziom symulacji medycznej? Basic + Базовый Podstawowy Advanced + Усложненный Zaawansowany Medics setting + Настройки медиков Poziom medyków What is the level of detail prefered for medics? + Каков уровень подробностей для медиков? Jaki jest poziom detali medycznych wyświetlanych dla medyków? Disable medics + Отключить медиков Wyłącz medyków Enable Litter + Включить мусор Aktywuj odpadki Enable litter being created upon treatment + Включить появление мусора после лечения Twórz odpadki medyczne podczas leczenia Life time of litter objects + Время удаления мусора Długość życia odpadków How long should litter objects stay? In seconds. -1 is forever. + Как долго мусор будет оставаться на земле? В секундах. -1 означает бесконечное время. Ile czasu musi upłynąć, aby odpadki zaczęły znikać? W sekundach. -1 dla nieskończoności. Enable Screams + Включить крики Aktywuj wrzaski Enable screaming by injuried units + Включить крики раненных бойцов Aktywuj wrzeszczenie z bólu przez ranne jednostki Player Damage + Урон игроку Próg obrażeń graczy What is the damage a player can take before being killed? + Какой уровень урона необходим, чтобы убить игрока? Jaki jest próg obrażeń, jakie gracz może otrzymać zanim zostanie zabity? AI Damage + Урон ботам Próg obrażeń AI What is the damage an AI can take before being killed? + Какой уровень урона необходим, чтобы убить бота? Jaki jest próg obrażeń, jakie AI może otrzymać zanim zostanie zabite? AI Unconsciousness + Потеря сознания ботами Nieprzytomność AI Allow AI to go unconscious + Позволить ботам терять сознание Czy AI może być nieprzytomne od odniesionych obrażeń? Disabled + Отключено Wyłączone Enabled + Включено Włączone Prevent instant death + Отключить мгновенную смерть Wył. natychmiast. śmierć Have a unit move to unconscious instead of death + Бойцы теряют сознание вместо того, чтобы умирать Spraw, aby jednostka została przeniesiona do stanu nieprzytomności zamiast ginąć na miejscu od śmiertelnych obrażeń Bleeding coefficient + Коэффициент потери крови Mnożnik krwawienia Coefficient to modify the bleeding speed + Коэффициент, изменяющий скорость кровопотери Mnożnik modyfikujący prędkość wykrwawiania się Pain coefficient + Коэффициент боли Mnożnik bólu Coefficient to modify the pain intensity + Коэффициент, изменяющий уровень боли Mnożnik modyfikujący intensywność bólu Sync status + Синхронизация статуса Synchronizuj status Keep unit status synced. Recommended on. + Синхронизировать статус юнитов. Рекомендуется включить. Utrzymuj synchronizację statusu jednostek. Zalecane zostawienie tej opcji włączonej. Provides a medical system for both players and AI. + Включает медицинскую систему как для игроков, так и для ботов. Moduł ten dostarcza system medyczny dla graczy oraz AI. Advanced Medical Settings [ACE] + Настройки усложненной медицины [ACE] Zaawansowane ustawienia medyczne [ACE] Enabled for + Включено для Aktywne dla Select what units the advanced medical system will be enabled for + Выберите, на кого будет распространяться усложненная система медицины Wybierz dla kogo zaawansowany system medyczny będzie aktywny Players only + Игроков Tylko dla graczy Players and AI + Игроков и ботов Gracze oraz AI Enable Advanced wounds + Включить усложненные ранения Akt. zaawansowane rany Allow reopening of bandaged wounds? + Будут ли открываться уже перевязанные раны? Pozwól na otwieranie się zabandażowanych ran? Vehicle Crashes + Аварии транспорта Obrażenia od kolizji Do units take damage from a vehicle crash? + Должны ли юниты получать повреждения от аварий на транспорте? Czy jednostki otrzymują obrażenia w wyniku kolizji pojazdów? Allow PAK + Использование аптечки Ust. apteczek osobistych Who can use the PAK for full heal? + Кому разрешено выполнять полное лечение с помощью аптечки? Kto może skorzystać z apteczki osobistej w celu pełnego uleczenia? Anyone + Кем угодно Wszyscy Medics only + Только медиками Tylko medycy Doctors only + Только врачами Tylko doktorzy Remove PAK on use + Удалять аптечки после использования Usuń apteczkę po użyciu Should PAK be removed on usage? + Нужно ли удалять аптечки после использования? Czy apteczka osobista powinna zniknąć z ekwipunku po jej użyciu? Locations PAK + Место использования аптечки Ogr. apteczek osobistych Where can the personal aid kit be used? + Где может использоваться аптечка? Gdzie można korzystać z apteczek osobistych? Anywhere + Где угодно Wszędzie Medical vehicles + В медицинском транспорте Pojazdy medyczne Medical facility + В госпитале Budynki medyczne Vehicles & facility + В транспорте и госпитале Pojazdy i budynki medyczne Disabled + Отключено Wyłączone Allow Surgical kit (Adv) + Разрешить хирургический набор (усл.) Ust. zestawu chirurg. Who can use the surgical kit? + Кто может использовать хирургический набор? Kto może skorzystać z zestawu chirurgicznego w celu zszycia ran? Remove Surgical kit (Adv) + Удалять хирургический набор (усл.) Usuń zest. chir. po użyciu Should Surgical kit be removed on usage? + Нужно ли удалять хирургический набор после использования? Czy zestaw chirurgiczny powinien zniknąć z ekwipunku po jego użyciu? Locations Surgical kit (Adv) + Место использования хирургического набора (усл.) Ogr. zestawu chirurg. Where can the Surgical kit be used? + Где может использоваться хирургический набор? Gdzie można korzystać z zestawu chirurgicznego? Configure the treatment settings from ACE Medical + Настройка лечения в медицинской системе ACE Skonfiguruj zaawansowane ustawienia leczenia systemu medycznego ACE Revive Settings [ACE] + Настройки реанимации [ACE] Ustawienia wskrzeszania [ACE] Enable Revive + Включить реанимацию Aktywuj wskrzeszanie Enable a basic revive system + Включить базовую систему реанимации Aktywuj podstawowy system wskrzeszania Max Revive time + Макс. время реанимации Maks. czas agonii Max amount of seconds a unit can spend in revive state + Максимальное время в секундах, в течение которого бойца можно реанимировать Maksymalna długość agonii w sekundach (czas na wskrzeszenie) Max Revive lives + Макс. кол-во жизней Maks. ilość wskrzeszeń Max amount of lives a unit. 0 or -1 is disabled. + Максимальное количество жизней у бойца. Чтобы отключить, укажите 0 или -1. Maksymalna ilość wskrzeszeń. Wpisz 0 lub -1 aby wyłączyć. Provides a medical system for both players and AI. + Включает медицинскую систему как для игроков, так и для ботов. Moduł ten aktywuje podstawowy system wskrzeszania. Jednostka po otrzymaniu śmiertelnych obrażeń przechodzi do stanu agonii, która trwa określoną długość czasu. W tym czasie aby wskrzesić i jednocześnie odratować jednostkę należy opatrzeć jej rany i wykonać RKO. Set Medic Class [ACE] + Сделать медиком [ACE] Ustaw klasę medyka [ACE] List + Список Lista List of unit names that will be classified as medic, separated by commas. + Список имен юнитов, которые будут считаться медиками (через запятую). Lista nazw jednostek, które są sklasyfikowane jako medycy, oddzielone przecinkami. Is Medic + Является медиком Klasa medyczna + None + Нет Żadna Regular medic + Обычный медик Zwykły medyk Doctor (Only Advanced Medics) + Врач (только усложн.) Doktor (tylko zaawansowani medycy) Assigns the ACE medic class to a unit + Задает юниту класс медика Moduł ten przypisuje klasę medyka ACE do jednostek. Set Medical Vehicle [ACE] + Сделать мед. транспортом [ACE] Ustaw pojazd medyczny [ACE] List + Список Lista List of vehicles that will be classified as medical vehicle, separated by commas. + Список транспортных средств, которые будут считаться медицинским транспортом (через запятую). Lista nazw pojazdów, które są sklasyfikowane jako pojazdy medyczne, oddzielone przecinkami. Is Medical Vehicle + Является мед. транспортом Jest pojazdem med. Whatever or not the objects in the list will be a medical vehicle. + Будут ли объекты в списке считаться медицинским транспортом. Czy pojazdy z tej listy są pojazdami medycznymi. Assigns the ACE medic class to a unit + Задает юниту класс медика Moduł ten pozwala na przypisanie danym pojazdom statusu pojazdów medycznych. Wewnątrz takiego pojazdu można wykonywać zaawansowane zabiegi medyczne. Set Medical Facility [ACE] + Сделать госпиталем [ACE] Ustaw budynek medyczny [ACE] Is Medical Facility + Является госпиталем Jest budynkiem med. Registers an object as a medical facility + Определяет объект в качестве госпиталя Przypisuje danemu obiektowi status budynku medycznego Defines an object as a medical facility. This allows for more advanced treatments. Can be used on buildings and vehicles. + Определяет объект в качестве госпиталя. Позволяет оказывать более сложную помощь. Может применяться к зданиям и технике. Moduł ten pozwala przypisać status budynku medycznego danemu obiektowi. Budynek taki pozwala na wykonywanie zaawansowanych zabiegów medycznych. Może być użyte na pojazdach i budynkach. [ACE] Medical Supply Crate (Basic) + [ACE] Ящик с медикаментами (базовая медицина) [ACE] Skrzynka z zapasami medycznymi (podstawowa) [ACE] Medical Supply Crate (Advanced) + [ACE] Ящик с медикаментами (усложн. медицина) [ACE] Skrzynka z zapasami medycznymi (zaawansowana) From 3daec7d98d707b0d429b1e2d19306a4762c14b93 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 17 May 2015 13:51:59 -0500 Subject: [PATCH 066/664] Fix UAV and Interaction Compile Inheritance --- .../functions/fnc_compileMenu.sqf | 8 ++++---- .../functions/fnc_compileMenuSelfAction.sqf | 8 ++++---- addons/logistics_uavbattery/CfgVehicles.hpp | 20 ++++++++++++++----- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 7b995375b7..4302f9e336 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -26,12 +26,12 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; private "_recurseFnc"; _recurseFnc = { - private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_position", "_condition", "_showDisabled", "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction", "_i"]; + private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_position", "_condition", "_showDisabled", "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"]; EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; - for "_i" from 0 to (count _actionsCfg) - 1 do { - _entryCfg = _actionsCfg select _i; + { + _entryCfg = _x; if(isClass _entryCfg) then { _displayName = getText (_entryCfg >> "displayName"); _distance = getNumber (_entryCfg >> "distance"); @@ -90,7 +90,7 @@ _recurseFnc = { ]; _actions pushBack _entry; }; - }; + } forEach (configProperties [_actionsCfg, "isClass _x", true]); _actions }; diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index e767c3525d..b09b67d048 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -14,7 +14,7 @@ EXPLODE_1_PVT(_this,_target); -private ["_objectType","_actionsVarName", "_canCollapse", "_children", "_enableInside", "_entry", "_entryCfg", "_i", "_insertChildren", "_modifierFunction", "_runOnHover"]; +private ["_objectType","_actionsVarName", "_canCollapse", "_children", "_enableInside", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction", "_runOnHover"]; _objectType = _target; if (typeName _target == "OBJECT") then { _objectType = typeOf _target; @@ -31,8 +31,8 @@ _recurseFnc = { EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; - for "_i" from 0 to (count _actionsCfg) - 1 do { - _entryCfg = _actionsCfg select _i; + { + _entryCfg = _x; if(isClass _entryCfg) then { _displayName = getText (_entryCfg >> "displayName"); @@ -74,7 +74,7 @@ _recurseFnc = { ]; _actions pushBack _entry; }; - }; + } forEach (configProperties [_actionsCfg, "isClass _x", true]); _actions }; diff --git a/addons/logistics_uavbattery/CfgVehicles.hpp b/addons/logistics_uavbattery/CfgVehicles.hpp index 5feba4c9a8..c82938942f 100644 --- a/addons/logistics_uavbattery/CfgVehicles.hpp +++ b/addons/logistics_uavbattery/CfgVehicles.hpp @@ -1,15 +1,25 @@ class CfgVehicles { - class Helicopter_Base_F; - class UAV_01_base_F: Helicopter_Base_F { + class Air; + class Helicopter: Air { class ACE_Actions { - class ACE_MainActions { + class ACE_MainActions {}; + }; + }; + class Helicopter_Base_F: Helicopter { + class ACE_Actions: ACE_Actions{ + class ACE_MainActions: ACE_MainActions {}; + }; + }; + class UAV_01_base_F: Helicopter_Base_F { + class ACE_Actions: ACE_Actions{ + class ACE_MainActions: ACE_MainActions { class GVAR(RefuelUAV) { displayName = "$STR_ACE_logistics_uavbattery_Recharge"; distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRefuelUAV)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(refuelUAV)); - showDisabled = 0; \ - priority = 1.245; \ + showDisabled = 0; + priority = 1.245; icon = QUOTE(PATHTOF(ui\UAV_battery_ca.paa)); }; }; From 0993c0f0b090d00dd7fe6a4234a5a997e67bc1f3 Mon Sep 17 00:00:00 2001 From: gienkov Date: Sun, 17 May 2015 23:28:00 +0200 Subject: [PATCH 067/664] Fix tabs and errors --- addons/viewdistance/ACE_Settings.hpp | 6 +- addons/viewdistance/stringtable.xml | 196 +++++++++++++-------------- addons/zeus/stringtable.xml | 130 +++++++++--------- 3 files changed, 164 insertions(+), 168 deletions(-) diff --git a/addons/viewdistance/ACE_Settings.hpp b/addons/viewdistance/ACE_Settings.hpp index b56bcd2703..42e022bb25 100644 --- a/addons/viewdistance/ACE_Settings.hpp +++ b/addons/viewdistance/ACE_Settings.hpp @@ -8,7 +8,7 @@ class ACE_Settings { class GVAR(viewDistanceOnFoot) { typeName = "SCALAR"; isClientSettable = 1; - value = 0; // index, NOT value // Can set it to client's actual viewdistance in the init function once ACE_Settings supports numbers (if ever). + value = 11; // index, NOT value // Can set it to client's actual viewdistance in the init function once ACE_Settings supports numbers (if ever). values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf displayName = "$STR_ACE_ViewDistance_onFoot_DisplayName"; description = "$STR_ACE_ViewDistance_onFoot_Description"; @@ -16,7 +16,7 @@ class ACE_Settings { class GVAR(viewDistanceLandVehicle) { typeName = "SCALAR"; isClientSettable = 1; - value = 0; // index, NOT value + value = 11; // index, NOT value values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf displayName = "$STR_ACE_ViewDistance_landVehicle_DisplayName"; description = "$STR_ACE_ViewDistance_landVehicle_Description"; @@ -24,7 +24,7 @@ class ACE_Settings { class GVAR(viewDistanceAirVehicle) { typeName = "SCALAR"; isClientSettable = 1; - value = 0; // index, NOT value + value = 11; // index, NOT value values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf displayName = "$STR_ACE_ViewDistance_airVehicle_DisplayName"; description = "$STR_ACE_ViewDistance_airVehicle_Description"; diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml index b43f24e4d5..bbcfb9e60b 100644 --- a/addons/viewdistance/stringtable.xml +++ b/addons/viewdistance/stringtable.xml @@ -1,103 +1,101 @@  - - - - View Distance Limiter - Ogranicznik zasięgu widzenia - - - Allows limiting maximum view distance that can be set by players. - Pozwala ustawić maksymalny limit zasięgu widzenia. - - - Enable ACE viewdistance - Wł. zasięg widzenia ACE - - - Enables ACE viewdistance - Aktywuje możliwość zmiany zasięgu widzenia w menu ustawień ACE - - - View Distance Limit - Limit zas. widzenia - - - Sets the limit for how high clients can raise their view distance (up to 10000) - Ustawia maksymalny limit zasięgu widzenia jaki mogą ustawić gracze (do 10000) - - - Limit for client's view distance set here and can overridden by module - Limit zasięgu widzenia jest ustawiany tutaj i może zostać nadpisany poprzez moduł - - - Client View Distance (On Foot) - Zasięg widzenia (piechota) - - - Changes in game view distance when the player is on foot. - Zmienia zasięg widzenia kiedy gracz porusza się na piechotę. - - - Client View Distance (Land Vehicle) - Zasięg widzenia (pojazdy naziemne) - - - Changes in game view distance when the player is in a land vehicle. - Zmienia zasięg widzenia kiedy gracz porusza się pojazdami naziemnymi. - - - Client View Distance (Air Vehicle) - Zasięg widzenia (pojazdy lotnicze) - - - Changes in game view distance when the player is in an air vehicle. - Zmienia zasięg widzenia kiedy gracz porusza się pojazdami lotniczymi. - - - Dynamic Object View Distance - Dynamiczny zasięg rysowania obiektów - - - Sets the object view distance as a coefficient of the view distance. - Zmienia zasięg rysowania obiektów jako mnożnik zasięgu widzenia. - - - Off - Wyłącz - - - Very Low - Bardzo niski - - - Low - Niski - - - Medium - Średni - - - High - Wysoki - - - Very High - Bardzo wysoki - - - View Distance: - Zasięg widzenia: - - - Object View Distance is - Zasięg widzenia obiektów wynosi - - - That option is invalid! The limit is - Ta opcja jest nieprawidłowa! Limit wynosi - - + + + View Distance Limiter + Ogranicznik zasięgu widzenia + + + Allows limiting maximum view distance that can be set by players. + Pozwala ustawić maksymalny limit zasięgu widzenia. + + + Enable ACE viewdistance + Wł. zasięg widzenia ACE + + + Enables ACE viewdistance + Aktywuje możliwość zmiany zasięgu widzenia w menu ustawień ACE + + + View Distance Limit + Limit zas. widzenia + + + Sets the limit for how high clients can raise their view distance (up to 10000) + Ustawia maksymalny limit zasięgu widzenia jaki mogą ustawić gracze (do 10000) + + + Limit for client's view distance set here and can overridden by module + Limit zasięgu widzenia jest ustawiany tutaj i może zostać nadpisany poprzez moduł + + + Client View Distance (On Foot) + Zasięg widzenia (piechota) + + + Changes in game view distance when the player is on foot. + Zmienia zasięg widzenia kiedy gracz porusza się na piechotę. + + + Client View Distance (Land Vehicle) + Zasięg widzenia (pojazdy naziemne) + + + Changes in game view distance when the player is in a land vehicle. + Zmienia zasięg widzenia kiedy gracz porusza się pojazdami naziemnymi. + + + Client View Distance (Air Vehicle) + Zasięg widzenia (pojazdy lotnicze) + + + Changes in game view distance when the player is in an air vehicle. + Zmienia zasięg widzenia kiedy gracz porusza się pojazdami lotniczymi. + + + Dynamic Object View Distance + Dynamiczny zasięg rysowania obiektów + + + Sets the object view distance as a coefficient of the view distance. + Zmienia zasięg rysowania obiektów jako mnożnik zasięgu widzenia. + + + Off + Wyłącz + + + Very Low + Bardzo niski + + + Low + Niski + + + Medium + Średni + + + High + Wysoki + + + Very High + Bardzo wysoki + + + View Distance: + Zasięg widzenia: + + + Object View Distance is + Zasięg widzenia obiektów wynosi + + + That option is invalid! The limit is + Ta opcja jest nieprawidłowa! Limit wynosi + diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 5fa8215294..e756d5d085 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -1,71 +1,69 @@  - - - Zeus Settings [ACE] - Ustawienia Zeusa [ACE] - - - Provides control over various aspects of Zeus. - Pozwala kontrolować różne aspekty Zeusa. - - - Ascension Messages - Wiad. o nowym Zeusie - - - Display global popup messages when a player is assigned as Zeus. - Wyświetlaj globalną wiadomość kiedy gracz zostanie przydzielony jako Zeus - - - Zeus Eagle - Orzeł Zeusa - - - Spawn an eagle that follows the Zeus camera. - Spawnuj orła, który podąrza za kamerą Zeusa. - - - Wind Sounds - Dźwięki wiatru - - - Play wind sounds when Zeus remote controls a unit. - Odtwarzaj dźwięki wiatru kiedy Zeus zdalnie kontroluje jednostkę. - - - Ordnance Warning - Ostrz. o ostrzale arty. - - - Play a radio warning when Zeus uses ordnance. - Odtwarzaj wiadomość radiową kiedy Zeus używa artylerii. - - - Reveal Mines - Pokazuj miny - - - Reveal mines to allies and/or place map markers. - Pokazuj znaczniki min dla sojuszników i/lub twórz markery na mapie w miejscu min. - - - Disabled - Wyłączone - - - Reveal to Allies - Pokaż dla sojuszników - - - Allies + Map Markers - Sojusznicy + markery na mapie - - - ACE Zeus - ACE Zeus - - + + Zeus Settings [ACE] + Ustawienia Zeusa [ACE] + + + Provides control over various aspects of Zeus. + Pozwala kontrolować różne aspekty Zeusa. + + + Ascension Messages + Wiad. o nowym Zeusie + + + Display global popup messages when a player is assigned as Zeus. + Wyświetlaj globalną wiadomość kiedy gracz zostanie przydzielony jako Zeus + + + Zeus Eagle + Orzeł Zeusa + + + Spawn an eagle that follows the Zeus camera. + Spawnuj orła, który podąrza za kamerą Zeusa. + + + Wind Sounds + Dźwięki wiatru + + + Play wind sounds when Zeus remote controls a unit. + Odtwarzaj dźwięki wiatru kiedy Zeus zdalnie kontroluje jednostkę. + + + Ordnance Warning + Ostrz. o ostrzale arty. + + + Play a radio warning when Zeus uses ordnance. + Odtwarzaj wiadomość radiową kiedy Zeus używa artylerii. + + + Reveal Mines + Pokazuj miny + + + Reveal mines to allies and/or place map markers. + Pokazuj znaczniki min dla sojuszników i/lub twórz markery na mapie w miejscu min. + + + Disabled + Wyłączone + + + Reveal to Allies + Pokaż dla sojuszników + + + Allies + Map Markers + Sojusznicy + markery na mapie + + + ACE Zeus + ACE Zeus + From 8eaf754fdd239ac74098308bc4bc3f448ee77be0 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 18 May 2015 10:56:34 +0200 Subject: [PATCH 068/664] Further increased the visibility of the bullet trace effect. --- addons/advanced_ballistics/functions/fnc_handleFired.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index 3567efc1bb..03f1d03d43 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -132,7 +132,7 @@ GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000; }; if (_bulletTraceVisible && _bulletSpeed > 600) then { - drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[sqrt(0.006*_caliber),sqrt(0.003*_caliber)],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""]; + drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[sqrt(0.006*_caliber),sqrt(0.003*_caliber)],[[0,0,0,0.75],[0,0,0,0.4]],[1,0],0,0,"","",""]; }; call compile ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(time), time - floor(time)]); From d8b4b53b8086b85f0dc8970251dc47d30cfc6c87 Mon Sep 17 00:00:00 2001 From: jaynus Date: Mon, 18 May 2015 08:31:29 -0700 Subject: [PATCH 069/664] Added: Monitor 5sec interval to propegate assignedTeams from leader, allowing team colors to be assigned by the team leader and show in the group. Uses vanilla team assignment. Closes #1279 --- addons/nametags/XEH_postInit.sqf | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index cea2025dcc..27f8cdae02 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -22,6 +22,41 @@ GVAR(ShowNamesTime) = -10; {false}, [29, [false, false, false]], false] call cba_fnc_addKeybind; //LeftControl Key +// Monitor the assigned teams, and propegate them appropriately for the player +// This allows for assigned team colors to match across the entire group +[{ + private["_leader", "_playerIsLeader", "_unitTeam"]; + if (alive ACE_player) then { + _leader = leader (group ACE_player); + _playerIsLeader = false; + + if(alive _leader) then { + if(_leader == ACE_player) then { + _playerIsLeader = true; + }; + }; + + if (_playerIsLeader) then { + { + if(alive _x) then { + _unitTeam = _x getVariable [QGVAR(teamAssignment),"MAIN"]; + if (_unitTeam != assignedTeam _x) then { + _x setVariable [QGVAR(teamAssignment), assignedTeam _x,true]; + }; + }; + } forEach units (group ACE_player); + } else { + { + if(alive _x) then { + _unitTeam = _x getVariable [QGVAR(teamAssignment),"MAIN"]; + if (_unitTeam != assignedTeam _x) then { + _x assignTeam _unitTeam; + }; + }; + } forEach units (group ACE_player); + }; + }; +}, 5, []] call CBA_fnc_addPerFrameHandler; // Draw handle addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; From 2f67935c911e62b8f08297165854b1fceb3b3165 Mon Sep 17 00:00:00 2001 From: Josuan Albin Date: Mon, 18 May 2015 17:12:22 +0200 Subject: [PATCH 070/664] mk6mortar and missing entries - mk6 mortar doc added - apl doc added - classnames fixed (forgot an entry) --- documentation/feature/apl.md | 18 ++------- documentation/feature/mk6mortar.md | 50 ++++++++++++++++++------ documentation/missionmaker/classnames.md | 4 ++ 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/documentation/feature/apl.md b/documentation/feature/apl.md index c0705a2abe..e30de7613e 100644 --- a/documentation/feature/apl.md +++ b/documentation/feature/apl.md @@ -1,25 +1,15 @@ --- layout: wiki title: APL -description: +description: assets under APL license group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. -### Sub-feature 2 -Short description of sub-feature 2. +This folder regroup all assets released under the APL license. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_main` diff --git a/documentation/feature/mk6mortar.md b/documentation/feature/mk6mortar.md index 1693a9e23d..8995b8a761 100644 --- a/documentation/feature/mk6mortar.md +++ b/documentation/feature/mk6mortar.md @@ -1,26 +1,54 @@ --- layout: wiki title: Mk6 Mortar -description: +description: Improve the existing mk6 mortar. group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +### 1.1 mk6 mortar overhaul -### Sub-feature 2 -Short description of sub-feature 2. +ACE3 adds wind deflection for shells as well as a rangetable to accurately take out your target without the artillery computer. +## 2. Usage -## Usage +### 2.1 Switching charge +- Press F (fire mode switch) to switch between charges -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +### 2.2 Working with the rangetable +- To open the table: + - Self interact ctrl + left windows (by default). + - Select `equipment`. + - Select `Open 82mm Rangetable`. +- Using the table: + - Get the distance and elevation difference between you and the target for this you can use map tools. For this example we'll say we're 2 000m away and 50m below (we're at 20m they are at 70m, 70-20=50). + - Select the charge you want to use (0 = close / 1 = medium / 2 = far). For this case we're using charge 2. + - Check the range column on the table, we're at 2 000 then look at the corresponding entry in the column on the right (ELEV = elevation) For this example it's 1339. + - After that's done move by one column on the right that's the elevation for 100m heigh so in our case we're subtracting 2 (4:2 = 2) if our target was 300m above us we would have to subtract 12 from our elevation (3x4 = 12). + - After you finished your maths, it's time to aim, get the cross of the mortar on target, if you don't see it use a waypoint if possible. In our case ELEV is 1339-2 = 1337. + - On the right side of the screen, while looking through the mk6 scope you should see ELV, we need to match this number with the one we found. + - To adjust the ELV use pageUp and pageDown . + - Once the number you found and ELV are the same FIRE ! + - On top of that you can calculate the time the shell will take to land by using the third row from the left, in our case the shell need to travel 2000m that's 20xthe number indicated. so 20x0,5 = 10s. +### 2.3 Working with the rangetable (Crosswinds enabled) +- Same as above there's just an extra step, I'll provide an other example in case you forgot. + - Get the distance and elevation difference between you and the target for this you can use map tools. For this example we'll say we're 2 400m away and 223m below (we're at 2m they are at 225, 225-2=223) + - Select the charge you want to use (0 = close / 1 = medium / 2 = far). For this case we're using charge 2. + - Check the range column on the table, we're 2 400m a then look at the corresponding entry in the column on the right (ELEV = elevation) For this example it's 1145. + - After that's done move by one column on the right that's the elevation for 100m heigh so in our case we're subtracting 22 (2,2 x 10 (2,2 because we're around 220m below)). + - Extra step needed here, a kestrel 4500 IS NEEDED. + - Pick the crosswind on your kestrel (for this refer to the kestrel documentation). + - For this example the crosswind is of 2 MPS on my table I can see under Azimuth correction that for each 1MPS I need to correct by 2.5 mill. + - So in this case i'm subtracting 5 mill from the ELV. + - It's MATH TIME the ELV given by the table is 1 145, we subtract 22 because of the heigh, we also subtract 5 for the crosswind ( 1 145-22-5 = 1 118 ). + - After you finished your maths, it's time to aim, get the cross of the mortar on target, if you don't see it use a waypoint if possible. In our case ELEV is 1 118. + - On the right side of the screen, while looking through the mk6 scope you should see ELV, we need to match this number with the one we found. + - FIREEEE !!!! + - Little advantage of having crosswind enabled is that you don't have to calculate the flight time, it's marked on the table in this case it's 33,8s. -## Dependencies +## 3. Dependencies -`ace_interaction` +`ace_interaction` \ No newline at end of file diff --git a/documentation/missionmaker/classnames.md b/documentation/missionmaker/classnames.md index 62d80afe98..c6476c075d 100644 --- a/documentation/missionmaker/classnames.md +++ b/documentation/missionmaker/classnames.md @@ -1,6 +1,7 @@ --- layout: wiki title: Classnames +description: A list of all the classnames in ACE3, your wet dream came true. group: missionmaker order: 11 parent: wiki @@ -174,6 +175,9 @@ classname | in game name | type | --------- | --------- | --------- ACE_microDAGR | MicroDAGR GPS | ACE_ItemCore | +### mk6 mortar +`added in 3.0.0.3` + classname | in game name | type | --------- | --------- | --------- ACE_RangeTable_82mm | 82mm Rangetable | ACE_ItemCore | From 5c7e59fd29dd4aae04d6473775ef39f952058ada Mon Sep 17 00:00:00 2001 From: VKing Date: Mon, 11 May 2015 23:17:17 +0200 Subject: [PATCH 071/664] Hacked order to fix order of comanche zoom levels --- addons/aircraft/Heli_Attack_01_base_F.hpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/addons/aircraft/Heli_Attack_01_base_F.hpp b/addons/aircraft/Heli_Attack_01_base_F.hpp index 14ca7ef7cd..3566336353 100644 --- a/addons/aircraft/Heli_Attack_01_base_F.hpp +++ b/addons/aircraft/Heli_Attack_01_base_F.hpp @@ -891,8 +891,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { class OpticsIn { - class WideUnstabalized - { + class Wide { // Wide Unstabilized opticsDisplayName = "WU"; initAngleX = 0; minAngleX = -35; @@ -910,8 +909,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_wide_F"; }; - class Wide - { + class Medium: Wide { // Wide Stabilized opticsDisplayName = "W"; initAngleX = 0; minAngleX = -35; @@ -929,8 +927,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_wide_F"; }; - class Medium: Wide - { + class Narrow: Wide { // Medium Stabilized opticsDisplayName = "M"; initFov = 0.093; minFov = 0.093; @@ -940,8 +937,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_medium_F"; }; - class Narrow: Wide - { + class Narrower: Wide { // Narrow Stabilized opticsDisplayName = "N"; initFov = 0.029; minFov = 0.029; @@ -952,8 +948,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_narrow_F"; }; - class Narrower: Wide - { + class Narrowest: Wide { // Narrower Stabilized opticsDisplayName = "Z"; initFov = 0.01; minFov = 0.01; From 1cab51156a9d18d6af39c719c9246d7b30b0230f Mon Sep 17 00:00:00 2001 From: VKing Date: Tue, 12 May 2015 15:53:49 +0200 Subject: [PATCH 072/664] Made better with Pabstology (tm) --- addons/aircraft/Heli_Attack_01_base_F.hpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/addons/aircraft/Heli_Attack_01_base_F.hpp b/addons/aircraft/Heli_Attack_01_base_F.hpp index 3566336353..26a4605910 100644 --- a/addons/aircraft/Heli_Attack_01_base_F.hpp +++ b/addons/aircraft/Heli_Attack_01_base_F.hpp @@ -891,8 +891,12 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { class OpticsIn { - class Wide { // Wide Unstabilized - opticsDisplayName = "WU"; + delete Narrow; + delete Medium; + delete Wide; + + class ACE_WideUnstabilized { + opticsDisplayName = "W NS"; initAngleX = 0; minAngleX = -35; maxAngleX = 10; @@ -909,7 +913,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_wide_F"; }; - class Medium: Wide { // Wide Stabilized + class ACE_Wide: ACE_WideUnstabilized { opticsDisplayName = "W"; initAngleX = 0; minAngleX = -35; @@ -927,7 +931,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_wide_F"; }; - class Narrow: Wide { // Medium Stabilized + class ACE_Medium: ACE_Wide { opticsDisplayName = "M"; initFov = 0.093; minFov = 0.093; @@ -937,7 +941,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_medium_F"; }; - class Narrower: Wide { // Narrow Stabilized + class ACE_Narrow: ACE_Wide { opticsDisplayName = "N"; initFov = 0.029; minFov = 0.029; @@ -948,7 +952,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_narrow_F"; }; - class Narrowest: Wide { // Narrower Stabilized + class ACE_Narrower: ACE_Wide { opticsDisplayName = "Z"; initFov = 0.01; minFov = 0.01; From e4fb652dd21619fa4d9d4873830662cc105decb1 Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 13 May 2015 08:34:14 -0700 Subject: [PATCH 073/664] initial pick from vehicledamage for new extension build process. --- extensions/CMakeLists.txt | 84 +- .../AdvancedBallistics.cpp | 34 +- extensions/advanced_ballistics/CMakeLists.txt | 7 +- extensions/break_line/CMakeLists.txt | 7 +- extensions/break_line/ace_break_line.cpp | 4 +- extensions/clipboard/ace_clipboard.cpp | 17 +- extensions/cmake/FindDirectX.cmake | 215 + extensions/common/CMakeLists.txt | 18 + extensions/common/arguments.hpp | 90 + extensions/common/directx/d3d_display.cpp | 439 ++ extensions/common/directx/d3d_display.hpp | 130 + extensions/common/dispatch.hpp | 153 + extensions/common/easyloggingc++.hpp | 6718 +++++++++++++++++ extensions/common/glm/CMakeLists.txt | 43 + extensions/common/glm/common.hpp | 35 + extensions/common/glm/detail/_features.hpp | 428 ++ extensions/common/glm/detail/_fixes.hpp | 59 + extensions/common/glm/detail/_noise.hpp | 136 + extensions/common/glm/detail/_swizzle.hpp | 833 ++ .../common/glm/detail/_swizzle_func.hpp | 725 ++ extensions/common/glm/detail/_vectorize.hpp | 160 + extensions/common/glm/detail/dummy.cpp | 232 + extensions/common/glm/detail/func_common.hpp | 456 ++ extensions/common/glm/detail/func_common.inl | 758 ++ .../common/glm/detail/func_exponential.hpp | 132 + .../common/glm/detail/func_exponential.inl | 161 + .../common/glm/detail/func_geometric.hpp | 142 + .../common/glm/detail/func_geometric.inl | 201 + extensions/common/glm/detail/func_integer.hpp | 232 + extensions/common/glm/detail/func_integer.inl | 393 + extensions/common/glm/detail/func_matrix.hpp | 178 + extensions/common/glm/detail/func_matrix.inl | 310 + extensions/common/glm/detail/func_noise.hpp | 93 + extensions/common/glm/detail/func_noise.inl | 388 + extensions/common/glm/detail/func_packing.hpp | 197 + extensions/common/glm/detail/func_packing.inl | 119 + .../common/glm/detail/func_trigonometric.hpp | 205 + .../common/glm/detail/func_trigonometric.inl | 224 + .../glm/detail/func_vector_relational.hpp | 140 + .../glm/detail/func_vector_relational.inl | 131 + extensions/common/glm/detail/glm.cpp | 286 + .../common/glm/detail/intrinsic_common.hpp | 87 + .../common/glm/detail/intrinsic_common.inl | 313 + .../glm/detail/intrinsic_exponential.hpp | 77 + .../glm/detail/intrinsic_exponential.inl | 27 + .../common/glm/detail/intrinsic_geometric.hpp | 74 + .../common/glm/detail/intrinsic_geometric.inl | 147 + .../common/glm/detail/intrinsic_integer.hpp | 48 + .../common/glm/detail/intrinsic_integer.inl | 139 + .../common/glm/detail/intrinsic_matrix.hpp | 67 + .../common/glm/detail/intrinsic_matrix.inl | 1070 +++ .../glm/detail/intrinsic_trigonometric.hpp | 46 + .../glm/detail/intrinsic_trigonometric.inl | 27 + .../detail/intrinsic_vector_relational.hpp | 46 + .../detail/intrinsic_vector_relational.inl | 366 + extensions/common/glm/detail/precision.hpp | 44 + extensions/common/glm/detail/setup.hpp | 962 +++ extensions/common/glm/detail/type_float.hpp | 96 + extensions/common/glm/detail/type_gentype.hpp | 224 + extensions/common/glm/detail/type_gentype.inl | 370 + extensions/common/glm/detail/type_half.hpp | 48 + extensions/common/glm/detail/type_half.inl | 277 + extensions/common/glm/detail/type_int.hpp | 326 + extensions/common/glm/detail/type_mat.hpp | 793 ++ extensions/common/glm/detail/type_mat.inl | 32 + extensions/common/glm/detail/type_mat2x2.hpp | 223 + extensions/common/glm/detail/type_mat2x2.inl | 548 ++ extensions/common/glm/detail/type_mat2x3.hpp | 201 + extensions/common/glm/detail/type_mat2x3.inl | 506 ++ extensions/common/glm/detail/type_mat2x4.hpp | 202 + extensions/common/glm/detail/type_mat2x4.inl | 515 ++ extensions/common/glm/detail/type_mat3x2.hpp | 207 + extensions/common/glm/detail/type_mat3x2.inl | 540 ++ extensions/common/glm/detail/type_mat3x3.hpp | 230 + extensions/common/glm/detail/type_mat3x3.inl | 631 ++ extensions/common/glm/detail/type_mat3x4.hpp | 206 + extensions/common/glm/detail/type_mat3x4.inl | 579 ++ extensions/common/glm/detail/type_mat4x2.hpp | 212 + extensions/common/glm/detail/type_mat4x2.inl | 587 ++ extensions/common/glm/detail/type_mat4x3.hpp | 211 + extensions/common/glm/detail/type_mat4x3.inl | 631 ++ extensions/common/glm/detail/type_mat4x4.hpp | 235 + extensions/common/glm/detail/type_mat4x4.inl | 790 ++ extensions/common/glm/detail/type_vec.hpp | 518 ++ extensions/common/glm/detail/type_vec.inl | 31 + extensions/common/glm/detail/type_vec1.hpp | 322 + extensions/common/glm/detail/type_vec1.inl | 616 ++ extensions/common/glm/detail/type_vec2.hpp | 403 + extensions/common/glm/detail/type_vec2.inl | 909 +++ extensions/common/glm/detail/type_vec3.hpp | 425 ++ extensions/common/glm/detail/type_vec3.inl | 1042 +++ extensions/common/glm/detail/type_vec4.hpp | 531 ++ extensions/common/glm/detail/type_vec4.inl | 1124 +++ .../common/glm/detail/type_vec4_avx.inl | 41 + .../common/glm/detail/type_vec4_avx2.inl | 41 + .../common/glm/detail/type_vec4_sse2.inl | 120 + extensions/common/glm/exponential.hpp | 35 + extensions/common/glm/ext.hpp | 143 + extensions/common/glm/fwd.hpp | 2601 +++++++ extensions/common/glm/geometric.hpp | 35 + extensions/common/glm/glm.hpp | 117 + extensions/common/glm/gtc/bitfield.hpp | 236 + extensions/common/glm/gtc/bitfield.inl | 542 ++ extensions/common/glm/gtc/constants.hpp | 205 + extensions/common/glm/gtc/constants.inl | 210 + extensions/common/glm/gtc/epsilon.hpp | 102 + extensions/common/glm/gtc/epsilon.inl | 154 + extensions/common/glm/gtc/integer.hpp | 105 + extensions/common/glm/gtc/integer.inl | 74 + extensions/common/glm/gtc/matrix_access.hpp | 88 + extensions/common/glm/gtc/matrix_access.inl | 92 + extensions/common/glm/gtc/matrix_integer.hpp | 515 ++ extensions/common/glm/gtc/matrix_inverse.hpp | 78 + extensions/common/glm/gtc/matrix_inverse.inl | 148 + .../common/glm/gtc/matrix_transform.hpp | 304 + .../common/glm/gtc/matrix_transform.inl | 413 + extensions/common/glm/gtc/noise.hpp | 89 + extensions/common/glm/gtc/noise.inl | 837 ++ extensions/common/glm/gtc/packing.hpp | 478 ++ extensions/common/glm/gtc/packing.inl | 490 ++ extensions/common/glm/gtc/quaternion.hpp | 377 + extensions/common/glm/gtc/quaternion.inl | 784 ++ extensions/common/glm/gtc/random.hpp | 120 + extensions/common/glm/gtc/random.inl | 379 + extensions/common/glm/gtc/reciprocal.hpp | 134 + extensions/common/glm/gtc/reciprocal.inl | 221 + extensions/common/glm/gtc/round.hpp | 203 + extensions/common/glm/gtc/round.inl | 378 + extensions/common/glm/gtc/type_precision.hpp | 890 +++ extensions/common/glm/gtc/type_precision.inl | 36 + extensions/common/glm/gtc/type_ptr.hpp | 178 + extensions/common/glm/gtc/type_ptr.inl | 479 ++ extensions/common/glm/gtc/ulp.hpp | 92 + extensions/common/glm/gtc/ulp.inl | 350 + extensions/common/glm/gtc/vec1.hpp | 193 + extensions/common/glm/gtc/vec1.inl | 31 + .../common/glm/gtx/associated_min_max.hpp | 231 + .../common/glm/gtx/associated_min_max.inl | 384 + extensions/common/glm/gtx/bit.hpp | 120 + extensions/common/glm/gtx/bit.inl | 107 + extensions/common/glm/gtx/closest_point.hpp | 74 + extensions/common/glm/gtx/closest_point.inl | 75 + extensions/common/glm/gtx/color_space.hpp | 97 + extensions/common/glm/gtx/color_space.inl | 172 + .../common/glm/gtx/color_space_YCoCg.hpp | 85 + .../common/glm/gtx/color_space_YCoCg.inl | 87 + extensions/common/glm/gtx/common.hpp | 74 + extensions/common/glm/gtx/common.inl | 102 + extensions/common/glm/gtx/compatibility.hpp | 158 + extensions/common/glm/gtx/compatibility.inl | 83 + extensions/common/glm/gtx/component_wise.hpp | 84 + extensions/common/glm/gtx/component_wise.inl | 70 + extensions/common/glm/gtx/dual_quaternion.hpp | 321 + extensions/common/glm/gtx/dual_quaternion.inl | 400 + extensions/common/glm/gtx/euler_angles.hpp | 156 + extensions/common/glm/gtx/euler_angles.inl | 287 + extensions/common/glm/gtx/extend.hpp | 67 + extensions/common/glm/gtx/extend.inl | 78 + .../common/glm/gtx/extented_min_max.hpp | 162 + .../common/glm/gtx/extented_min_max.inl | 169 + .../common/glm/gtx/fast_exponential.hpp | 120 + .../common/glm/gtx/fast_exponential.inl | 166 + .../common/glm/gtx/fast_square_root.hpp | 117 + .../common/glm/gtx/fast_square_root.inl | 110 + .../common/glm/gtx/fast_trigonometry.hpp | 104 + .../common/glm/gtx/fast_trigonometry.inl | 162 + extensions/common/glm/gtx/gradient_paint.hpp | 77 + extensions/common/glm/gtx/gradient_paint.inl | 66 + .../glm/gtx/handed_coordinate_space.hpp | 75 + .../glm/gtx/handed_coordinate_space.inl | 56 + extensions/common/glm/gtx/integer.hpp | 101 + extensions/common/glm/gtx/integer.inl | 211 + extensions/common/glm/gtx/intersect.hpp | 112 + extensions/common/glm/gtx/intersect.inl | 217 + extensions/common/glm/gtx/io.hpp | 224 + extensions/common/glm/gtx/io.inl | 618 ++ extensions/common/glm/gtx/log_base.hpp | 73 + extensions/common/glm/gtx/log_base.inl | 47 + .../common/glm/gtx/matrix_cross_product.hpp | 72 + .../common/glm/gtx/matrix_cross_product.inl | 67 + .../common/glm/gtx/matrix_decompose.hpp | 70 + .../common/glm/gtx/matrix_decompose.inl | 231 + .../common/glm/gtx/matrix_interpolation.hpp | 89 + .../common/glm/gtx/matrix_interpolation.inl | 163 + .../common/glm/gtx/matrix_major_storage.hpp | 144 + .../common/glm/gtx/matrix_major_storage.inl | 196 + .../common/glm/gtx/matrix_operation.hpp | 113 + .../common/glm/gtx/matrix_operation.inl | 147 + extensions/common/glm/gtx/matrix_query.hpp | 102 + extensions/common/glm/gtx/matrix_query.inl | 143 + .../common/glm/gtx/matrix_transform_2d.hpp | 106 + .../common/glm/gtx/matrix_transform_2d.inl | 97 + extensions/common/glm/gtx/mixed_product.hpp | 66 + extensions/common/glm/gtx/mixed_product.inl | 45 + extensions/common/glm/gtx/multiple.hpp | 106 + extensions/common/glm/gtx/multiple.inl | 64 + extensions/common/glm/gtx/norm.hpp | 128 + extensions/common/glm/gtx/norm.inl | 170 + extensions/common/glm/gtx/normal.hpp | 68 + extensions/common/glm/gtx/normal.inl | 45 + extensions/common/glm/gtx/normalize_dot.hpp | 74 + extensions/common/glm/gtx/normalize_dot.inl | 46 + .../common/glm/gtx/number_precision.hpp | 86 + .../common/glm/gtx/number_precision.inl | 36 + extensions/common/glm/gtx/optimum_pow.hpp | 79 + extensions/common/glm/gtx/optimum_pow.inl | 52 + extensions/common/glm/gtx/orthonormalize.hpp | 74 + extensions/common/glm/gtx/orthonormalize.inl | 59 + extensions/common/glm/gtx/perpendicular.hpp | 68 + extensions/common/glm/gtx/perpendicular.inl | 44 + .../common/glm/gtx/polar_coordinates.hpp | 73 + .../common/glm/gtx/polar_coordinates.inl | 66 + extensions/common/glm/gtx/projection.hpp | 65 + extensions/common/glm/gtx/projection.inl | 40 + extensions/common/glm/gtx/quaternion.hpp | 214 + extensions/common/glm/gtx/quaternion.inl | 285 + extensions/common/glm/gtx/range.hpp | 102 + extensions/common/glm/gtx/raw_data.hpp | 76 + extensions/common/glm/gtx/raw_data.inl | 31 + .../common/glm/gtx/rotate_normalized_axis.hpp | 93 + .../common/glm/gtx/rotate_normalized_axis.inl | 88 + extensions/common/glm/gtx/rotate_vector.hpp | 146 + extensions/common/glm/gtx/rotate_vector.inl | 217 + .../common/glm/gtx/scalar_multiplication.hpp | 98 + .../common/glm/gtx/scalar_relational.hpp | 61 + .../common/glm/gtx/scalar_relational.inl | 118 + extensions/common/glm/gtx/simd_mat4.hpp | 205 + extensions/common/glm/gtx/simd_mat4.inl | 602 ++ extensions/common/glm/gtx/simd_quat.hpp | 335 + extensions/common/glm/gtx/simd_quat.inl | 645 ++ extensions/common/glm/gtx/simd_vec4.hpp | 574 ++ extensions/common/glm/gtx/simd_vec4.inl | 727 ++ extensions/common/glm/gtx/spline.hpp | 90 + extensions/common/glm/gtx/spline.inl | 92 + extensions/common/glm/gtx/std_based_type.hpp | 92 + extensions/common/glm/gtx/std_based_type.inl | 36 + extensions/common/glm/gtx/string_cast.hpp | 74 + extensions/common/glm/gtx/string_cast.inl | 455 ++ extensions/common/glm/gtx/transform.hpp | 85 + extensions/common/glm/gtx/transform.inl | 60 + extensions/common/glm/gtx/transform2.hpp | 136 + extensions/common/glm/gtx/transform2.inl | 177 + extensions/common/glm/gtx/type_aligned.hpp | 995 +++ extensions/common/glm/gtx/type_aligned.inl | 36 + extensions/common/glm/gtx/vector_angle.hpp | 89 + extensions/common/glm/gtx/vector_angle.inl | 87 + extensions/common/glm/gtx/vector_query.hpp | 91 + extensions/common/glm/gtx/vector_query.inl | 222 + extensions/common/glm/gtx/wrap.hpp | 74 + extensions/common/glm/gtx/wrap.inl | 185 + extensions/common/glm/integer.hpp | 35 + extensions/common/glm/mat2x2.hpp | 81 + extensions/common/glm/mat2x3.hpp | 61 + extensions/common/glm/mat2x4.hpp | 60 + extensions/common/glm/mat3x2.hpp | 60 + extensions/common/glm/mat3x3.hpp | 81 + extensions/common/glm/mat3x4.hpp | 60 + extensions/common/glm/mat4x2.hpp | 60 + extensions/common/glm/mat4x3.hpp | 60 + extensions/common/glm/mat4x4.hpp | 81 + extensions/common/glm/matrix.hpp | 35 + extensions/common/glm/packing.hpp | 35 + extensions/common/glm/trigonometric.hpp | 35 + extensions/common/glm/vec2.hpp | 35 + extensions/common/glm/vec3.hpp | 35 + extensions/common/glm/vec4.hpp | 35 + extensions/common/glm/vector_relational.hpp | 35 + extensions/common/logging.hpp | 6 + extensions/common/lzoconf.h | 453 ++ extensions/common/lzodefs.h | 3134 ++++++++ extensions/common/membuf.hpp | 56 + extensions/common/minilzo.c | 6231 +++++++++++++++ extensions/common/minilzo.h | 106 + extensions/common/p3d/animation.cpp | 72 + extensions/common/p3d/animation.hpp | 69 + extensions/common/p3d/compressed.cpp | 237 + extensions/common/p3d/compressed.hpp | 166 + extensions/common/p3d/lod_info.cpp | 289 + extensions/common/p3d/lod_info.hpp | 237 + extensions/common/p3d/lod_types.hpp | 33 + extensions/common/p3d/model.cpp | 116 + extensions/common/p3d/model.hpp | 57 + extensions/common/p3d/model_info.cpp | 91 + extensions/common/p3d/model_info.hpp | 74 + extensions/common/p3d/parser.cpp | 26 + extensions/common/p3d/parser.hpp | 17 + extensions/common/p3d/parser_ref.txt | 269 + extensions/common/p3d/read_helpers.hpp | 11 + extensions/common/p3d/skeleton.cpp | 46 + extensions/common/p3d/skeleton.hpp | 36 + extensions/common/pbo/archive.cpp | 91 + extensions/common/pbo/archive.hpp | 61 + extensions/common/pbo/search.cpp | 301 + extensions/common/pbo/search.hpp | 27 + extensions/common/shared.cpp | 41 + extensions/common/shared.hpp | 77 + extensions/common/simplepipe_win32.cpp | 179 + extensions/common/simplepipe_win32.hpp | 57 + extensions/common/simulation/object.cpp | 464 ++ extensions/common/simulation/object.hpp | 221 + extensions/common/singleton.hpp | 31 + extensions/common/targetver.h | 2 +- extensions/common/transform_matrix.hpp | 34 + extensions/common/vector.cpp | 11 + extensions/common/vector.hpp | 161 + extensions/dynload/CMakeLists.txt | 14 + extensions/dynload/ace_dynload.cpp | 66 + extensions/dynload/ace_dynload_dllmain.cpp | 33 + extensions/dynload/dynloader.hpp | 168 + extensions/fcs/CMakeLists.txt | 7 +- extensions/fcs/ace_fcs.cpp | 5 +- extensions/lib/bullet3 | 1 + 312 files changed, 79346 insertions(+), 40 deletions(-) create mode 100644 extensions/cmake/FindDirectX.cmake create mode 100644 extensions/common/CMakeLists.txt create mode 100644 extensions/common/arguments.hpp create mode 100644 extensions/common/directx/d3d_display.cpp create mode 100644 extensions/common/directx/d3d_display.hpp create mode 100644 extensions/common/dispatch.hpp create mode 100644 extensions/common/easyloggingc++.hpp create mode 100644 extensions/common/glm/CMakeLists.txt create mode 100644 extensions/common/glm/common.hpp create mode 100644 extensions/common/glm/detail/_features.hpp create mode 100644 extensions/common/glm/detail/_fixes.hpp create mode 100644 extensions/common/glm/detail/_noise.hpp create mode 100644 extensions/common/glm/detail/_swizzle.hpp create mode 100644 extensions/common/glm/detail/_swizzle_func.hpp create mode 100644 extensions/common/glm/detail/_vectorize.hpp create mode 100644 extensions/common/glm/detail/dummy.cpp create mode 100644 extensions/common/glm/detail/func_common.hpp create mode 100644 extensions/common/glm/detail/func_common.inl create mode 100644 extensions/common/glm/detail/func_exponential.hpp create mode 100644 extensions/common/glm/detail/func_exponential.inl create mode 100644 extensions/common/glm/detail/func_geometric.hpp create mode 100644 extensions/common/glm/detail/func_geometric.inl create mode 100644 extensions/common/glm/detail/func_integer.hpp create mode 100644 extensions/common/glm/detail/func_integer.inl create mode 100644 extensions/common/glm/detail/func_matrix.hpp create mode 100644 extensions/common/glm/detail/func_matrix.inl create mode 100644 extensions/common/glm/detail/func_noise.hpp create mode 100644 extensions/common/glm/detail/func_noise.inl create mode 100644 extensions/common/glm/detail/func_packing.hpp create mode 100644 extensions/common/glm/detail/func_packing.inl create mode 100644 extensions/common/glm/detail/func_trigonometric.hpp create mode 100644 extensions/common/glm/detail/func_trigonometric.inl create mode 100644 extensions/common/glm/detail/func_vector_relational.hpp create mode 100644 extensions/common/glm/detail/func_vector_relational.inl create mode 100644 extensions/common/glm/detail/glm.cpp create mode 100644 extensions/common/glm/detail/intrinsic_common.hpp create mode 100644 extensions/common/glm/detail/intrinsic_common.inl create mode 100644 extensions/common/glm/detail/intrinsic_exponential.hpp create mode 100644 extensions/common/glm/detail/intrinsic_exponential.inl create mode 100644 extensions/common/glm/detail/intrinsic_geometric.hpp create mode 100644 extensions/common/glm/detail/intrinsic_geometric.inl create mode 100644 extensions/common/glm/detail/intrinsic_integer.hpp create mode 100644 extensions/common/glm/detail/intrinsic_integer.inl create mode 100644 extensions/common/glm/detail/intrinsic_matrix.hpp create mode 100644 extensions/common/glm/detail/intrinsic_matrix.inl create mode 100644 extensions/common/glm/detail/intrinsic_trigonometric.hpp create mode 100644 extensions/common/glm/detail/intrinsic_trigonometric.inl create mode 100644 extensions/common/glm/detail/intrinsic_vector_relational.hpp create mode 100644 extensions/common/glm/detail/intrinsic_vector_relational.inl create mode 100644 extensions/common/glm/detail/precision.hpp create mode 100644 extensions/common/glm/detail/setup.hpp create mode 100644 extensions/common/glm/detail/type_float.hpp create mode 100644 extensions/common/glm/detail/type_gentype.hpp create mode 100644 extensions/common/glm/detail/type_gentype.inl create mode 100644 extensions/common/glm/detail/type_half.hpp create mode 100644 extensions/common/glm/detail/type_half.inl create mode 100644 extensions/common/glm/detail/type_int.hpp create mode 100644 extensions/common/glm/detail/type_mat.hpp create mode 100644 extensions/common/glm/detail/type_mat.inl create mode 100644 extensions/common/glm/detail/type_mat2x2.hpp create mode 100644 extensions/common/glm/detail/type_mat2x2.inl create mode 100644 extensions/common/glm/detail/type_mat2x3.hpp create mode 100644 extensions/common/glm/detail/type_mat2x3.inl create mode 100644 extensions/common/glm/detail/type_mat2x4.hpp create mode 100644 extensions/common/glm/detail/type_mat2x4.inl create mode 100644 extensions/common/glm/detail/type_mat3x2.hpp create mode 100644 extensions/common/glm/detail/type_mat3x2.inl create mode 100644 extensions/common/glm/detail/type_mat3x3.hpp create mode 100644 extensions/common/glm/detail/type_mat3x3.inl create mode 100644 extensions/common/glm/detail/type_mat3x4.hpp create mode 100644 extensions/common/glm/detail/type_mat3x4.inl create mode 100644 extensions/common/glm/detail/type_mat4x2.hpp create mode 100644 extensions/common/glm/detail/type_mat4x2.inl create mode 100644 extensions/common/glm/detail/type_mat4x3.hpp create mode 100644 extensions/common/glm/detail/type_mat4x3.inl create mode 100644 extensions/common/glm/detail/type_mat4x4.hpp create mode 100644 extensions/common/glm/detail/type_mat4x4.inl create mode 100644 extensions/common/glm/detail/type_vec.hpp create mode 100644 extensions/common/glm/detail/type_vec.inl create mode 100644 extensions/common/glm/detail/type_vec1.hpp create mode 100644 extensions/common/glm/detail/type_vec1.inl create mode 100644 extensions/common/glm/detail/type_vec2.hpp create mode 100644 extensions/common/glm/detail/type_vec2.inl create mode 100644 extensions/common/glm/detail/type_vec3.hpp create mode 100644 extensions/common/glm/detail/type_vec3.inl create mode 100644 extensions/common/glm/detail/type_vec4.hpp create mode 100644 extensions/common/glm/detail/type_vec4.inl create mode 100644 extensions/common/glm/detail/type_vec4_avx.inl create mode 100644 extensions/common/glm/detail/type_vec4_avx2.inl create mode 100644 extensions/common/glm/detail/type_vec4_sse2.inl create mode 100644 extensions/common/glm/exponential.hpp create mode 100644 extensions/common/glm/ext.hpp create mode 100644 extensions/common/glm/fwd.hpp create mode 100644 extensions/common/glm/geometric.hpp create mode 100644 extensions/common/glm/glm.hpp create mode 100644 extensions/common/glm/gtc/bitfield.hpp create mode 100644 extensions/common/glm/gtc/bitfield.inl create mode 100644 extensions/common/glm/gtc/constants.hpp create mode 100644 extensions/common/glm/gtc/constants.inl create mode 100644 extensions/common/glm/gtc/epsilon.hpp create mode 100644 extensions/common/glm/gtc/epsilon.inl create mode 100644 extensions/common/glm/gtc/integer.hpp create mode 100644 extensions/common/glm/gtc/integer.inl create mode 100644 extensions/common/glm/gtc/matrix_access.hpp create mode 100644 extensions/common/glm/gtc/matrix_access.inl create mode 100644 extensions/common/glm/gtc/matrix_integer.hpp create mode 100644 extensions/common/glm/gtc/matrix_inverse.hpp create mode 100644 extensions/common/glm/gtc/matrix_inverse.inl create mode 100644 extensions/common/glm/gtc/matrix_transform.hpp create mode 100644 extensions/common/glm/gtc/matrix_transform.inl create mode 100644 extensions/common/glm/gtc/noise.hpp create mode 100644 extensions/common/glm/gtc/noise.inl create mode 100644 extensions/common/glm/gtc/packing.hpp create mode 100644 extensions/common/glm/gtc/packing.inl create mode 100644 extensions/common/glm/gtc/quaternion.hpp create mode 100644 extensions/common/glm/gtc/quaternion.inl create mode 100644 extensions/common/glm/gtc/random.hpp create mode 100644 extensions/common/glm/gtc/random.inl create mode 100644 extensions/common/glm/gtc/reciprocal.hpp create mode 100644 extensions/common/glm/gtc/reciprocal.inl create mode 100644 extensions/common/glm/gtc/round.hpp create mode 100644 extensions/common/glm/gtc/round.inl create mode 100644 extensions/common/glm/gtc/type_precision.hpp create mode 100644 extensions/common/glm/gtc/type_precision.inl create mode 100644 extensions/common/glm/gtc/type_ptr.hpp create mode 100644 extensions/common/glm/gtc/type_ptr.inl create mode 100644 extensions/common/glm/gtc/ulp.hpp create mode 100644 extensions/common/glm/gtc/ulp.inl create mode 100644 extensions/common/glm/gtc/vec1.hpp create mode 100644 extensions/common/glm/gtc/vec1.inl create mode 100644 extensions/common/glm/gtx/associated_min_max.hpp create mode 100644 extensions/common/glm/gtx/associated_min_max.inl create mode 100644 extensions/common/glm/gtx/bit.hpp create mode 100644 extensions/common/glm/gtx/bit.inl create mode 100644 extensions/common/glm/gtx/closest_point.hpp create mode 100644 extensions/common/glm/gtx/closest_point.inl create mode 100644 extensions/common/glm/gtx/color_space.hpp create mode 100644 extensions/common/glm/gtx/color_space.inl create mode 100644 extensions/common/glm/gtx/color_space_YCoCg.hpp create mode 100644 extensions/common/glm/gtx/color_space_YCoCg.inl create mode 100644 extensions/common/glm/gtx/common.hpp create mode 100644 extensions/common/glm/gtx/common.inl create mode 100644 extensions/common/glm/gtx/compatibility.hpp create mode 100644 extensions/common/glm/gtx/compatibility.inl create mode 100644 extensions/common/glm/gtx/component_wise.hpp create mode 100644 extensions/common/glm/gtx/component_wise.inl create mode 100644 extensions/common/glm/gtx/dual_quaternion.hpp create mode 100644 extensions/common/glm/gtx/dual_quaternion.inl create mode 100644 extensions/common/glm/gtx/euler_angles.hpp create mode 100644 extensions/common/glm/gtx/euler_angles.inl create mode 100644 extensions/common/glm/gtx/extend.hpp create mode 100644 extensions/common/glm/gtx/extend.inl create mode 100644 extensions/common/glm/gtx/extented_min_max.hpp create mode 100644 extensions/common/glm/gtx/extented_min_max.inl create mode 100644 extensions/common/glm/gtx/fast_exponential.hpp create mode 100644 extensions/common/glm/gtx/fast_exponential.inl create mode 100644 extensions/common/glm/gtx/fast_square_root.hpp create mode 100644 extensions/common/glm/gtx/fast_square_root.inl create mode 100644 extensions/common/glm/gtx/fast_trigonometry.hpp create mode 100644 extensions/common/glm/gtx/fast_trigonometry.inl create mode 100644 extensions/common/glm/gtx/gradient_paint.hpp create mode 100644 extensions/common/glm/gtx/gradient_paint.inl create mode 100644 extensions/common/glm/gtx/handed_coordinate_space.hpp create mode 100644 extensions/common/glm/gtx/handed_coordinate_space.inl create mode 100644 extensions/common/glm/gtx/integer.hpp create mode 100644 extensions/common/glm/gtx/integer.inl create mode 100644 extensions/common/glm/gtx/intersect.hpp create mode 100644 extensions/common/glm/gtx/intersect.inl create mode 100644 extensions/common/glm/gtx/io.hpp create mode 100644 extensions/common/glm/gtx/io.inl create mode 100644 extensions/common/glm/gtx/log_base.hpp create mode 100644 extensions/common/glm/gtx/log_base.inl create mode 100644 extensions/common/glm/gtx/matrix_cross_product.hpp create mode 100644 extensions/common/glm/gtx/matrix_cross_product.inl create mode 100644 extensions/common/glm/gtx/matrix_decompose.hpp create mode 100644 extensions/common/glm/gtx/matrix_decompose.inl create mode 100644 extensions/common/glm/gtx/matrix_interpolation.hpp create mode 100644 extensions/common/glm/gtx/matrix_interpolation.inl create mode 100644 extensions/common/glm/gtx/matrix_major_storage.hpp create mode 100644 extensions/common/glm/gtx/matrix_major_storage.inl create mode 100644 extensions/common/glm/gtx/matrix_operation.hpp create mode 100644 extensions/common/glm/gtx/matrix_operation.inl create mode 100644 extensions/common/glm/gtx/matrix_query.hpp create mode 100644 extensions/common/glm/gtx/matrix_query.inl create mode 100644 extensions/common/glm/gtx/matrix_transform_2d.hpp create mode 100644 extensions/common/glm/gtx/matrix_transform_2d.inl create mode 100644 extensions/common/glm/gtx/mixed_product.hpp create mode 100644 extensions/common/glm/gtx/mixed_product.inl create mode 100644 extensions/common/glm/gtx/multiple.hpp create mode 100644 extensions/common/glm/gtx/multiple.inl create mode 100644 extensions/common/glm/gtx/norm.hpp create mode 100644 extensions/common/glm/gtx/norm.inl create mode 100644 extensions/common/glm/gtx/normal.hpp create mode 100644 extensions/common/glm/gtx/normal.inl create mode 100644 extensions/common/glm/gtx/normalize_dot.hpp create mode 100644 extensions/common/glm/gtx/normalize_dot.inl create mode 100644 extensions/common/glm/gtx/number_precision.hpp create mode 100644 extensions/common/glm/gtx/number_precision.inl create mode 100644 extensions/common/glm/gtx/optimum_pow.hpp create mode 100644 extensions/common/glm/gtx/optimum_pow.inl create mode 100644 extensions/common/glm/gtx/orthonormalize.hpp create mode 100644 extensions/common/glm/gtx/orthonormalize.inl create mode 100644 extensions/common/glm/gtx/perpendicular.hpp create mode 100644 extensions/common/glm/gtx/perpendicular.inl create mode 100644 extensions/common/glm/gtx/polar_coordinates.hpp create mode 100644 extensions/common/glm/gtx/polar_coordinates.inl create mode 100644 extensions/common/glm/gtx/projection.hpp create mode 100644 extensions/common/glm/gtx/projection.inl create mode 100644 extensions/common/glm/gtx/quaternion.hpp create mode 100644 extensions/common/glm/gtx/quaternion.inl create mode 100644 extensions/common/glm/gtx/range.hpp create mode 100644 extensions/common/glm/gtx/raw_data.hpp create mode 100644 extensions/common/glm/gtx/raw_data.inl create mode 100644 extensions/common/glm/gtx/rotate_normalized_axis.hpp create mode 100644 extensions/common/glm/gtx/rotate_normalized_axis.inl create mode 100644 extensions/common/glm/gtx/rotate_vector.hpp create mode 100644 extensions/common/glm/gtx/rotate_vector.inl create mode 100644 extensions/common/glm/gtx/scalar_multiplication.hpp create mode 100644 extensions/common/glm/gtx/scalar_relational.hpp create mode 100644 extensions/common/glm/gtx/scalar_relational.inl create mode 100644 extensions/common/glm/gtx/simd_mat4.hpp create mode 100644 extensions/common/glm/gtx/simd_mat4.inl create mode 100644 extensions/common/glm/gtx/simd_quat.hpp create mode 100644 extensions/common/glm/gtx/simd_quat.inl create mode 100644 extensions/common/glm/gtx/simd_vec4.hpp create mode 100644 extensions/common/glm/gtx/simd_vec4.inl create mode 100644 extensions/common/glm/gtx/spline.hpp create mode 100644 extensions/common/glm/gtx/spline.inl create mode 100644 extensions/common/glm/gtx/std_based_type.hpp create mode 100644 extensions/common/glm/gtx/std_based_type.inl create mode 100644 extensions/common/glm/gtx/string_cast.hpp create mode 100644 extensions/common/glm/gtx/string_cast.inl create mode 100644 extensions/common/glm/gtx/transform.hpp create mode 100644 extensions/common/glm/gtx/transform.inl create mode 100644 extensions/common/glm/gtx/transform2.hpp create mode 100644 extensions/common/glm/gtx/transform2.inl create mode 100644 extensions/common/glm/gtx/type_aligned.hpp create mode 100644 extensions/common/glm/gtx/type_aligned.inl create mode 100644 extensions/common/glm/gtx/vector_angle.hpp create mode 100644 extensions/common/glm/gtx/vector_angle.inl create mode 100644 extensions/common/glm/gtx/vector_query.hpp create mode 100644 extensions/common/glm/gtx/vector_query.inl create mode 100644 extensions/common/glm/gtx/wrap.hpp create mode 100644 extensions/common/glm/gtx/wrap.inl create mode 100644 extensions/common/glm/integer.hpp create mode 100644 extensions/common/glm/mat2x2.hpp create mode 100644 extensions/common/glm/mat2x3.hpp create mode 100644 extensions/common/glm/mat2x4.hpp create mode 100644 extensions/common/glm/mat3x2.hpp create mode 100644 extensions/common/glm/mat3x3.hpp create mode 100644 extensions/common/glm/mat3x4.hpp create mode 100644 extensions/common/glm/mat4x2.hpp create mode 100644 extensions/common/glm/mat4x3.hpp create mode 100644 extensions/common/glm/mat4x4.hpp create mode 100644 extensions/common/glm/matrix.hpp create mode 100644 extensions/common/glm/packing.hpp create mode 100644 extensions/common/glm/trigonometric.hpp create mode 100644 extensions/common/glm/vec2.hpp create mode 100644 extensions/common/glm/vec3.hpp create mode 100644 extensions/common/glm/vec4.hpp create mode 100644 extensions/common/glm/vector_relational.hpp create mode 100644 extensions/common/logging.hpp create mode 100644 extensions/common/lzoconf.h create mode 100644 extensions/common/lzodefs.h create mode 100644 extensions/common/membuf.hpp create mode 100644 extensions/common/minilzo.c create mode 100644 extensions/common/minilzo.h create mode 100644 extensions/common/p3d/animation.cpp create mode 100644 extensions/common/p3d/animation.hpp create mode 100644 extensions/common/p3d/compressed.cpp create mode 100644 extensions/common/p3d/compressed.hpp create mode 100644 extensions/common/p3d/lod_info.cpp create mode 100644 extensions/common/p3d/lod_info.hpp create mode 100644 extensions/common/p3d/lod_types.hpp create mode 100644 extensions/common/p3d/model.cpp create mode 100644 extensions/common/p3d/model.hpp create mode 100644 extensions/common/p3d/model_info.cpp create mode 100644 extensions/common/p3d/model_info.hpp create mode 100644 extensions/common/p3d/parser.cpp create mode 100644 extensions/common/p3d/parser.hpp create mode 100644 extensions/common/p3d/parser_ref.txt create mode 100644 extensions/common/p3d/read_helpers.hpp create mode 100644 extensions/common/p3d/skeleton.cpp create mode 100644 extensions/common/p3d/skeleton.hpp create mode 100644 extensions/common/pbo/archive.cpp create mode 100644 extensions/common/pbo/archive.hpp create mode 100644 extensions/common/pbo/search.cpp create mode 100644 extensions/common/pbo/search.hpp create mode 100644 extensions/common/shared.cpp create mode 100644 extensions/common/shared.hpp create mode 100644 extensions/common/simplepipe_win32.cpp create mode 100644 extensions/common/simplepipe_win32.hpp create mode 100644 extensions/common/simulation/object.cpp create mode 100644 extensions/common/simulation/object.hpp create mode 100644 extensions/common/singleton.hpp create mode 100644 extensions/common/transform_matrix.hpp create mode 100644 extensions/common/vector.cpp create mode 100644 extensions/common/vector.hpp create mode 100644 extensions/dynload/CMakeLists.txt create mode 100644 extensions/dynload/ace_dynload.cpp create mode 100644 extensions/dynload/ace_dynload_dllmain.cpp create mode 100644 extensions/dynload/dynloader.hpp create mode 160000 extensions/lib/bullet3 diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 9f4a8a29fa..b1c1703f94 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -1,11 +1,20 @@ cmake_minimum_required (VERSION 3.0) project (ACE) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +if(WIN32) +add_definitions(/DWINVER=0x0600 /D_WIN32_WINNT=0x0600) +endif() + if (NOT CMAKE_BUILD_TYPE AND CMAKE_COMPILER_IS_GNUCXX) message(STATUS "No build type selected, default to Debug") set(CMAKE_BUILD_TYPE "Debug") endif() +option(DEVEL "DEVEL" OFF) +option(USE_BULLET "USE_BULLET" OFF) +option(USE_DIRECTX "USE_DIRECTX" OFF) option(USE_64BIT_BUILD "USE_64BIT_BUILD" OFF) option(USE_STATIC_LINKING "USE_STATIC_LINKING" ON) @@ -15,15 +24,66 @@ if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++") else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:x86") set(CMAKE_CXX_FLAGS_DEBUG "/D _DEBUG /MTd /Zi /Ob0 /Od /RTC1") set(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O1 /Ob1 /D NDEBUG") set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Ob2 /D NDEBUG") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG") endif() -file(GLOB ACE_COMMON_SOURCES common/*.h common/*.hpp common/*.c common/*.cpp) -add_library(ace_common STATIC ${ACE_COMMON_SOURCES}) -include_directories(AFTER "common") +include_directories("common") + +if(USE_BULLET) + # Dependencies + # + set(BACKUP_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}) + set(BACKUP_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) + set(BACKUP_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + + add_definitions(-DUSE_DIRECTX) + add_subdirectory(lib/bullet3) + + set_target_properties(App_BasicExample PROPERTIES FOLDER Bullet3) + set_target_properties(App_HelloWorld PROPERTIES FOLDER Bullet3) + set_target_properties(App_ExampleBrowser PROPERTIES FOLDER Bullet3) + set_target_properties(Bullet2FileLoader PROPERTIES FOLDER Bullet3) + set_target_properties(Bullet3Collision PROPERTIES FOLDER Bullet3) + set_target_properties(Bullet3Dynamics PROPERTIES FOLDER Bullet3) + set_target_properties(Bullet3Geometry PROPERTIES FOLDER Bullet3) + set_target_properties(Bullet3Common PROPERTIES FOLDER Bullet3) + set_target_properties(Bullet3OpenCL_clew PROPERTIES FOLDER Bullet3) + set_target_properties(BulletCollision PROPERTIES FOLDER Bullet3) + set_target_properties(BulletDynamics PROPERTIES FOLDER Bullet3) + set_target_properties(BulletFileLoader PROPERTIES FOLDER Bullet3) + set_target_properties(BulletSoftBody PROPERTIES FOLDER Bullet3) + + set_target_properties(BulletWorldImporter PROPERTIES FOLDER Bullet3) + set_target_properties(BulletXmlWorldImporter PROPERTIES FOLDER Bullet3) + set_target_properties(ConvexDecomposition PROPERTIES FOLDER Bullet3) + set_target_properties(GIMPACTUtils PROPERTIES FOLDER Bullet3) + set_target_properties(gtest PROPERTIES FOLDER Bullet3) + set_target_properties(gwen PROPERTIES FOLDER Bullet3) + set_target_properties(HACD PROPERTIES FOLDER Bullet3) + set_target_properties(OpenGLWindow PROPERTIES FOLDER Bullet3) + set_target_properties(LinearMath PROPERTIES FOLDER Bullet3) + + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BACKUP_ARCHIVE_OUTPUT_DIRECTORY}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BACKUP_LIBRARY_OUTPUT_DIRECTORY}) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BACKUP_RUNTIME_OUTPUT_DIRECTORY}) + + include_directories(BEFORE "lib/bullet3/src") +endif() +if(USE_DIRECTX) + add_definitions(-DUSE_DIRECTX) + set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) + find_package (DirectX) + link_directories (BEFORE ${DirectX_D3DX11_LIBRARY}) + include_directories (BEFORE ${DirectX_D3DX11_INCLUDE_DIR} ) +endif() +if(DEVEL) + add_definitions(-DDEVEL) +endif() + string(TIMESTAMP ACE_BUILDSTAMP "%Y-%m-%dT%H:%M:%SZ") set(ACE_VERSION_MAJOR 3) @@ -50,13 +110,29 @@ if(MSVC) set(GLOBAL_RC ${CMAKE_CURRENT_BINARY_DIR}/common/ace_version_win32.rc) endif() -include_directories(AFTER ${CMAKE_CURRENT_BINARY_DIR}/common) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/common) set(GLOBAL_SOURCES ${GLOBAL_RC}) + # Add extensions to build here +add_subdirectory(common) + +# Extensions + add_subdirectory(fcs) add_subdirectory(break_line) add_subdirectory(clipboard) add_subdirectory(advanced_ballistics) +# Test Extension for dynamically loading/unloading built extensions; does not build in release +if (DEVEL) + add_subdirectory(dynload) + add_subdirectory(tests) + if(USE_DIRECTX) + add_subdirectory(lib/directxtk) + endif() +endif() + + + message("Build Type: ${CMAKE_BUILD_TYPE}") \ No newline at end of file diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index e6c55184a7..7e87592e00 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -1,4 +1,4 @@ -#include "ace_common.h" +#include "shared.hpp" #include #include @@ -235,9 +235,11 @@ extern "C" void __stdcall RVExtension(char *output, int outputSize, const char *function) { + ZERO_OUTPUT(); + if (!strcmp(function, "version")) { int n = sprintf_s(output, outputSize, "%s", ACE_FULL_VERSION_STR); - return; + EXTENSION_RETURN(); } char* input = _strdup(function); @@ -257,7 +259,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) retard = calculateRetard(dragModel, ballisticCoefficient, velocity); int n = sprintf_s(output, outputSize, "%f", retard); - return; + EXTENSION_RETURN(); } else if (!strcmp(mode, "atmosphericCorrection")) { double ballisticCoefficient = 1.0; double temperature = 15.0; @@ -273,7 +275,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) ballisticCoefficient = calculateAtmosphericCorrection(ballisticCoefficient, temperature, pressure, humidity, atmosphereModel); int n = sprintf_s(output, outputSize, "%f", ballisticCoefficient); - return; + EXTENSION_RETURN(); } else if (!strcmp(mode, "new")) { unsigned int index = 0; double airFriction = 0.0; @@ -339,8 +341,10 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) tickTime = strtod(strtok_s(NULL, ":", &next_token), NULL); tickTime += strtod(strtok_s(NULL, ":", &next_token), NULL); - if (index >= bulletDatabase.size()) - bulletDatabase.resize(index+1); + while (index >= bulletDatabase.size()) { + Bullet bullet; + bulletDatabase.push_back(bullet); + } bulletDatabase[index].airFriction = airFriction; bulletDatabase[index].ballisticCoefficients = ballisticCoefficients; @@ -366,7 +370,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) bulletDatabase[index].randSeed = 0; int n = sprintf_s(output, outputSize, "%s", ""); - return; + EXTENSION_RETURN(); } else if (!strcmp(mode, "simulate")) { // simulate:0:[-0.109985,542.529,-3.98301]:[3751.57,5332.23,214.252]:[0.598153,2.38829,0]:28.6:0:0.481542:0:215.16 unsigned int index = 0; @@ -583,7 +587,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) }; int n = sprintf_s(output, outputSize, "_bullet setVelocity (_bulletVelocity vectorAdd [%f, %f, %f]); _bullet setPosASL (_bulletPosition vectorAdd [%f, %f, %f]);", velocityOffset[0], velocityOffset[1], velocityOffset[2], positionOffset[0], positionOffset[1], positionOffset[2]); - return; + EXTENSION_RETURN(); } else if (!strcmp(mode, "set")) { int height = 0; int numObjects = 0; @@ -598,7 +602,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map->gridSurfaceIsWater.push_back(surfaceIsWater); int n = sprintf_s(output, outputSize, "%s", ""); - return; + EXTENSION_RETURN(); } else if (!strcmp(mode, "init")) { int mapSize = 0; int mapGrids = 0; @@ -609,15 +613,11 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) mapGrids = (int)ceil((double)mapSize / 50.0) + 1; gridCells = mapGrids * mapGrids; - - auto map_iter = mapDatabase.find(worldName); - if (map_iter == mapDatabase.end()) - return; - map = &map_iter->second; + map = &mapDatabase[worldName]; if (map->gridHeights.size() == gridCells) { int n = sprintf_s(output, outputSize, "%s", "Terrain already initialized"); - return; + EXTENSION_RETURN(); } map->mapSize = mapSize; @@ -630,9 +630,9 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map->gridSurfaceIsWater.reserve(gridCells); int n = sprintf_s(output, outputSize, "%s", ""); - return; + EXTENSION_RETURN(); } int n = sprintf_s(output, outputSize, "%s", ""); - return; + EXTENSION_RETURN(); } diff --git a/extensions/advanced_ballistics/CMakeLists.txt b/extensions/advanced_ballistics/CMakeLists.txt index 19b9fc41d9..51e709f6d2 100644 --- a/extensions/advanced_ballistics/CMakeLists.txt +++ b/extensions/advanced_ballistics/CMakeLists.txt @@ -1,9 +1,10 @@ set(ACE_EXTENSION_NAME "ace_advanced_ballistics") file(GLOB SOURCES *.h *.hpp *.c *.cpp) -add_library( ${ACE_EXTENSION_NAME} SHARED ${GLOBAL_SOURCES} ${SOURCES}) -add_dependencies(${ACE_EXTENSION_NAME} ace_common) -SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES} ${GLOBAL_SOURCES}) +target_link_libraries(${ACE_EXTENSION_NAME} ace_common) +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES FOLDER Extensions) if(CMAKE_COMPILER_IS_GNUCXX) set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) diff --git a/extensions/break_line/CMakeLists.txt b/extensions/break_line/CMakeLists.txt index 00a74d4c3a..5d29d295c8 100644 --- a/extensions/break_line/CMakeLists.txt +++ b/extensions/break_line/CMakeLists.txt @@ -1,9 +1,10 @@ set(ACE_EXTENSION_NAME "ace_break_line") file(GLOB SOURCES *.h *.hpp *.c *.cpp) -add_library( ${ACE_EXTENSION_NAME} SHARED ${GLOBAL_SOURCES} ${SOURCES}) -add_dependencies(${ACE_EXTENSION_NAME} ace_common) -SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES} ${GLOBAL_SOURCES}) +target_link_libraries(${ACE_EXTENSION_NAME} ace_common) +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES FOLDER Extensions) if(CMAKE_COMPILER_IS_GNUCXX) set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) diff --git a/extensions/break_line/ace_break_line.cpp b/extensions/break_line/ace_break_line.cpp index 2b253c05bc..440566b744 100644 --- a/extensions/break_line/ace_break_line.cpp +++ b/extensions/break_line/ace_break_line.cpp @@ -11,7 +11,7 @@ * String with line breaks */ -#include "ace_common.h" +#include "shared.hpp" #include #include @@ -65,12 +65,14 @@ std::string addLineBreaks(const std::vector &words) { #pragma warning( disable : 4996 ) void __stdcall RVExtension(char *output, int outputSize, const char *function) { + ZERO_OUTPUT(); if (!strcmp(function, "version")) { strncpy(output, ACE_FULL_VERSION_STR, outputSize); } else { strncpy(output, addLineBreaks(splitString(function)).c_str(), outputSize); output[outputSize - 1] = '\0'; } + EXTENSION_RETURN(); } #pragma warning( pop ) diff --git a/extensions/clipboard/ace_clipboard.cpp b/extensions/clipboard/ace_clipboard.cpp index 4809a14acf..41e3a5721f 100644 --- a/extensions/clipboard/ace_clipboard.cpp +++ b/extensions/clipboard/ace_clipboard.cpp @@ -9,7 +9,7 @@ * Returns: * None */ -#include "ace_common.h" +#include "shared.hpp" #include #include @@ -23,12 +23,15 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { std::string cur_input(function); std::string result; - if (cur_input.length() < 1) - return; + ZERO_OUTPUT(); + + if (cur_input.length() < 1) { + EXTENSION_RETURN(); + } if (!strcmp(function, "version")) { strncpy(output, ACE_FULL_VERSION_STR, outputSize); - return; + EXTENSION_RETURN(); } #ifdef _WIN32 @@ -38,14 +41,14 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { if (!hClipboardData) { result = "GlobalAlloc() failed, GetLastError=" + GetLastError(); gClipboardData = ""; - return; + EXTENSION_RETURN(); } char *pClipboardData = (char *)GlobalLock(hClipboardData); if (!pClipboardData) { result = "GlobalLock() failed, GetLastError=" + GetLastError(); gClipboardData = ""; - return; + EXTENSION_RETURN(); } memcpy(pClipboardData, gClipboardData.c_str(), gClipboardData.length()); pClipboardData[gClipboardData.length() + 1] = 0x00; @@ -82,6 +85,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { #endif - + EXTENSION_RETURN(); } diff --git a/extensions/cmake/FindDirectX.cmake b/extensions/cmake/FindDirectX.cmake new file mode 100644 index 0000000000..69bf1d62e8 --- /dev/null +++ b/extensions/cmake/FindDirectX.cmake @@ -0,0 +1,215 @@ +# - try to find DirectX include directories and libraries +# +# Once done this will define: +# +# DirectX_XYZ_FOUND - system has the XYZ API +# DirectX_XYZ_INCLUDE_FOUND - system has the include for the XYZ API +# DirectX_XYZ_INCLUDE_DIR - include directory for the XYZ API +# DirectX_XYZ_LIBRARY - path/name for the XYZ library +# +# Where XYZ can be any of: +# +# DDRAW +# D3D +# D3DX +# D3D8 +# D3DX8 +# D3D9 +# D3DX9 +# D3D10 +# D3D10_1 +# D3DX10 +# D3D11 +# D3D11_1 +# D3D11_2 +# D3DX11 +# D2D1 +# + + +include (CheckIncludeFileCXX) +include (FindPackageMessage) + + +if (WIN32) + + if (CMAKE_SIZEOF_VOID_P EQUAL 8) + set (DirectX_ARCHITECTURE x64) + else () + set (DirectX_ARCHITECTURE x86) + endif () + + # Can't use "$ENV{ProgramFiles(x86)}" to avoid violating CMP0053. See + # http://public.kitware.com/pipermail/cmake-developers/2014-October/023190.html + set (ProgramFiles_x86 "ProgramFiles(x86)") + if ("$ENV{${ProgramFiles_x86}}") + set (ProgramFiles "$ENV{${ProgramFiles_x86}}") + else () + set (ProgramFiles "$ENV{ProgramFiles}") + endif () + + find_path (DirectX_ROOT_DIR + Include/d3d9.h + PATHS + "$ENV{DXSDK_DIR}" + "${ProgramFiles}/Microsoft DirectX SDK (June 2010)" + "${ProgramFiles}/Microsoft DirectX SDK (February 2010)" + "${ProgramFiles}/Microsoft DirectX SDK (March 2009)" + "${ProgramFiles}/Microsoft DirectX SDK (August 2008)" + "${ProgramFiles}/Microsoft DirectX SDK (June 2008)" + "${ProgramFiles}/Microsoft DirectX SDK (March 2008)" + "${ProgramFiles}/Microsoft DirectX SDK (November 2007)" + "${ProgramFiles}/Microsoft DirectX SDK (August 2007)" + "${ProgramFiles}/Microsoft DirectX SDK" + DOC "DirectX SDK root directory" + ) + if (DirectX_ROOT_DIR) + set (DirectX_INC_SEARCH_PATH "${DirectX_ROOT_DIR}/Include") + set (DirectX_LIB_SEARCH_PATH "${DirectX_ROOT_DIR}/Lib/${DirectX_ARCHITECTURE}") + set (DirectX_BIN_SEARCH_PATH "${DirectX_ROOT_DIR}/Utilities/bin/x86") + endif () + + # With VS 2011 and Windows 8 SDK, the DirectX SDK is included as part of + # the Windows SDK. + # + # See also: + # - http://msdn.microsoft.com/en-us/library/windows/desktop/ee663275.aspx + if (DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700) + set (USE_WINSDK_HEADERS TRUE) + endif () + + # Find a header in the DirectX SDK + macro (find_dxsdk_header var_name header) + set (include_dir_var "DirectX_${var_name}_INCLUDE_DIR") + set (include_found_var "DirectX_${var_name}_INCLUDE_FOUND") + find_path (${include_dir_var} ${header} + HINTS ${DirectX_INC_SEARCH_PATH} + DOC "The directory where ${header} resides" + CMAKE_FIND_ROOT_PATH_BOTH + ) + if (${include_dir_var}) + set (${include_found_var} TRUE) + find_package_message (${var_name}_INC "Found ${header} header: ${${include_dir_var}}/${header}" "[${${include_dir_var}}]") + endif () + mark_as_advanced (${include_found_var}) + endmacro () + + # Find a library in the DirectX SDK + macro (find_dxsdk_library var_name library) + # DirectX SDK + set (library_var "DirectX_${var_name}_LIBRARY") + find_library (${library_var} ${library} + HINTS ${DirectX_LIB_SEARCH_PATH} + DOC "The directory where ${library} resides" + CMAKE_FIND_ROOT_PATH_BOTH + ) + if (${library_var}) + find_package_message (${var_name}_LIB "Found ${library} library: ${${library_var}}" "[${${library_var}}]") + endif () + mark_as_advanced (${library_var}) + endmacro () + + # Find a header in the Windows SDK + macro (find_winsdk_header var_name header) + if (USE_WINSDK_HEADERS) + # Windows SDK + set (include_dir_var "DirectX_${var_name}_INCLUDE_DIR") + set (include_found_var "DirectX_${var_name}_INCLUDE_FOUND") + check_include_file_cxx (${header} ${include_found_var}) + set (${include_dir_var}) + mark_as_advanced (${include_found_var}) + else () + find_dxsdk_header (${var_name} ${header}) + endif () + endmacro () + + # Find a library in the Windows SDK + macro (find_winsdk_library var_name library) + if (USE_WINSDK_HEADERS) + # XXX: We currently just assume the library exists + set (library_var "DirectX_${var_name}_LIBRARY") + set (${library_var} ${library}) + mark_as_advanced (${library_var}) + else () + find_dxsdk_library (${var_name} ${library}) + endif () + endmacro () + + # Combine header and library variables into an API found variable + macro (find_combined var_name inc_var_name lib_var_name) + if (DirectX_${inc_var_name}_INCLUDE_FOUND AND DirectX_${lib_var_name}_LIBRARY) + set (DirectX_${var_name}_FOUND 1) + find_package_message (${var_name} "Found ${var_name} API" "[${DirectX_${lib_var_name}_LIBRARY}][${DirectX_${inc_var_name}_INCLUDE_DIR}]") + endif () + endmacro () + + find_winsdk_header (DDRAW ddraw.h) + find_winsdk_library (DDRAW ddraw) + find_combined (DDRAW DDRAW DDRAW) + + if (CMAKE_GENERATOR_TOOLSET MATCHES "_xp$") + # Windows 7 SDKs, used by XP toolset, do not include d3d.h + find_dxsdk_header (D3D d3d.h) + else () + find_winsdk_header (D3D d3d.h) + endif () + find_combined (D3D D3D DDRAW) + + find_dxsdk_header (D3DX d3dx.h) + find_combined (D3DX D3DX D3DX) + + find_dxsdk_header (D3D8 d3d8.h) + find_dxsdk_library (D3D8 d3d8) + find_combined (D3D8 D3D8 D3D8) + + find_dxsdk_header (D3DX8 d3dx8.h) + find_dxsdk_library (D3DX8 d3dx8) + find_combined (D3DX8 D3DX8 D3DX8) + + find_winsdk_header (D3D9 d3d9.h) + find_winsdk_library (D3D9 d3d9) + find_combined (D3D9 D3D9 D3D9) + + find_dxsdk_header (D3DX9 d3dx9.h) + find_dxsdk_library (D3DX9 d3dx9) + find_combined (D3DX9 D3DX9 D3DX9) + + find_winsdk_header (DXGI dxgi.h) + find_winsdk_header (DXGI1_2 dxgi1_2.h) + find_winsdk_header (DXGI1_3 dxgi1_3.h) + find_winsdk_library (DXGI dxgi) + + find_winsdk_header (D3D10 d3d10.h) + find_winsdk_library (D3D10 d3d10) + find_combined (D3D10 D3D10 D3D10) + + find_winsdk_header (D3D10_1 d3d10_1.h) + find_winsdk_library (D3D10_1 d3d10_1) + find_combined (D3D10_1 D3D10_1 D3D10_1) + + find_dxsdk_header (D3DX10 d3dx10.h) + find_dxsdk_library (D3DX10 d3dx10) + find_combined (D3DX10 D3DX10 D3DX10) + + find_winsdk_header (D3D11 d3d11.h) + find_winsdk_library (D3D11 d3d11) + find_combined (D3D11 D3D11 D3D11) + find_winsdk_header (D3D11_1 d3d11_1.h) + find_combined (D3D11_1 D3D11_1 D3D11) + find_winsdk_header (D3D11_2 d3d11_2.h) + find_combined (D3D11_2 D3D11_2 D3D11) + + find_dxsdk_header (D3DX11 d3dx11.h) + find_dxsdk_library (D3DX11 d3dx11) + find_combined (D3DX11 D3DX11 D3DX11) + + find_winsdk_header (D2D1 d2d1.h) + find_winsdk_library (D2D1 d2d1) + find_combined (D2D1 D2D1 D2D1) + + find_program (DirectX_FXC_EXECUTABLE fxc + HINTS ${DirectX_BIN_SEARCH_PATH} + DOC "Path to fxc.exe executable." + ) + +endif () \ No newline at end of file diff --git a/extensions/common/CMakeLists.txt b/extensions/common/CMakeLists.txt new file mode 100644 index 0000000000..620023ceb1 --- /dev/null +++ b/extensions/common/CMakeLists.txt @@ -0,0 +1,18 @@ +file(GLOB_RECURSE ACE_COMMON_SOURCES *.h *.hpp *.c *.cpp) + + +file(GLOB ACE_BASE_COMMON_SOURCES *.h *.hpp *.c *.cpp) +file(GLOB ACE_P3D_SOURCES p3d/*.h p3d/*.hpp p3d/*.c p3d/*.cpp) +file(GLOB ACE_PBO_SOURCES pbo/*.h pbo/*.hpp pbo/*.c pbo/*.cpp) +file(GLOB ACE_SIMULATION_SOURCES simulation/*.h simulation/*.hpp simulation/*.c simulation/*.cpp) +file(GLOB ACE_DIRECTX_SOURCES directx/*.h directx/*.hpp directx/*.c directx/*.cpp) +file(GLOB ACE_GLM_SOURCES glm/*.h glm/*.hpp glm/*.c glm/*.cpp) + +SOURCE_GROUP("common" FILES ${ACE_BASE_COMMON_SOURCES}) +SOURCE_GROUP("p3d" FILES ${ACE_P3D_SOURCES}) +SOURCE_GROUP("pbo" FILES ${ACE_PBO_SOURCES}) +SOURCE_GROUP("simulation" FILES ${ACE_SIMULATION_SOURCES}) +SOURCE_GROUP("directx" FILES ${ACE_DIRECTX_SOURCES}) +SOURCE_GROUP("glm" FILES ${ACE_GLM_SOURCES}) + +add_library(ace_common STATIC ${ACE_GLM_SOURCES} ${ACE_BASE_COMMON_SOURCES} ${ACE_P3D_SOURCES} ${ACE_PBO_SOURCES} ${ACE_SIMULATION_SOURCES} ${ACE_DIRECTX_SOURCES}) diff --git a/extensions/common/arguments.hpp b/extensions/common/arguments.hpp new file mode 100644 index 0000000000..70e942a241 --- /dev/null +++ b/extensions/common/arguments.hpp @@ -0,0 +1,90 @@ +#pragma once + +#include "shared.hpp" +#include "vector.hpp" + +#include +#include + +namespace ace { + class argument_accessor { + public: + argument_accessor(const uint32_t index, const std::vector & ar) : _index(index), _args(ar) { } + + const std::string & as_string() const { return _args[_index]; } + operator const std::string &() const { return as_string(); } + + float as_float() const { return atof(_args[_index].c_str()); } + operator float() const { return as_float(); } + + int as_int() const { return atoi(_args[_index].c_str()); } + operator int() const { return as_int(); } + + int as_uint32() const { return (uint32_t)atoi(_args[_index].c_str()); } + operator uint32_t() const { return as_uint32(); } + + ace::vector3 as_vector() const { + std::vector t = ace::split(_args[_index], ';'); + return ace::vector3(atof(t[0].c_str()), + atof(t[1].c_str()), + atof(t[2].c_str())); + } + operator ace::vector3() const { return as_vector(); } + + protected: + const uint32_t _index; + const std::vector & _args; + }; + + class arguments { + public: + arguments(const std::string & str) : _original(str) { + _args = ace::split(str, ','); + for (int i = 0; i < _args.size(); i++) { + _args[i] = trim(_args[i]); + } + } + + size_t size() const { return _args.size(); } + + const argument_accessor operator[] (int index) const { return argument_accessor(index, _args); } + + const std::string & as_string(uint32_t _index) const { return _args[_index]; } + float as_float(uint32_t _index) const { return atof(_args[_index].c_str()); } + int as_int(uint32_t _index) const { return atoi(_args[_index].c_str()); } + int as_uint32(uint32_t _index) const { return (uint32_t)atoi(_args[_index].c_str()); } + ace::vector3 as_vector(uint32_t _index) const { + std::vector t = ace::split(_args[_index], ';'); + return ace::vector3(atof(t[0].c_str()), + atof(t[1].c_str()), + atof(t[2].c_str())); + } + + const std::string & get() const { + return _original; + } + + std::string create(const std::string & command) const { + std::stringstream ss; + ss << command << ":"; + + for (auto & v : _args) { + ss << v << ","; + } + + // Remove the trailing , + std::string result = ss.str(); + result.erase(result.length()); + + return result; + } + static std::string create(const std::string & command, const arguments & args) { + return args.create(command); + } + + + protected: + std::vector _args; + const std::string _original; + }; +} \ No newline at end of file diff --git a/extensions/common/directx/d3d_display.cpp b/extensions/common/directx/d3d_display.cpp new file mode 100644 index 0000000000..bfc7a0e013 --- /dev/null +++ b/extensions/common/directx/d3d_display.cpp @@ -0,0 +1,439 @@ +#ifdef USE_DIRECTX + +#include "shared.hpp" +#include "d3d_display.hpp" + +#include + +#include + +using namespace DirectX; + +namespace ace { + namespace debug { + + DWORD GetMainThreadId() { + const std::shared_ptr hThreadSnapshot( + CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0), CloseHandle); + if (hThreadSnapshot.get() == INVALID_HANDLE_VALUE) { + throw std::runtime_error("GetMainThreadId failed"); + } + THREADENTRY32 tEntry; + tEntry.dwSize = sizeof(THREADENTRY32); + DWORD result = 0; + DWORD currentPID = GetCurrentProcessId(); + for (BOOL success = Thread32First(hThreadSnapshot.get(), &tEntry); + !result && success && GetLastError() != ERROR_NO_MORE_FILES; + success = Thread32Next(hThreadSnapshot.get(), &tEntry)) + { + if (tEntry.th32OwnerProcessID == currentPID) { + result = tEntry.th32ThreadID; + } + } + return result; + } + + d3d_display::d3d_display() : _fullscreen(false) {} + d3d_display::~d3d_display() {} + + bool d3d_display::render_thread(uint32_t w, uint32_t h, bool f) { + _render_thread = std::make_unique(this, d3d_display_worker_args(w, h, f) ); + return true; + } + + void d3d_display::render_worker(d3d_display_worker_args args) { + { + create(args.width, args.height, args.fullscreen); + init(); + } + run(); + } + + bool d3d_display::run() { + MSG msg = { 0 }; + + while (WM_QUIT != msg.message) { + if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } else { + render(); + } + } + + return true; + } + + bool d3d_display::init() { + + std::lock_guard _lock(_render_lock); + + HRESULT hr = S_OK; + RECT rc; + + GetClientRect(_hWnd, &rc); + UINT width = rc.right - rc.left; + UINT height = rc.bottom - rc.top; + UINT createDeviceFlags = 0; +#ifdef _DEBUG + createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; +#endif + + D3D_DRIVER_TYPE driverTypes[] = + { + D3D_DRIVER_TYPE_HARDWARE, + D3D_DRIVER_TYPE_WARP, + D3D_DRIVER_TYPE_REFERENCE, + }; + UINT numDriverTypes = ARRAYSIZE(driverTypes); + + D3D_FEATURE_LEVEL featureLevels[] = + { + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + }; + UINT numFeatureLevels = ARRAYSIZE(featureLevels); + + DXGI_SWAP_CHAIN_DESC sd; + ZeroMemory(&sd, sizeof(sd)); + sd.BufferCount = 1; + sd.BufferDesc.Width = width; + sd.BufferDesc.Height = height; + sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.BufferDesc.RefreshRate.Numerator = 60; + sd.BufferDesc.RefreshRate.Denominator = 1; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.OutputWindow = _hWnd; + sd.SampleDesc.Count = 1; + sd.SampleDesc.Quality = 0; + sd.Windowed = _fullscreen ? FALSE : TRUE; + + for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++) + { + _driverType = driverTypes[driverTypeIndex]; + hr = D3D11CreateDeviceAndSwapChain(nullptr, _driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels, + D3D11_SDK_VERSION, &sd, &_pSwapChain, &_pd3dDevice, &_featureLevel, &_pImmediateContext); + if (SUCCEEDED(hr)) + break; + } + if (FAILED(hr)) + return false; + + // Create a render target view + ID3D11Texture2D* pBackBuffer = nullptr; + hr = _pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer); + if (FAILED(hr)) + return false; + + hr = _pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &_pRenderTargetView); + pBackBuffer->Release(); + if (FAILED(hr)) + return false; + + // Create depth stencil texture + D3D11_TEXTURE2D_DESC descDepth; + ZeroMemory(&descDepth, sizeof(descDepth)); + descDepth.Width = width; + descDepth.Height = height; + descDepth.MipLevels = 1; + descDepth.ArraySize = 1; + descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + descDepth.SampleDesc.Count = 1; + descDepth.SampleDesc.Quality = 0; + descDepth.Usage = D3D11_USAGE_DEFAULT; + descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; + descDepth.CPUAccessFlags = 0; + descDepth.MiscFlags = 0; + hr = _pd3dDevice->CreateTexture2D(&descDepth, nullptr, &_pDepthStencil); + if (FAILED(hr)) + return false; + + // Create the depth stencil view + D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; + ZeroMemory(&descDSV, sizeof(descDSV)); + descDSV.Format = descDepth.Format; + descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + descDSV.Texture2D.MipSlice = 0; + hr = _pd3dDevice->CreateDepthStencilView(_pDepthStencil, &descDSV, &_pDepthStencilView); + if (FAILED(hr)) + return false; + + _pImmediateContext->OMSetRenderTargets(1, &_pRenderTargetView, _pDepthStencilView); + + // Setup the viewport + D3D11_VIEWPORT vp; + vp.Width = (FLOAT)width; + vp.Height = (FLOAT)height; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + _pImmediateContext->RSSetViewports(1, &vp); + + XMStoreFloat4x4(&_World, XMMatrixIdentity()); + XMStoreFloat4x4(&_View, XMMatrixLookAtLH(XMLoadFloat4(&_camera.camPosition), XMLoadFloat4(&_camera.camTarget), XMLoadFloat4(&_camera.camUp))); + XMStoreFloat4x4(&_Projection, XMMatrixPerspectiveFovLH(XM_PIDIV4, width / (FLOAT)height, 0.01f, 100.0f)); + + init_input(); + + return true; + } + + bool d3d_display::init_input() { + RAWINPUTDEVICE Rid[2]; + + Rid[0].usUsagePage = 0x01; // magic numbers + Rid[0].usUsage = 0x02; // magically means mouse + Rid[0].dwFlags = 0; // (use this if you DO NOT WANT to capture mouse) + //Rid[0].dwFlags = RIDEV_CAPTUREMOUSE | RIDEV_NOLEGACY ; // (use this to CAPTURE MOUSE) + Rid[0].hwndTarget = _hWnd; + + Rid[1].usUsagePage = 0x01; // magic numbers + Rid[1].usUsage = 0x06; // magically means keyboard + Rid[1].dwFlags = 0; // use RIDEV_NOHOTKEYS for no winkey + Rid[1].hwndTarget = _hWnd; + + if (!RegisterRawInputDevices(Rid, 2, sizeof(Rid[0]))) { + LOG(ERROR) << "Could not register raw input devices. "; + exit(1); + } + } + + bool d3d_display::create(uint32_t width = 1024, uint32_t height = 768, bool fullscreen = false) { + std::lock_guard _lock(_render_lock); + + _fullscreen = fullscreen; + + WNDCLASSEXW wcex; + wcex.cbSize = sizeof(WNDCLASSEXW); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = (WNDPROC)&ace::debug::d3d_display::wndproc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = (HINSTANCE)GetCurrentProcess(); + //wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_SAMPLE1); + //wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wcex.lpszMenuName = nullptr; + wcex.lpszClassName = L"ACE3BaseDisplayClass"; + //wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SAMPLE1); + if (!RegisterClassExW(&wcex)) { + return false; + } + + // Create window + _hInst = (HINSTANCE)GetCurrentProcess(); + RECT rc = { 0, 0, width, height }; + AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); + _hWnd = CreateWindowW(L"ACE3BaseDisplayClass", L"ACE3 D3D Render", WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, nullptr, nullptr, _hInst, + nullptr); + + if (!_hWnd) { + return false; + } + + // Attach our input to the master input + //AttachThreadInput(GetCurrentThreadId(), GetMainThraedId()); + + SetWindowLongPtr(_hWnd, GWLP_USERDATA, (LONG)this); + + ShowWindow(_hWnd, 5); + + return true; + } + + bool d3d_display::destroy() { + if (_pImmediateContext) _pImmediateContext->ClearState(); + + if (_pBatchInputLayout) _pBatchInputLayout->Release(); + + if (_pTextureRV1) _pTextureRV1->Release(); + if (_pTextureRV2) _pTextureRV2->Release(); + + if (_pDepthStencilView) _pDepthStencilView->Release(); + if (_pDepthStencil) _pDepthStencil->Release(); + if (_pRenderTargetView) _pRenderTargetView->Release(); + if (_pSwapChain) _pSwapChain->Release(); + if (_pImmediateContext) _pImmediateContext->Release(); + if (_pd3dDevice) _pd3dDevice->Release(); + + return true; + } + + bool d3d_display::render() { + // Update our time + static float t = 0.0f; + static float dt = 0.f; + if (_driverType == D3D_DRIVER_TYPE_REFERENCE) { + t += (float)XM_PI * 0.0125f; + } else { + static uint64_t dwTimeStart = 0; + static uint64_t dwTimeLast = 0; + uint64_t dwTimeCur = GetTickCount64(); + if (dwTimeStart == 0) + dwTimeStart = dwTimeCur; + t = (dwTimeCur - dwTimeStart) / 1000.0f; + dt = (dwTimeCur - dwTimeLast) / 1000.0f; + dwTimeLast = dwTimeCur; + } + + { + std::lock_guard _lock(_render_lock); + + _pImmediateContext->ClearRenderTargetView(_pRenderTargetView, Colors::MidnightBlue); + _pImmediateContext->ClearDepthStencilView(_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0); + + update_camera(); + step(); + + _pSwapChain->Present(0, 0); + } + + return true; + } + + bool d3d_display::step() { + return true; + } + + void d3d_display::_move_camera(ace::vector3 direction) { + + } + void d3d_display::_rotate_camera(ace::vector3 direction) { + + } + void d3d_display::update_camera() { + XMVECTOR DefaultForward, DefaultRight, camPosition; + + DefaultForward = XMLoadFloat4(&_camera.DefaultForward); + DefaultRight = XMLoadFloat4(&_camera.DefaultRight); + camPosition = XMLoadFloat4(&_camera.camPosition); + + XMMATRIX camRotationMatrix = XMMatrixRotationRollPitchYaw(_camera.camPitch, _camera.camYaw, 0); + XMVECTOR camTarget = XMVector3TransformCoord(DefaultForward, camRotationMatrix); + camTarget = XMVector3Normalize(camTarget); + + XMVECTOR camRight = XMVector3TransformCoord(DefaultRight, camRotationMatrix); + XMVECTOR camForward = XMVector3TransformCoord(DefaultForward, camRotationMatrix); + XMVECTOR camUp = XMVector3Cross(camForward, camRight); + + camPosition += _camera.moveLeftRight * camRight; + camPosition += _camera.moveBackForward * camForward; + XMStoreFloat4(&_camera.camPosition, camPosition); + + _camera.moveLeftRight = 0.0f; + _camera.moveBackForward = 0.0f; + + camTarget = camPosition + camTarget; + + XMStoreFloat4x4(&_View, XMMatrixLookAtLH(camPosition, camTarget, camUp)); + } + + LRESULT CALLBACK d3d_display::_wndproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + PAINTSTRUCT ps; + HDC hdc; + + switch (message) { + case WM_INPUT: { + UINT dwSize; + if (GetActiveWindow() != _hWnd) { + return DefWindowProc(hWnd, message, wParam, lParam); + } + GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, + sizeof(RAWINPUTHEADER)); + LPBYTE lpb = new BYTE[dwSize]; + if (lpb == NULL) { + return 0; + } + + int readSize = GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)); + + if (readSize != dwSize) + break; + + RAWINPUT* raw = (RAWINPUT*)lpb; + + float speed = 0.5f; + + if (raw->header.dwType == RIM_TYPEKEYBOARD) { + switch (raw->data.keyboard.VKey) { + case VK_SPACE: { + XMStoreFloat4(&_camera.camPosition, XMVectorSet(0, 0, 0, 0)); + break; + } + // Camera Movement + case 0x57: case VK_NUMPAD8: + case VK_UP: { + _camera.moveBackForward += speed; + break; + } + case 0x53: case VK_NUMPAD2: + case VK_DOWN: { + _camera.moveBackForward -= speed; + break; + } + case 0x41: case VK_NUMPAD4: + case VK_LEFT: { + _camera.moveLeftRight -= speed; + break; + } + case 0x44: case VK_NUMPAD6: + case VK_RIGHT: { + _camera.moveLeftRight += speed; + break; + } + // Numpad Movement + case VK_NUMPAD5: { + XMStoreFloat4(&_camera.camPosition, XMVectorSet(0, 0, 0, 0)); + break; + } + } + } + else if (raw->header.dwType == RIM_TYPEMOUSE) { + RAWMOUSE mouseCurrState = raw->data.mouse; + + if ((mouseCurrState.lLastX != _last_mouse_state.lLastY) || (mouseCurrState.lLastX != _last_mouse_state.lLastY)) + { + _camera.camYaw += mouseCurrState.lLastX * 0.005f; + _camera.camPitch += mouseCurrState.lLastY * 0.005f; + _last_mouse_state = mouseCurrState; + } + + } + + delete[] lpb; + return 0; + } + + case WM_PAINT: + hdc = BeginPaint(hWnd, &ps); + EndPaint(hWnd, &ps); + break; + + case WM_DESTROY: + PostQuitMessage(0); + + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + + return 0; + } + LRESULT CALLBACK d3d_display::wndproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + LONG data; + data = GetWindowLongPtr(hWnd, GWLP_USERDATA); + if (data) { + return ((d3d_display*)data)->_wndproc(hWnd, message, wParam, lParam); + } else { + return DefWindowProc(hWnd, message, wParam, lParam); + } + } + }; + + +}; + +#endif \ No newline at end of file diff --git a/extensions/common/directx/d3d_display.hpp b/extensions/common/directx/d3d_display.hpp new file mode 100644 index 0000000000..b10e8ef070 --- /dev/null +++ b/extensions/common/directx/d3d_display.hpp @@ -0,0 +1,130 @@ +#pragma once + +#ifdef USE_DIRECTX + +#include +#include +#include +#include + +#include +#include +#include + +#include "singleton.hpp" +#include "vector.hpp" + +#define IDI_ACE_DEBUG 666 + +namespace ace { + namespace debug { + + __declspec(align(16)) + struct camera_movement { + camera_movement() { + XMStoreFloat4(&DefaultForward, DirectX::XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f)); + XMStoreFloat4(&DefaultRight, DirectX::XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f)); + XMStoreFloat4(&camForward, DirectX::XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f)); + XMStoreFloat4(&camRight, DirectX::XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f)); + + camYaw = 0.0f; + camPitch = 0.0f; + + moveLeftRight = 0.0f; + moveBackForward = 0.0f; + + XMStoreFloat4(&camPosition, DirectX::XMVectorSet(0.0f, 12.0f, 6.0f, 0.0f)); + XMStoreFloat4(&camTarget, DirectX::XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f)); + XMStoreFloat4(&camUp, DirectX::XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f)); + } + + DirectX::XMFLOAT4 DefaultForward; + DirectX::XMFLOAT4 DefaultRight; + DirectX::XMFLOAT4 camForward; + DirectX::XMFLOAT4 camRight; + + DirectX::XMFLOAT4X4 camRotationMatrix; + DirectX::XMFLOAT4X4 groundWorld; + + float moveLeftRight; + float moveBackForward; + + float camYaw; + float camPitch; + + DirectX::XMFLOAT4 camPosition; + DirectX::XMFLOAT4 camTarget; + DirectX::XMFLOAT4 camUp; + }; + + struct d3d_display_worker; + struct d3d_display_worker_args; + __declspec(align(16)) + class d3d_display { + public: + d3d_display(); + ~d3d_display(); + + virtual bool run(); + virtual bool render(); + virtual bool render_thread(uint32_t, uint32_t, bool); + + virtual void update_camera(); + virtual bool step(); + + virtual bool create(uint32_t, uint32_t, bool); + virtual bool init(); + virtual bool init_input(); + + virtual bool destroy(); + + void render_worker(d3d_display_worker_args); + + static LRESULT CALLBACK wndproc(HWND, UINT, WPARAM, LPARAM); + LRESULT CALLBACK _wndproc(HWND, UINT, WPARAM, LPARAM); + protected: + void _move_camera(ace::vector3); + void _rotate_camera(ace::vector3); + + std::unique_ptr _render_thread; + std::mutex _render_lock; + + bool _fullscreen; + HINSTANCE _hInst = nullptr; + HWND _hWnd = nullptr; + D3D_DRIVER_TYPE _driverType = D3D_DRIVER_TYPE_NULL; + D3D_FEATURE_LEVEL _featureLevel = D3D_FEATURE_LEVEL_11_0; + ID3D11Device* _pd3dDevice = nullptr; + ID3D11DeviceContext* _pImmediateContext = nullptr; + IDXGISwapChain* _pSwapChain = nullptr; + ID3D11RenderTargetView* _pRenderTargetView = nullptr; + ID3D11Texture2D* _pDepthStencil = nullptr; + ID3D11DepthStencilView* _pDepthStencilView = nullptr; + + ID3D11ShaderResourceView* _pTextureRV1 = nullptr; + ID3D11ShaderResourceView* _pTextureRV2 = nullptr; + ID3D11InputLayout* _pBatchInputLayout = nullptr; + + DirectX::XMFLOAT4X4 _World; + DirectX::XMFLOAT4X4 _View; + DirectX::XMFLOAT4X4 _Projection; + + RAWMOUSE _last_mouse_state; + camera_movement _camera; + + }; + struct d3d_display_worker_args { + d3d_display_worker_args(uint32_t w, uint32_t h, bool f) : width(w), height(h), fullscreen(f) {} + uint32_t width; + uint32_t height; + bool fullscreen; + }; + struct d3d_display_worker { + d3d_display_worker(d3d_display * obj, d3d_display_worker_args args) : thread(&ace::debug::d3d_display::render_worker, obj, args) {} + ~d3d_display_worker() { thread.join(); } + std::thread thread; + }; + }; +}; + +#endif \ No newline at end of file diff --git a/extensions/common/dispatch.hpp b/extensions/common/dispatch.hpp new file mode 100644 index 0000000000..0a37824b83 --- /dev/null +++ b/extensions/common/dispatch.hpp @@ -0,0 +1,153 @@ +#pragma once + +#include +#include +#include +#include + +#include "shared.hpp" +#include "arguments.hpp" +#include "singleton.hpp" + +namespace ace { + class dispatcher { + public: + dispatcher() : _ready(true) {} + + virtual bool call(const std::string & name_, const arguments & args_, std::string & result_) { + if (_methods.find(name_) == _methods.end()) { + // @TODO: Exceptions + return false; + } + return _methods[name_](args_, result_); + } + + bool add(const std::string & name_, std::function func_) { + if (_methods.find(name_) != _methods.end()) { + // @TODO: Exceptions + return false; + } + _methods[name_] = func_; + + return true; + } + + bool ready() const { return _ready; } + void ready(bool r) { _ready.exchange(r); } + protected: + std::unordered_map < std::string, std::function > _methods; + std::atomic_bool _ready; + }; + class dispatch : public dispatcher, public singleton { }; + + struct dispatch_message { + dispatch_message(const std::string & command_, const arguments & args_, const uint64_t id_) : command(command_), args(args_), id(id_) {} + std::string command; + arguments args; + uint64_t id; + }; + struct dispatch_result { + dispatch_result() {} + dispatch_result(const std::string &res, const uint64_t id_) : message(res), id(id_) {} + std::string message; + uint64_t id; + }; + + class threaded_dispatcher : public dispatcher { + public: + threaded_dispatcher() : _stop(false), _worker(&ace::threaded_dispatcher::monitor, this) { + + } + ~threaded_dispatcher() {} + + bool call(const std::string & name_, const arguments & args_, std::string & result_, bool threaded) { + if (_methods.find(name_) == _methods.end()) { + // @TODO: Exceptions + return false; + } + if (threaded) { + std::lock_guard lock(_messages_lock); + _messages.push(dispatch_message(name_, args_, _message_id)); + + // @TODO: We should provide an interface for this serialization. + std::stringstream ss; + ss << "[\"result_id\", \"" << _message_id << "\" ]"; + result_ = ss.str(); + + _message_id = _message_id + 1; + } else { +#ifdef _DEBUG + if (name_ != "fetch_result") { + LOG(TRACE) << "dispatch[immediate]:\t[" << name_ << "] { " << args_.get() << " }"; + } +#endif + return dispatcher::call(name_, args_, result_); + } + + return true; + } + bool call(const std::string & name_, const arguments & args_, std::string & result_) override { + return call(name_, args_, result_, false); + } + + void push_result(const dispatch_result & result) { + { + std::lock_guard lock(_results_lock); + _results.push(result); + } + } + void push_result(const std::string & result) { + push_result(dispatch_result(result, -1)); + } + void stop() { + std::lock_guard lock(_messages_lock); + _stop = true; + } + protected: + void monitor() { + _ready = false; + while (!_stop) { + { + std::lock_guard lock(_messages_lock); + while (!_messages.empty()) { + if (_ready) { + dispatch_result result; + dispatch_message _message = std::move(_messages.front()); + _messages.pop(); + + result.id = _message.id; + result.message.resize(4096); +#ifdef _DEBUG + if (_message.command != "fetch_result") { + LOG(TRACE) << "dispatch[threaded]:\t[" << _message.command << "]"; + if (_message.args.size() > 0) { + // LOG(TRACE) << "\t{ " << _messages.front().args.get() << " }"; + } + } +#endif + dispatcher::call(_message.command, _message.args, result.message); + { + std::lock_guard lock(_results_lock); + _results.push(result); + } + + + } + } + } + sleep(5); + } + } + std::atomic_bool _stop; + std::queue _results; + std::mutex _results_lock; + + std::queue _messages; + std::mutex _messages_lock; + + std::thread _worker; + + uint64_t _message_id; + }; + class threaded_dispatch : public threaded_dispatcher, public singleton { }; +}; \ No newline at end of file diff --git a/extensions/common/easyloggingc++.hpp b/extensions/common/easyloggingc++.hpp new file mode 100644 index 0000000000..3a5455c4d0 --- /dev/null +++ b/extensions/common/easyloggingc++.hpp @@ -0,0 +1,6718 @@ +// +// Easylogging++ v9.80 +// Single-header only, cross-platform logging library for C++ applications +// +// Copyright (c) 2015 muflihun.com +// +// This library is released under the MIT Licence. +// http://easylogging.muflihun.com/licence.php +// +// easylogging@muflihun.com +// +// https://github.com/easylogging/easyloggingpp +// http://easylogging.muflihun.com +// http://muflihun.com +// +#ifndef EASYLOGGINGPP_H +#define EASYLOGGINGPP_H +// Compilers and C++0x/C++11 Evaluation +#if defined(__GNUC__) +# define ELPP_COMPILER_GCC 1 +# define ELPP_GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +# if defined(__GXX_EXPERIMENTAL_CXX0X__) +# define ELPP_CXX0X 1 +# elif(ELPP_GCC_VERSION >= 40801) +# define ELPP_CXX11 1 +# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) +#endif // defined(__GNUC__) +// Visual C++ +#if defined(_MSC_VER) +# define ELPP_COMPILER_MSVC 1 +# define ELPP_CRT_DBG_WARNINGS 1 +# if (_MSC_VER == 1600) +# define ELPP_CXX0X 1 +# elif(_MSC_VER >= 1700) +# define ELPP_CXX11 1 +# endif // (_MSC_VER == 1600) +#endif // defined(_MSC_VER) +// Clang++ +#if defined(__clang__) && (__clang__ == 1) +# define ELPP_COMPILER_CLANG 1 +# define ELPP_CLANG_VERSION (__clang_major__ * 10000 \ + + __clang_minor__ * 100 \ + + __clang_patchlevel__) +# if (ELPP_CLANG_VERSION >= 30300) +# define ELPP_CXX11 1 +# endif // (ELPP_CLANG_VERSION >= 30300) +#endif // defined(__clang__) && (__clang__ == 1) +// MinGW +#if defined(__MINGW32__) || defined(__MINGW64__) +# define ELPP_MINGW 1 +#endif // defined(__MINGW32__) || defined(__MINGW64__) +// Cygwin +#if defined(__CYGWIN__) && (__CYGWIN__ == 1) +# define ELPP_CYGWIN 1 +#endif // defined(__CYGWIN__) && (__CYGWIN__ == 1) +// Intel C++ +#if defined(__INTEL_COMPILER) +# define ELPP_COMPILER_INTEL 1 +#endif +// Operating System Evaluation +// Windows +#if defined(_WIN32) || defined(_WIN64) +# define ELPP_OS_WINDOWS 1 +#endif // defined(_WIN32) || defined(_WIN64) +// Linux +#if (defined(__linux) || defined(__linux__)) +# define ELPP_OS_LINUX 1 +#endif // (defined(__linux) || defined(__linux__)) +// Mac +#if defined(__APPLE__) +# define ELPP_OS_MAC 1 +#endif // defined(__APPLE__) +// FreeBSD +#if defined(__FreeBSD__) +# define ELPP_OS_FREEBSD 1 +#endif +// Solaris +#if defined(__sun) +# define ELPP_OS_SOLARIS 1 +#endif +// Unix +#if ((ELPP_OS_LINUX || ELPP_OS_MAC || ELPP_OS_FREEBSD || ELPP_OS_SOLARIS) && (!ELPP_OS_WINDOWS)) +# define ELPP_OS_UNIX 1 +#endif // ((ELPP_OS_LINUX || ELPP_OS_MAC || ELPP_OS_FREEBSD || ELPP_OS_SOLARIS) && (!ELPP_OS_WINDOWS)) +// Android +#if defined(__ANDROID__) +# define ELPP_OS_ANDROID 1 +#endif // defined(__ANDROID__) +// Evaluating Cygwin as *nix OS +#if !ELPP_OS_UNIX && !ELPP_OS_WINDOWS && ELPP_CYGWIN +# undef ELPP_OS_UNIX +# undef ELPP_OS_LINUX +# define ELPP_OS_UNIX 1 +# define ELPP_OS_LINUX 1 +#endif // !ELPP_OS_UNIX && !ELPP_OS_WINDOWS && ELPP_CYGWIN +#if !defined(ELPP_INTERNAL_DEBUGGING_OUT_INFO) +# define ELPP_INTERNAL_DEBUGGING_OUT_INFO std::cout +#endif // !defined(ELPP_INTERNAL_DEBUGGING_OUT) +#if !defined(ELPP_INTERNAL_DEBUGGING_OUT_ERROR) +# define ELPP_INTERNAL_DEBUGGING_OUT_ERROR std::cerr +#endif // !defined(ELPP_INTERNAL_DEBUGGING_OUT) +#if !defined(ELPP_INTERNAL_DEBUGGING_ENDL) +# define ELPP_INTERNAL_DEBUGGING_ENDL std::endl +#endif // !defined(ELPP_INTERNAL_DEBUGGING_OUT) +#if !defined(ELPP_INTERNAL_DEBUGGING_MSG) +# define ELPP_INTERNAL_DEBUGGING_MSG(msg) msg +#endif // !defined(ELPP_INTERNAL_DEBUGGING_OUT) +// Internal Assertions and errors +#if !defined(ELPP_DISABLE_ASSERT) +# if (defined(ELPP_DEBUG_ASSERT_FAILURE)) +# define ELPP_ASSERT(expr, msg) if (!(expr)) { \ + std::stringstream internalInfoStream; internalInfoStream << msg; \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR \ + << "EASYLOGGING++ ASSERTION FAILED (LINE: " << __LINE__ << ") [" #expr << "] WITH MESSAGE \"" \ + << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << "\"" << ELPP_INTERNAL_DEBUGGING_ENDL; base::utils::abort(1, \ + "ELPP Assertion failure, please define ELPP_DEBUG_ASSERT_FAILURE"); } +# else +# define ELPP_ASSERT(expr, msg) if (!(expr)) { \ + std::stringstream internalInfoStream; internalInfoStream << msg; \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR\ + << "ASSERTION FAILURE FROM EASYLOGGING++ (LINE: " \ + << __LINE__ << ") [" #expr << "] WITH MESSAGE \"" << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << "\"" \ + << ELPP_INTERNAL_DEBUGGING_ENDL; } +# endif // (defined(ELPP_DEBUG_ASSERT_FAILURE)) +#else +# define ELPP_ASSERT(x, y) +#endif //(!defined(ELPP_DISABLE_ASSERT) +#if ELPP_COMPILER_MSVC +# define ELPP_INTERNAL_DEBUGGING_WRITE_PERROR \ + { char buff[256]; strerror_s(buff, 256, errno); \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR << ": " << buff << " [" << errno << "]";} (void)0 +#else +# define ELPP_INTERNAL_DEBUGGING_WRITE_PERROR \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR << ": " << strerror(errno) << " [" << errno << "]"; (void)0 +#endif // ELPP_COMPILER_MSVC +#if defined(ELPP_DEBUG_ERRORS) +# if !defined(ELPP_INTERNAL_ERROR) +# define ELPP_INTERNAL_ERROR(msg, pe) { \ + std::stringstream internalInfoStream; internalInfoStream << " " << msg; \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR \ + << "ERROR FROM EASYLOGGING++ (LINE: " << __LINE__ << ") " \ + << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << ELPP_INTERNAL_DEBUGGING_ENDL; \ + if (pe) { ELPP_INTERNAL_DEBUGGING_OUT_ERROR << " "; ELPP_INTERNAL_DEBUGGING_WRITE_PERROR; }} (void)0 +# endif +#else +# undef ELPP_INTERNAL_INFO +# define ELPP_INTERNAL_ERROR(msg, pe) +#endif // defined(ELPP_DEBUG_ERRORS) +#if (defined(ELPP_DEBUG_INFO)) +# if !(defined(ELPP_INTERNAL_INFO_LEVEL)) +# define ELPP_INTERNAL_INFO_LEVEL 9 +# endif // !(defined(ELPP_INTERNAL_INFO_LEVEL)) +# if !defined(ELPP_INTERNAL_INFO) +# define ELPP_INTERNAL_INFO(lvl, msg) { if (lvl <= ELPP_INTERNAL_INFO_LEVEL) { \ + std::stringstream internalInfoStream; internalInfoStream << " " << msg; \ + ELPP_INTERNAL_DEBUGGING_OUT_INFO << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) \ + << ELPP_INTERNAL_DEBUGGING_ENDL; }} +# endif +#else +# undef ELPP_INTERNAL_INFO +# define ELPP_INTERNAL_INFO(lvl, msg) +#endif // (defined(ELPP_DEBUG_INFO)) +#if defined(ELPP_STACKTRACE_ON_CRASH) +# if (ELPP_COMPILER_GCC && !ELPP_MINGW) +# define ELPP_STACKTRACE 1 +# else +# if ELPP_COMPILER_MSVC +# pragma message("Stack trace not available for this compiler") +# else +# warning "Stack trace not available for this compiler"; +# endif // ELPP_COMPILER_MSVC +# endif // ELPP_COMPILER_GCC +#endif // (defined(ELPP_STACKTRACE_ON_CRASH)) +// Miscellaneous macros +#define ELPP_UNUSED(x) (void)x +#if ELPP_OS_UNIX +// Log file permissions for unix-based systems +# define ELPP_LOG_PERMS S_IRUSR | S_IWUSR | S_IXUSR | S_IWGRP | S_IRGRP | S_IXGRP | S_IWOTH | S_IXOTH +#endif // ELPP_OS_UNIX +#if defined(ELPP_AS_DLL) && ELPP_COMPILER_MSVC +# if defined(ELPP_EXPORT_SYMBOLS) +# define ELPP_EXPORT __declspec(dllexport) +# else +# define ELPP_EXPORT __declspec(dllimport) +# endif // defined(ELPP_EXPORT_SYMBOLS) +#else +# define ELPP_EXPORT +#endif // defined(ELPP_AS_DLL) && ELPP_COMPILER_MSVC +// Some special functions that are VC++ specific +#undef STRTOK +#undef STRERROR +#undef STRCAT +#undef STRCPY +#if ELPP_CRT_DBG_WARNINGS +# define STRTOK(a, b, c) strtok_s(a, b, c) +# define STRERROR(a, b, c) strerror_s(a, b, c) +# define STRCAT(a, b, len) strcat_s(a, len, b) +# define STRCPY(a, b, len) strcpy_s(a, len, b) +#else +# define STRTOK(a, b, c) strtok(a, b) +# define STRERROR(a, b, c) strerror(c) +# define STRCAT(a, b, len) strcat(a, b) +# define STRCPY(a, b, len) strcpy(a, b) +#endif +// Compiler specific support evaluations +#if (!ELPP_MINGW && !ELPP_COMPILER_CLANG) || defined(ELPP_FORCE_USE_STD_THREAD) +# define ELPP_USE_STD_THREADING 1 +#endif // (!ELPP_MINGW && !ELPP_COMPILER_CLANG) || defined(ELPP_FORCE_USE_STD_THREAD) +#undef ELPP_FINAL +#if ELPP_COMPILER_INTEL || (ELPP_GCC_VERSION < 40702) +# define ELPP_FINAL +#else +# define ELPP_FINAL final +#endif // ELPP_COMPILER_INTEL || (ELPP_GCC_VERSION < 40702) +#if defined(ELPP_EXPERIMENTAL_ASYNC) +# define ELPP_ASYNC_LOGGING 1 +#else +# define ELPP_ASYNC_LOGGING 0 +#endif // defined(ELPP_EXPERIMENTAL_ASYNC) +#if defined(ELPP_THREAD_SAFE) || ELPP_ASYNC_LOGGING +# define ELPP_THREADING_ENABLED 1 +#endif // defined(ELPP_THREAD_SAFE) || ELPP_ASYNC_LOGGING +// Function macro ELPP_FUNC +#undef ELPP_FUNC +#if ELPP_COMPILER_MSVC // Visual C++ +# define ELPP_FUNC __FUNCSIG__ +#elif ELPP_COMPILER_GCC // GCC +# define ELPP_FUNC __PRETTY_FUNCTION__ +#elif ELPP_COMPILER_INTEL // Intel C++ +# define ELPP_FUNC __PRETTY_FUNCTION__ +#elif ELPP_COMPILER_CLANG // Clang++ +# define ELPP_FUNC __PRETTY_FUNCTION__ +#else +# if defined(__func__) +# define ELPP_FUNC __func__ +# else +# define ELPP_FUNC "" +# endif // defined(__func__) +#endif // defined(_MSC_VER) +#undef ELPP_VARIADIC_TEMPLATES_SUPPORTED +// Keep following line commented until features are fixed +#if ELPP_COMPILER_GCC || ELPP_COMPILER_CLANG || ELPP_COMPILER_INTEL || (ELPP_COMPILER_MSVC && _MSC_VER >= 1800) +# define ELPP_VARIADIC_TEMPLATES_SUPPORTED 1 +#endif // ELPP_COMPILER_GCC || ELPP_COMPILER_CLANG || ELPP_COMPILER_INTEL || (ELPP_COMPILER_MSVC && _MSC_VER >= 1800) +// Logging Enable/Disable macros +#if (!defined(ELPP_DISABLE_LOGS)) +# define ELPP_LOGGING_ENABLED 1 +#endif // (!defined(ELPP_DISABLE_LOGS)) +#if (!defined(ELPP_DISABLE_DEBUG_LOGS) && (ELPP_LOGGING_ENABLED) && ((defined(_DEBUG)) || (!defined(NDEBUG)))) +# define ELPP_DEBUG_LOG 1 +#else +# define ELPP_DEBUG_LOG 0 +#endif // (!defined(ELPP_DISABLE_DEBUG_LOGS) && (ELPP_LOGGING_ENABLED) && ((defined(_DEBUG)) || (!defined(NDEBUG)))) +#if (!defined(ELPP_DISABLE_INFO_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_INFO_LOG 1 +#else +# define ELPP_INFO_LOG 0 +#endif // (!defined(ELPP_DISABLE_INFO_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_WARNING_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_WARNING_LOG 1 +#else +# define ELPP_WARNING_LOG 0 +#endif // (!defined(ELPP_DISABLE_WARNING_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_ERROR_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_ERROR_LOG 1 +#else +# define ELPP_ERROR_LOG 0 +#endif // (!defined(ELPP_DISABLE_ERROR_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_FATAL_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_FATAL_LOG 1 +#else +# define ELPP_FATAL_LOG 0 +#endif // (!defined(ELPP_DISABLE_FATAL_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_TRACE_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_TRACE_LOG 1 +#else +# define ELPP_TRACE_LOG 0 +#endif // (!defined(ELPP_DISABLE_TRACE_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_VERBOSE_LOG 1 +#else +# define ELPP_VERBOSE_LOG 0 +#endif // (!defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!(ELPP_CXX0X || ELPP_CXX11)) +# error "Easylogging++ 9.0+ is only compatible with C++0x (or higher) compliant compiler" +#endif // (!(ELPP_CXX0X || ELPP_CXX11)) +// Headers +#if defined(ELPP_SYSLOG) +# include +#endif // defined(ELPP_SYSLOG) +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(ELPP_UNICODE) +# include +# if ELPP_OS_WINDOWS +# include +# endif // ELPP_OS_WINDOWS +#endif // defined(ELPP_UNICODE) +#if ELPP_STACKTRACE +# include +# include +#endif // ELPP_STACKTRACE +#if ELPP_OS_ANDROID +# include +#endif // ELPP_OS_ANDROID +#if ELPP_OS_UNIX +# include +# include +#elif ELPP_OS_WINDOWS +# include +# include +# if defined(WIN32_LEAN_AND_MEAN) +# if defined(ELPP_WINSOCK2) +# include +# else +# include +# endif // defined(ELPP_WINSOCK2) +# endif // defined(WIN32_LEAN_AND_MEAN) +#endif // ELPP_OS_UNIX +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if ELPP_THREADING_ENABLED +# if ELPP_USE_STD_THREADING +# include +# include +# else +# if ELPP_OS_UNIX +# include +# endif // ELPP_OS_UNIX +# endif // ELPP_USE_STD_THREADING +#endif // ELPP_THREADING_ENABLED +#if ELPP_ASYNC_LOGGING +# include +# include +# include +#endif // ELPP_ASYNC_LOGGING +#if defined(ELPP_STL_LOGGING) +// For logging STL based templates +# include +# include +# include +# include +# include +# include +# if defined(ELPP_LOG_STD_ARRAY) +# include +# endif // defined(ELPP_LOG_STD_ARRAY) +# if defined(ELPP_LOG_UNORDERED_MAP) +# include +# endif // defined(ELPP_LOG_UNORDERED_MAP) +# if defined(ELPP_LOG_UNORDERED_SET) +# include +# endif // defined(ELPP_UNORDERED_SET) +#endif // defined(ELPP_STL_LOGGING) +#if defined(ELPP_QT_LOGGING) +// For logging Qt based classes & templates +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif // defined(ELPP_QT_LOGGING) +#if defined(ELPP_BOOST_LOGGING) +// For logging boost based classes & templates +# include +# include +# include +# include +# include +# include +# include +# include +#endif // defined(ELPP_BOOST_LOGGING) +#if defined(ELPP_WXWIDGETS_LOGGING) +// For logging wxWidgets based classes & templates +# include +#endif // defined(ELPP_WXWIDGETS_LOGGING) +// Forward declarations +namespace el { + class Logger; + class LogMessage; + class PerformanceTrackingData; + class Loggers; + class Helpers; + template class Callback; + class LogDispatchCallback; + class PerformanceTrackingCallback; + class LogDispatchData; + namespace base { + class Storage; + class RegisteredLoggers; + class PerformanceTracker; + class MessageBuilder; + class Writer; + class PErrorWriter; + class LogDispatcher; + class DefaultLogBuilder; + class DefaultLogDispatchCallback; +#if ELPP_ASYNC_LOGGING + class AsyncLogDispatchCallback; + class AsyncDispatchWorker; +#endif // ELPP_ASYNC_LOGGING + class DefaultPerformanceTrackingCallback; + } // namespace base +} // namespace el + /// @brief Easylogging++ entry namespace +namespace el { + /// @brief Namespace containing base/internal functionality used by Easylogging++ + namespace base { + /// @brief Data types used by Easylogging++ + namespace type { +#undef ELPP_LITERAL +#undef ELPP_STRLEN +#undef ELPP_COUT +#if defined(ELPP_UNICODE) +# define ELPP_LITERAL(txt) L##txt +# define ELPP_STRLEN wcslen +# if defined ELPP_CUSTOM_COUT +# define ELPP_COUT ELPP_CUSTOM_COUT +# else +# define ELPP_COUT std::wcout +# endif // defined ELPP_CUSTOM_COUT + typedef wchar_t char_t; + typedef std::wstring string_t; + typedef std::wstringstream stringstream_t; + typedef std::wfstream fstream_t; + typedef std::wostream ostream_t; +#else +# define ELPP_LITERAL(txt) txt +# define ELPP_STRLEN strlen +# if defined ELPP_CUSTOM_COUT +# define ELPP_COUT ELPP_CUSTOM_COUT +# else +# define ELPP_COUT std::cout +# endif // defined ELPP_CUSTOM_COUT + typedef char char_t; + typedef std::string string_t; + typedef std::stringstream stringstream_t; + typedef std::fstream fstream_t; + typedef std::ostream ostream_t; +#endif // defined(ELPP_UNICODE) +#if defined(ELPP_CUSTOM_COUT_LINE) +# define ELPP_COUT_LINE(logLine) ELPP_CUSTOM_COUT_LINE(logLine) +#else +# define ELPP_COUT_LINE(logLine) logLine << std::flush +#endif // defined(ELPP_CUSTOM_COUT_LINE) + typedef unsigned short EnumType; + typedef std::shared_ptr StoragePointer; + typedef int VerboseLevel; + typedef std::shared_ptr LogDispatchCallbackPtr; + typedef std::shared_ptr PerformanceTrackingCallbackPtr; + } // namespace type + /// @brief Internal helper class that prevent copy constructor for class + /// + /// @detail When using this class simply inherit it privately + class NoCopy { + protected: + NoCopy(void) {} + private: + NoCopy(const NoCopy&); + NoCopy& operator=(const NoCopy&); + }; + /// @brief Internal helper class that makes all default constructors private. + /// + /// @detail This prevents initializing class making it static unless an explicit constructor is declared. + /// When using this class simply inherit it privately + class StaticClass { + private: + StaticClass(void); + StaticClass(const StaticClass&); + StaticClass& operator=(const StaticClass&); + }; + } // namespace base + /// @brief Represents enumeration for severity level used to determine level of logging + /// + /// @detail With Easylogging++, developers may disable or enable any level regardless of + /// what the severity is. Or they can choose to log using hierarchical logging flag + enum class Level : base::type::EnumType { + /// @brief Generic level that represents all the levels. Useful when setting global configuration for all levels + Global = 1, + /// @brief Information that can be useful to back-trace certain events - mostly useful than debug logs. + Trace = 2, + /// @brief Informational events most useful for developers to debug application + Debug = 4, + /// @brief Severe error information that will presumably abort application + Fatal = 8, + /// @brief Information representing errors in application but application will keep running + Error = 16, + /// @brief Useful when application has potentially harmful situtaions + Warning = 32, + /// @brief Information that can be highly useful and vary with verbose logging level. + Verbose = 64, + /// @brief Mainly useful to represent current progress of application + Info = 128, + /// @brief Represents unknown level + Unknown = 1010 + }; + /// @brief Static class that contains helper functions for el::Level + class LevelHelper : base::StaticClass { + public: + /// @brief Represents minimum valid level. Useful when iterating through enum. + static const base::type::EnumType kMinValid = static_cast(Level::Trace); + /// @brief Represents maximum valid level. This is used internally and you should not need it. + static const base::type::EnumType kMaxValid = static_cast(Level::Info); + /// @brief Casts level to int, useful for iterating through enum. + static base::type::EnumType castToInt(Level level) { + return static_cast(level); + } + /// @brief Casts int(ushort) to level, useful for iterating through enum. + static Level castFromInt(base::type::EnumType l) { + return static_cast(l); + } + /// @brief Converts level to associated const char* + /// @return Upper case string based level. + static const char* convertToString(Level level) { + // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet. + if (level == Level::Global) return "GLOBAL"; + if (level == Level::Debug) return "DEBUG"; + if (level == Level::Info) return "INFO"; + if (level == Level::Warning) return "WARNING"; + if (level == Level::Error) return "ERROR"; + if (level == Level::Fatal) return "FATAL"; + if (level == Level::Verbose) return "VERBOSE"; + if (level == Level::Trace) return "TRACE"; + return "UNKNOWN"; + } + /// @brief Converts from levelStr to Level + /// @param levelStr Upper case string based level. + /// Lower case is also valid but providing upper case is recommended. + static Level convertFromString(const char* levelStr) { + if ((strcmp(levelStr, "GLOBAL") == 0) || (strcmp(levelStr, "global") == 0)) + return Level::Global; + if ((strcmp(levelStr, "DEBUG") == 0) || (strcmp(levelStr, "debug") == 0)) + return Level::Debug; + if ((strcmp(levelStr, "INFO") == 0) || (strcmp(levelStr, "info") == 0)) + return Level::Info; + if ((strcmp(levelStr, "WARNING") == 0) || (strcmp(levelStr, "warning") == 0)) + return Level::Warning; + if ((strcmp(levelStr, "ERROR") == 0) || (strcmp(levelStr, "error") == 0)) + return Level::Error; + if ((strcmp(levelStr, "FATAL") == 0) || (strcmp(levelStr, "fatal") == 0)) + return Level::Fatal; + if ((strcmp(levelStr, "VERBOSE") == 0) || (strcmp(levelStr, "verbose") == 0)) + return Level::Verbose; + if ((strcmp(levelStr, "TRACE") == 0) || (strcmp(levelStr, "trace") == 0)) + return Level::Trace; + return Level::Unknown; + } + /// @brief Applies specified function to each level starting from startIndex + /// @param startIndex initial value to start the iteration from. This is passed as pointer and + /// is left-shifted so this can be used inside function (fn) to represent current level. + /// @param fn function to apply with each level. This bool represent whether or not to stop iterating through levels. + static inline void forEachLevel(base::type::EnumType* startIndex, const std::function& fn) { + base::type::EnumType lIndexMax = LevelHelper::kMaxValid; + do { + if (fn()) { + break; + } + *startIndex = static_cast(*startIndex << 1); + } while (*startIndex <= lIndexMax); + } + }; + /// @brief Represents enumeration of ConfigurationType used to configure or access certain aspect + /// of logging + enum class ConfigurationType : base::type::EnumType { + /// @brief Determines whether or not corresponding level and logger of logging is enabled + /// You may disable all logs by using el::Level::Global + Enabled = 1, + /// @brief Whether or not to write corresponding log to log file + ToFile = 2, + /// @brief Whether or not to write corresponding level and logger log to standard output. + /// By standard output meaning termnal, command prompt etc + ToStandardOutput = 4, + /// @brief Determines format of logging corresponding level and logger. + Format = 8, + /// @brief Determines log file (full path) to write logs to for correponding level and logger + Filename = 16, + /// @brief Specifies milliseconds width. Width can be within range (1-6) + MillisecondsWidth = 32, + /// @brief Determines whether or not performance tracking is enabled. + /// + /// @detail This does not depend on logger or level. Performance tracking always uses 'performance' logger + PerformanceTracking = 64, + /// @brief Specifies log file max size. + /// + /// @detail If file size of corresponding log file (for corresponding level) is >= specified size, log file will + /// be truncated and re-initiated. + MaxLogFileSize = 128, + /// @brief Specifies number of log entries to hold until we flush pending log data + LogFlushThreshold = 256, + /// @brief Represents unknown configuration + Unknown = 1010 + }; + /// @brief Static class that contains helper functions for el::ConfigurationType + class ConfigurationTypeHelper : base::StaticClass { + public: + /// @brief Represents minimum valid configuration type. Useful when iterating through enum. + static const base::type::EnumType kMinValid = static_cast(ConfigurationType::Enabled); + /// @brief Represents maximum valid configuration type. This is used internally and you should not need it. + static const base::type::EnumType kMaxValid = static_cast(ConfigurationType::MaxLogFileSize); + /// @brief Casts configuration type to int, useful for iterating through enum. + static base::type::EnumType castToInt(ConfigurationType configurationType) { + return static_cast(configurationType); + } + /// @brief Casts int(ushort) to configurationt type, useful for iterating through enum. + static ConfigurationType castFromInt(base::type::EnumType c) { + return static_cast(c); + } + /// @brief Converts configuration type to associated const char* + /// @returns Upper case string based configuration type. + static const char* convertToString(ConfigurationType configurationType) { + // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet. + if (configurationType == ConfigurationType::Enabled) return "ENABLED"; + if (configurationType == ConfigurationType::Filename) return "FILENAME"; + if (configurationType == ConfigurationType::Format) return "FORMAT"; + if (configurationType == ConfigurationType::ToFile) return "TO_FILE"; + if (configurationType == ConfigurationType::ToStandardOutput) return "TO_STANDARD_OUTPUT"; + if (configurationType == ConfigurationType::MillisecondsWidth) return "MILLISECONDS_WIDTH"; + if (configurationType == ConfigurationType::PerformanceTracking) return "PERFORMANCE_TRACKING"; + if (configurationType == ConfigurationType::MaxLogFileSize) return "MAX_LOG_FILE_SIZE"; + if (configurationType == ConfigurationType::LogFlushThreshold) return "LOG_FLUSH_THRESHOLD"; + return "UNKNOWN"; + } + /// @brief Converts from configStr to ConfigurationType + /// @param configStr Upper case string based configuration type. + /// Lower case is also valid but providing upper case is recommended. + static ConfigurationType convertFromString(const char* configStr) { + if ((strcmp(configStr, "ENABLED") == 0) || (strcmp(configStr, "enabled") == 0)) + return ConfigurationType::Enabled; + if ((strcmp(configStr, "TO_FILE") == 0) || (strcmp(configStr, "to_file") == 0)) + return ConfigurationType::ToFile; + if ((strcmp(configStr, "TO_STANDARD_OUTPUT") == 0) || (strcmp(configStr, "to_standard_output") == 0)) + return ConfigurationType::ToStandardOutput; + if ((strcmp(configStr, "FORMAT") == 0) || (strcmp(configStr, "format") == 0)) + return ConfigurationType::Format; + if ((strcmp(configStr, "FILENAME") == 0) || (strcmp(configStr, "filename") == 0)) + return ConfigurationType::Filename; + if ((strcmp(configStr, "MILLISECONDS_WIDTH") == 0) || (strcmp(configStr, "milliseconds_width") == 0)) + return ConfigurationType::MillisecondsWidth; + if ((strcmp(configStr, "PERFORMANCE_TRACKING") == 0) || (strcmp(configStr, "performance_tracking") == 0)) + return ConfigurationType::PerformanceTracking; + if ((strcmp(configStr, "MAX_LOG_FILE_SIZE") == 0) || (strcmp(configStr, "max_log_file_size") == 0)) + return ConfigurationType::MaxLogFileSize; + if ((strcmp(configStr, "LOG_FLUSH_THRESHOLD") == 0) || (strcmp(configStr, "log_flush_threshold") == 0)) + return ConfigurationType::LogFlushThreshold; + return ConfigurationType::Unknown; + } + /// @brief Applies specified function to each configuration type starting from startIndex + /// @param startIndex initial value to start the iteration from. This is passed by pointer and is left-shifted + /// so this can be used inside function (fn) to represent current configuration type. + /// @param fn function to apply with each configuration type. + /// This bool represent whether or not to stop iterating through configurations. + static inline void forEachConfigType(base::type::EnumType* startIndex, const std::function& fn) { + base::type::EnumType cIndexMax = ConfigurationTypeHelper::kMaxValid; + do { + if (fn()) { + break; + } + *startIndex = static_cast(*startIndex << 1); + } while (*startIndex <= cIndexMax); + } + }; + /// @brief Flags used while writing logs. This flags are set by user + enum class LoggingFlag : base::type::EnumType { + /// @brief Makes sure we have new line for each container log entry + NewLineForContainer = 1, + /// @brief Makes sure if -vmodule is used and does not specifies a module, then verbose + /// logging is allowed via that module. + AllowVerboseIfModuleNotSpecified = 2, + /// @brief When handling crashes by default, detailed crash reason will be logged as well + LogDetailedCrashReason = 4, + /// @brief Allows to disable application abortion when logged using FATAL level + DisableApplicationAbortOnFatalLog = 8, + /// @brief Flushes log with every log-entry (performance sensative) - Disabled by default + ImmediateFlush = 16, + /// @brief Enables strict file rolling + StrictLogFileSizeCheck = 32, + /// @brief Make terminal output colorful for supported terminals + ColoredTerminalOutput = 64, + /// @brief Supports use of multiple logging in same macro, e.g, CLOG(INFO, "default", "network") + MultiLoggerSupport = 128, + /// @brief Disables comparing performance tracker's checkpoints + DisablePerformanceTrackingCheckpointComparison = 256, + /// @brief Disable VModules + DisableVModules = 512, + /// @brief Disable VModules extensions + DisableVModulesExtensions = 1024, + /// @brief Enables hierarchical logging + HierarchicalLogging = 2048, + /// @brief Creates logger automatically when not available + CreateLoggerAutomatically = 4096, + /// @brief Adds spaces b/w logs that separated by left-shift operator + AutoSpacing = 8192, + /// @brief Preserves time format and does not convert it to sec, hour etc (performance tracking only) + FixedTimeFormat = 16384 + }; + namespace base { + /// @brief Namespace containing constants used internally. + namespace consts { + // Level log values - These are values that are replaced in place of %level format specifier + static const base::type::char_t* kInfoLevelLogValue = ELPP_LITERAL("INFO "); + static const base::type::char_t* kDebugLevelLogValue = ELPP_LITERAL("DEBUG"); + static const base::type::char_t* kWarningLevelLogValue = ELPP_LITERAL("WARN "); + static const base::type::char_t* kErrorLevelLogValue = ELPP_LITERAL("ERROR"); + static const base::type::char_t* kFatalLevelLogValue = ELPP_LITERAL("FATAL"); + static const base::type::char_t* kVerboseLevelLogValue = ELPP_LITERAL("VER"); + static const base::type::char_t* kTraceLevelLogValue = ELPP_LITERAL("TRACE"); + static const base::type::char_t* kInfoLevelShortLogValue = ELPP_LITERAL("I"); + static const base::type::char_t* kDebugLevelShortLogValue = ELPP_LITERAL("D"); + static const base::type::char_t* kWarningLevelShortLogValue = ELPP_LITERAL("W"); + static const base::type::char_t* kErrorLevelShortLogValue = ELPP_LITERAL("E"); + static const base::type::char_t* kFatalLevelShortLogValue = ELPP_LITERAL("F"); + static const base::type::char_t* kVerboseLevelShortLogValue = ELPP_LITERAL("V"); + static const base::type::char_t* kTraceLevelShortLogValue = ELPP_LITERAL("T"); + // Format specifiers - These are used to define log format + static const base::type::char_t* kAppNameFormatSpecifier = ELPP_LITERAL("%app"); + static const base::type::char_t* kLoggerIdFormatSpecifier = ELPP_LITERAL("%logger"); + static const base::type::char_t* kThreadIdFormatSpecifier = ELPP_LITERAL("%thread"); + static const base::type::char_t* kSeverityLevelFormatSpecifier = ELPP_LITERAL("%level"); + static const base::type::char_t* kSeverityLevelShortFormatSpecifier = ELPP_LITERAL("%levshort"); + static const base::type::char_t* kDateTimeFormatSpecifier = ELPP_LITERAL("%datetime"); + static const base::type::char_t* kLogFileFormatSpecifier = ELPP_LITERAL("%file"); + static const base::type::char_t* kLogFileBaseFormatSpecifier = ELPP_LITERAL("%fbase"); + static const base::type::char_t* kLogLineFormatSpecifier = ELPP_LITERAL("%line"); + static const base::type::char_t* kLogLocationFormatSpecifier = ELPP_LITERAL("%loc"); + static const base::type::char_t* kLogFunctionFormatSpecifier = ELPP_LITERAL("%func"); + static const base::type::char_t* kCurrentUserFormatSpecifier = ELPP_LITERAL("%user"); + static const base::type::char_t* kCurrentHostFormatSpecifier = ELPP_LITERAL("%host"); + static const base::type::char_t* kMessageFormatSpecifier = ELPP_LITERAL("%msg"); + static const base::type::char_t* kVerboseLevelFormatSpecifier = ELPP_LITERAL("%vlevel"); + static const char* kDateTimeFormatSpecifierForFilename = "%datetime"; + // Date/time + static const char* kDays[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; + static const char* kDaysAbbrev[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + static const char* kMonths[12] = { "January", "February", "March", "Apri", "May", "June", "July", "August", + "September", "October", "November", "December" }; + static const char* kMonthsAbbrev[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + static const char* kDefaultDateTimeFormat = "%Y-%M-%d %H:%m:%s,%g"; + static const char* kDefaultDateTimeFormatInFilename = "%Y-%M-%d_%H-%m"; + static const int kYearBase = 1900; + static const char* kAm = "AM"; + static const char* kPm = "PM"; + // Miscellaneous constants + static const char* kDefaultLoggerId = "default"; + static const char* kPerformanceLoggerId = "performance"; + static const char* kSysLogLoggerId = "syslog"; + static const char* kNullPointer = "nullptr"; + static const char kFormatSpecifierChar = '%'; +#if ELPP_VARIADIC_TEMPLATES_SUPPORTED + static const char kFormatSpecifierCharValue = 'v'; +#endif // ELPP_VARIADIC_TEMPLATES_SUPPORTED + static const unsigned int kMaxLogPerContainer = 100; + static const unsigned int kMaxLogPerCounter = 100000; + static const unsigned int kDefaultMillisecondsWidth = 3; + static const base::type::VerboseLevel kMaxVerboseLevel = 9; + static const char* kUnknownUser = "user"; + static const char* kUnknownHost = "unknown-host"; +#if defined(ELPP_DEFAULT_LOG_FILE) + static const char* kDefaultLogFile = ELPP_DEFAULT_LOG_FILE; +#else +# if ELPP_OS_UNIX +# if ELPP_OS_ANDROID + static const char* kDefaultLogFile = "logs/ace.log"; +# else + static const char* kDefaultLogFile = "logs/ace.log"; +# endif // ELPP_OS_ANDROID +# elif ELPP_OS_WINDOWS + static const char* kDefaultLogFile = "logs\\ace.log"; +# endif // ELPP_OS_UNIX +#endif // defined(ELPP_DEFAULT_LOG_FILE) +#if !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG) + static const char* kDefaultLogFileParam = "--default-log-file"; +#endif // !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG) +#if defined(ELPP_LOGGING_FLAGS_FROM_ARG) + static const char* kLoggingFlagsParam = "--logging-flags"; +#endif // defined(ELPP_LOGGING_FLAGS_FROM_ARG) +#if ELPP_OS_WINDOWS + static const char* kFilePathSeperator = "\\"; +#else + static const char* kFilePathSeperator = "/"; +#endif // ELPP_OS_WINDOWS + static const char* kValidLoggerIdSymbols = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._"; + static const char* kConfigurationComment = "##"; + static const char* kConfigurationLevel = "*"; + static const char* kConfigurationLoggerId = "--"; + static const std::size_t kSourceFilenameMaxLength = 100; + static const std::size_t kSourceLineMaxLength = 10; + static const Level kPerformanceTrackerDefaultLevel = Level::Info; + const struct { + double value; + const base::type::char_t* unit; + } kTimeFormats[] = { + { 1000.0f, ELPP_LITERAL("mis") }, + { 1000.0f, ELPP_LITERAL("ms") }, + { 60.0f, ELPP_LITERAL("seconds") }, + { 60.0f, ELPP_LITERAL("minutes") }, + { 24.0f, ELPP_LITERAL("hours") }, + { 7.0f, ELPP_LITERAL("days") } + }; + static const int kTimeFormatsCount = sizeof(kTimeFormats) / sizeof(kTimeFormats[0]); + const struct { + int numb; + const char* name; + const char* brief; + const char* detail; + } kCrashSignals[] = { + // NOTE: Do not re-order, if you do please check CrashHandler(bool) constructor and CrashHandler::setHandler(..) + { SIGABRT, "SIGABRT", "Abnormal termination", + "Program was abnormally terminated." }, + { SIGFPE, "SIGFPE", "Erroneous arithmetic operation", + "Arithemetic operation issue such as division by zero or operation resulting in overflow." }, + { SIGILL, "SIGILL", "Illegal instruction", + "Generally due to a corruption in the code or to an attempt to execute data." }, + { SIGSEGV, "SIGSEGV", "Invalid access to memory", + "Program is trying to read an invalid (unallocated, deleted or corrupted) or inaccessible memory." }, + { SIGINT, "SIGINT", "Interactive attention signal", + "Interruption generated (generally) by user or operating system." }, + }; + static const int kCrashSignalsCount = sizeof(kCrashSignals) / sizeof(kCrashSignals[0]); + } // namespace consts + } // namespace base + typedef std::function PreRollOutCallback; + namespace base { + static inline void defaultPreRollOutCallback(const char*, std::size_t) {} + /// @brief Enum to represent timestamp unit + enum class TimestampUnit : base::type::EnumType { + Microsecond = 0, Millisecond = 1, Second = 2, Minute = 3, Hour = 4, Day = 5 + }; + /// @brief Format flags used to determine specifiers that are active for performance improvements. + enum class FormatFlags : base::type::EnumType { + DateTime = 1 << 1, LoggerId = 1 << 2, File = 1 << 3, Line = 1 << 4, Location = 1 << 5, Function = 1 << 6, + User = 1 << 7, Host = 1 << 8, LogMessage = 1 << 9, VerboseLevel = 1 << 10, AppName = 1 << 11, ThreadId = 1 << 12, + Level = 1 << 13, FileBase = 1 << 14, LevelShort = 1 << 15 + }; + /// @brief A milliseconds width class containing actual width and offset for date/time + class MillisecondsWidth { + public: + MillisecondsWidth(void) { init(base::consts::kDefaultMillisecondsWidth); } + explicit MillisecondsWidth(int width) { init(width); } + bool operator==(const MillisecondsWidth& msWidth) { return m_width == msWidth.m_width && m_offset == msWidth.m_offset; } + int m_width; unsigned int m_offset; + private: + void init(int width) { + if (width < 1 || width > 6) { + width = base::consts::kDefaultMillisecondsWidth; + } + m_width = width; + switch (m_width) { + case 3: m_offset = 1000; break; + case 4: m_offset = 100; break; + case 5: m_offset = 10; break; + case 6: m_offset = 1; break; + default: m_offset = 1000; break; + } + } + }; + /// @brief Namespace containing utility functions/static classes used internally + namespace utils { + /// @brief Deletes memory safely and points to null + template + static inline + typename std::enable_if::value, void>::type + safeDelete(T*& pointer) { + if (pointer == nullptr) + return; + delete pointer; + pointer = nullptr; + } + /// @brief Gets value of const char* but if it is nullptr, a string nullptr is returned + static inline const char* charPtrVal(const char* pointer) { + return pointer == nullptr ? base::consts::kNullPointer : pointer; + } + /// @brief Aborts application due with user-defined status + static inline void abort(int status, const std::string& reason = std::string()) { + // Both status and reason params are there for debugging with tools like gdb etc + ELPP_UNUSED(status); + ELPP_UNUSED(reason); +#if defined(ELPP_COMPILER_MSVC) && defined(_M_IX86) && defined(_DEBUG) + // Ignore msvc critical error dialog - break instead (on debug mode) + _asm int 3 +#else + ::abort(); +#endif // defined(ELPP_COMPILER_MSVC) && defined(_M_IX86) && defined(_DEBUG) + } + /// @brief Bitwise operations for C++11 strong enum class. This casts e into Flag_T and returns value after bitwise operation + /// Use these function as
flag = bitwise::Or(MyEnum::val1, flag);
+ namespace bitwise { + template + static inline base::type::EnumType And(Enum e, base::type::EnumType flag) { + return static_cast(flag) & static_cast(e); + } + template + static inline base::type::EnumType Not(Enum e, base::type::EnumType flag) { + return static_cast(flag) & ~(static_cast(e)); + } + template + static inline base::type::EnumType Or(Enum e, base::type::EnumType flag) { + return static_cast(flag) | static_cast(e); + } + } // namespace bitwise + template + static inline void addFlag(Enum e, base::type::EnumType* flag) { + *flag = base::utils::bitwise::Or(e, *flag); + } + template + static inline void removeFlag(Enum e, base::type::EnumType* flag) { + *flag = base::utils::bitwise::Not(e, *flag); + } + template + static inline bool hasFlag(Enum e, base::type::EnumType flag) { + return base::utils::bitwise::And(e, flag) > 0x0; + } + } // namespace utils + namespace threading { +#if ELPP_THREADING_ENABLED +# if !ELPP_USE_STD_THREADING + namespace internal { + /// @brief A mutex wrapper for compiler that dont yet support std::mutex + class Mutex : base::NoCopy { + public: + Mutex(void) { +# if ELPP_OS_UNIX + pthread_mutex_init(&m_underlyingMutex, nullptr); +# elif ELPP_OS_WINDOWS + InitializeCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + virtual ~Mutex(void) { +# if ELPP_OS_UNIX + pthread_mutex_destroy(&m_underlyingMutex); +# elif ELPP_OS_WINDOWS + DeleteCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + inline void lock(void) { +# if ELPP_OS_UNIX + pthread_mutex_lock(&m_underlyingMutex); +# elif ELPP_OS_WINDOWS + EnterCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + inline bool try_lock(void) { +# if ELPP_OS_UNIX + return (pthread_mutex_trylock(&m_underlyingMutex) == 0); +# elif ELPP_OS_WINDOWS + return TryEnterCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + inline void unlock(void) { +# if ELPP_OS_UNIX + pthread_mutex_unlock(&m_underlyingMutex); +# elif ELPP_OS_WINDOWS + LeaveCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + private: +# if ELPP_OS_UNIX + pthread_mutex_t m_underlyingMutex; +# elif ELPP_OS_WINDOWS + CRITICAL_SECTION m_underlyingMutex; +# endif // ELPP_OS_UNIX + }; + /// @brief Scoped lock for compiler that dont yet support std::lock_guard + template + class ScopedLock : base::NoCopy { + public: + explicit ScopedLock(M& mutex) { + m_mutex = &mutex; + m_mutex->lock(); + } + + virtual ~ScopedLock(void) { + m_mutex->unlock(); + } + private: + M* m_mutex; + ScopedLock(void); + }; + } // namespace internal + /// @brief Gets ID of currently running threading in windows systems. On unix, nothing is returned. + static inline std::string getCurrentThreadId(void) { + std::stringstream ss; +# if (ELPP_OS_WINDOWS) + ss << GetCurrentThreadId(); +# endif // (ELPP_OS_WINDOWS) + return ss.str(); + } + static inline void msleep(int) { + // No implementation for non std::thread version + } + typedef base::threading::internal::Mutex Mutex; + typedef base::threading::internal::ScopedLock ScopedLock; +# else + /// @brief Gets ID of currently running threading using std::this_thread::get_id() + static inline std::string getCurrentThreadId(void) { + std::stringstream ss; + ss << std::this_thread::get_id(); + return ss.str(); + } + static inline void msleep(int ms) { + // Only when async logging enabled - this is because async is strict on compiler +#if ELPP_ASYNC_LOGGING + std::this_thread::sleep_for(std::chrono::milliseconds(ms)); +#endif // ELPP_ASYNC_LOGGING + } + typedef std::mutex Mutex; + typedef std::lock_guard ScopedLock; +# endif // !ELPP_USE_STD_THREADING +#else + namespace internal { + /// @brief Mutex wrapper used when multi-threading is disabled. + class NoMutex : base::NoCopy { + public: + NoMutex(void) {} + inline void lock(void) {} + inline bool try_lock(void) { return true; } + inline void unlock(void) {} + }; + /// @brief Lock guard wrapper used when multi-threading is disabled. + template + class NoScopedLock : base::NoCopy { + public: + explicit NoScopedLock(Mutex&) { + } + virtual ~NoScopedLock(void) { + } + private: + NoScopedLock(void); + }; + } // namespace internal + static inline std::string getCurrentThreadId(void) { + return std::string(); + } + static inline void msleep(int) { + // No custom implementation + } + typedef base::threading::internal::NoMutex Mutex; + typedef base::threading::internal::NoScopedLock ScopedLock; +#endif // ELPP_THREADING_ENABLED + /// @brief Base of thread safe class, this class is inheritable-only + class ThreadSafe { + public: + virtual inline void acquireLock(void) ELPP_FINAL { m_mutex.lock(); } + virtual inline void releaseLock(void) ELPP_FINAL { m_mutex.unlock(); } + virtual inline base::threading::Mutex& lock(void) ELPP_FINAL { return m_mutex; } + protected: + ThreadSafe(void) {} + virtual ~ThreadSafe(void) {} + private: + base::threading::Mutex m_mutex; + }; + } // namespace threading + namespace utils { + class File : base::StaticClass { + public: + /// @brief Creates new out file stream for specified filename. + /// @return Pointer to newly created fstream or nullptr + static base::type::fstream_t* newFileStream(const std::string& filename) { + base::type::fstream_t *fs = new base::type::fstream_t(filename.c_str(), + base::type::fstream_t::out | base::type::fstream_t::app); +#if defined(ELPP_UNICODE) + std::locale elppUnicodeLocale(""); +#if ELPP_OS_WINDOWS + std::locale elppUnicodeLocaleWindows(elppUnicodeLocale, new std::codecvt_utf8_utf16); + elppUnicodeLocale = elppUnicodeLocaleWindows; +#endif + fs->imbue(elppUnicodeLocale); +#endif // defined(ELPP_UNICODE) + if (fs->is_open()) { + fs->flush(); + } + else { + base::utils::safeDelete(fs); + ELPP_INTERNAL_ERROR("Bad file [" << filename << "]", true); + } + return fs; + } + + /// @brief Gets size of file provided in stream + static std::size_t getSizeOfFile(base::type::fstream_t* fs) { + if (fs == nullptr) { + return 0; + } + std::streampos currPos = fs->tellg(); + fs->seekg(0, fs->end); + std::size_t size = static_cast(fs->tellg()); + fs->seekg(currPos); + return size; + } + + /// @brief Determines whether or not provided path exist in current file system + static inline bool pathExists(const char* path, bool considerFile = false) { + if (path == nullptr) { + return false; + } +#if ELPP_OS_UNIX + ELPP_UNUSED(considerFile); + struct stat st; + return (stat(path, &st) == 0); +#elif ELPP_OS_WINDOWS + DWORD fileType = GetFileAttributesA(path); + if (fileType == INVALID_FILE_ATTRIBUTES) { + return false; + } + return considerFile ? true : ((fileType & FILE_ATTRIBUTE_DIRECTORY) == 0 ? false : true); +#endif // ELPP_OS_UNIX + } + + /// @brief Creates specified path on file system + /// @param path Path to create. + static bool createPath(const std::string& path) { + if (path.empty()) { + return false; + } + if (base::utils::File::pathExists(path.c_str())) { + return true; + } + int status = -1; + + char* currPath = const_cast(path.c_str()); + std::string builtPath = std::string(); +#if ELPP_OS_UNIX + if (path[0] == '/') { + builtPath = "/"; + } + currPath = STRTOK(currPath, base::consts::kFilePathSeperator, 0); +#elif ELPP_OS_WINDOWS + // Use secure functions API + char* nextTok_ = nullptr; + currPath = STRTOK(currPath, base::consts::kFilePathSeperator, &nextTok_); + ELPP_UNUSED(nextTok_); +#endif // ELPP_OS_UNIX + while (currPath != nullptr) { + builtPath.append(currPath); + builtPath.append(base::consts::kFilePathSeperator); +#if ELPP_OS_UNIX + status = mkdir(builtPath.c_str(), ELPP_LOG_PERMS); + currPath = STRTOK(nullptr, base::consts::kFilePathSeperator, 0); +#elif ELPP_OS_WINDOWS + status = _mkdir(builtPath.c_str()); + currPath = STRTOK(nullptr, base::consts::kFilePathSeperator, &nextTok_); +#endif // ELPP_OS_UNIX + } + if (status == -1) { + ELPP_INTERNAL_ERROR("Error while creating path [" << path << "]", true); + return false; + } + return true; + } + /// @brief Extracts path of filename with leading slash + static std::string extractPathFromFilename(const std::string& fullPath, + const char* seperator = base::consts::kFilePathSeperator) { + if ((fullPath == "") || (fullPath.find(seperator) == std::string::npos)) { + return fullPath; + } + std::size_t lastSlashAt = fullPath.find_last_of(seperator); + if (lastSlashAt == 0) { + return std::string(seperator); + } + return fullPath.substr(0, lastSlashAt + 1); + } + /// @brief builds stripped filename and puts it in buff + static void buildStrippedFilename(const char* filename, char buff[], + std::size_t limit = base::consts::kSourceFilenameMaxLength) { + std::size_t sizeOfFilename = strlen(filename); + if (sizeOfFilename >= limit) { + filename += (sizeOfFilename - limit); + if (filename[0] != '.' && filename[1] != '.') { // prepend if not already + filename += 3; // 3 = '..' + STRCAT(buff, "..", limit); + } + } + STRCAT(buff, filename, limit); + } + /// @brief builds base filename and puts it in buff + static void buildBaseFilename(const std::string& fullPath, char buff[], + std::size_t limit = base::consts::kSourceFilenameMaxLength, + const char* seperator = base::consts::kFilePathSeperator) { + const char *filename = fullPath.c_str(); + std::size_t lastSlashAt = fullPath.find_last_of(seperator); + filename += lastSlashAt ? lastSlashAt + 1 : 0; + std::size_t sizeOfFilename = strlen(filename); + if (sizeOfFilename >= limit) { + filename += (sizeOfFilename - limit); + if (filename[0] != '.' && filename[1] != '.') { // prepend if not already + filename += 3; // 3 = '..' + STRCAT(buff, "..", limit); + } + } + STRCAT(buff, filename, limit); + } + }; + /// @brief String utilities helper class used internally. You should not use it. + class Str : base::StaticClass { + public: + /// @brief Checks if character is digit. Dont use libc implementation of it to prevent locale issues. + static inline bool isDigit(char c) { + return c >= '0' && c <= '9'; + } + + /// @brief Matches wildcards, '*' and '?' only supported. + static bool wildCardMatch(const char* str, const char* pattern) { + while (*pattern) { + switch (*pattern) { + case '?': + if (!*str) + return false; + ++str; + ++pattern; + break; + case '*': + if (wildCardMatch(str, pattern + 1)) + return true; + if (*str && wildCardMatch(str + 1, pattern)) + return true; + return false; + break; + default: + if (*str++ != *pattern++) + return false; + break; + } + } + return !*str && !*pattern; + } + + /// @brief Trims string from start + /// @param [in,out] str String to trim + static inline std::string& ltrim(std::string& str) { + str.erase(str.begin(), std::find_if(str.begin(), str.end(), std::not1(std::ptr_fun(&std::isspace)))); + return str; + } + + /// @brief Trim string from end + /// @param [in,out] str String to trim + static inline std::string& rtrim(std::string& str) { + str.erase(std::find_if(str.rbegin(), str.rend(), std::not1(std::ptr_fun(&std::isspace))).base(), str.end()); + return str; + } + + /// @brief Trims string from left and right + /// @param [in,out] str String to trim + static inline std::string& trim(std::string& str) { + return ltrim(rtrim(str)); + } + + /// @brief Determines whether or not str starts with specified string + /// @param str String to check + /// @param start String to check against + /// @return Returns true if starts with specified string, false otherwise + static inline bool startsWith(const std::string& str, const std::string& start) { + return (str.length() >= start.length()) && (str.compare(0, start.length(), start) == 0); + } + + /// @brief Determines whether or not str ends with specified string + /// @param str String to check + /// @param end String to check against + /// @return Returns true if ends with specified string, false otherwise + static inline bool endsWith(const std::string& str, const std::string& end) { + return (str.length() >= end.length()) && (str.compare(str.length() - end.length(), end.length(), end) == 0); + } + + /// @brief Replaces all instances of replaceWhat with 'replaceWith'. Original variable is changed for performance. + /// @param [in,out] str String to replace from + /// @param replaceWhat Character to replace + /// @param replaceWith Character to replace with + /// @return Modified version of str + static inline std::string& replaceAll(std::string& str, char replaceWhat, char replaceWith) { + std::replace(str.begin(), str.end(), replaceWhat, replaceWith); + return str; + } + + /// @brief Replaces all instances of 'replaceWhat' with 'replaceWith'. (String version) Replaces in place + /// @param str String to replace from + /// @param replaceWhat Character to replace + /// @param replaceWith Character to replace with + /// @return Modified (original) str + static inline std::string& replaceAll(std::string& str, const std::string& replaceWhat, // NOLINT + const std::string& replaceWith) { + if (replaceWhat == replaceWith) + return str; + std::size_t foundAt = std::string::npos; + while ((foundAt = str.find(replaceWhat, foundAt + 1)) != std::string::npos) { + str.replace(foundAt, replaceWhat.length(), replaceWith); + } + return str; + } + + static void replaceFirstWithEscape(base::type::string_t& str, const base::type::string_t& replaceWhat, // NOLINT + const base::type::string_t& replaceWith) { + std::size_t foundAt = base::type::string_t::npos; + while ((foundAt = str.find(replaceWhat, foundAt + 1)) != base::type::string_t::npos) { + if (foundAt > 0 && str[foundAt - 1] == base::consts::kFormatSpecifierChar) { + str.erase(foundAt > 0 ? foundAt - 1 : 0, 1); + ++foundAt; + } + else { + str.replace(foundAt, replaceWhat.length(), replaceWith); + return; + } + } + } +#if defined(ELPP_UNICODE) + static void replaceFirstWithEscape(base::type::string_t& str, const base::type::string_t& replaceWhat, // NOLINT + const std::string& replaceWith) { + replaceFirstWithEscape(str, replaceWhat, base::type::string_t(replaceWith.begin(), replaceWith.end())); + } +#endif // defined(ELPP_UNICODE) + /// @brief Converts string to uppercase + /// @param str String to convert + /// @return Uppercase string + static inline std::string& toUpper(std::string& str) { + std::transform(str.begin(), str.end(), str.begin(), ::toupper); + return str; + } + + /// @brief Compares cstring equality - uses strcmp + static inline bool cStringEq(const char* s1, const char* s2) { + if (s1 == nullptr && s2 == nullptr) return true; + if (s1 == nullptr || s2 == nullptr) return false; + return strcmp(s1, s2) == 0; + } + + /// @brief Compares cstring equality (case-insensitive) - uses toupper(char) + /// Dont use strcasecmp because of CRT (VC++) + static bool cStringCaseEq(const char* s1, const char* s2) { + if (s1 == nullptr && s2 == nullptr) return true; + if (s1 == nullptr || s2 == nullptr) return false; + if (strlen(s1) != strlen(s2)) return false; + while (*s1 != '\0' && *s2 != '\0') { + if (::toupper(*s1) != ::toupper(*s2)) return false; + ++s1; + ++s2; + } + return true; + } + + /// @brief Returns true if c exist in str + static inline bool contains(const char* str, char c) { + for (; *str; ++str) { + if (*str == c) + return true; + } + return false; + } + + static inline char* convertAndAddToBuff(std::size_t n, int len, char* buf, const char* bufLim, bool zeroPadded = true) { + char localBuff[10] = ""; + char* p = localBuff + sizeof(localBuff) - 2; + if (n > 0) { + for (; n > 0 && p > localBuff && len > 0; n /= 10, --len) + *--p = static_cast(n % 10 + '0'); + } + else { + *--p = '0'; + --len; + } + if (zeroPadded) + while (p > localBuff && len-- > 0) *--p = static_cast('0'); + return addToBuff(p, buf, bufLim); + } + + static inline char* addToBuff(const char* str, char* buf, const char* bufLim) { + while ((buf < bufLim) && ((*buf = *str++) != '\0')) + ++buf; + return buf; + } + + static inline char* clearBuff(char buff[], std::size_t lim) { + STRCPY(buff, "", lim); + ELPP_UNUSED(lim); // For *nix we dont have anything using lim in above STRCPY macro + return buff; + } + + /// @brief Converst wchar* to char* + /// NOTE: Need to free return value after use! + static char* wcharPtrToCharPtr(const wchar_t* line) { + std::size_t len_ = wcslen(line) + 1; + char* buff_ = static_cast(malloc(len_ + 1)); +# if ELPP_OS_UNIX || (ELPP_OS_WINDOWS && !ELPP_CRT_DBG_WARNINGS) + std::wcstombs(buff_, line, len_); +# elif ELPP_OS_WINDOWS + std::size_t convCount_ = 0; + mbstate_t mbState_; + ::memset(static_cast(&mbState_), 0, sizeof(mbState_)); + wcsrtombs_s(&convCount_, buff_, len_, &line, len_, &mbState_); +# endif // ELPP_OS_UNIX || (ELPP_OS_WINDOWS && !ELPP_CRT_DBG_WARNINGS) + return buff_; + } + }; + /// @brief Operating System helper static class used internally. You should not use it. + class OS : base::StaticClass { + public: +#if ELPP_OS_WINDOWS + /// @brief Gets environment variables for Windows based OS. + /// We are not using getenv(const char*) because of CRT deprecation + /// @param varname Variable name to get environment variable value for + /// @return If variable exist the value of it otherwise nullptr + static const char* getWindowsEnvironmentVariable(const char* varname) { + const DWORD bufferLen = 50; + static char buffer[bufferLen]; + if (GetEnvironmentVariableA(varname, buffer, bufferLen)) { + return buffer; + } + return nullptr; + } +#endif // ELPP_OS_WINDOWS +#if ELPP_OS_ANDROID + /// @brief Reads android property value + static inline std::string getProperty(const char* prop) { + char propVal[PROP_VALUE_MAX + 1]; + int ret = __system_property_get(prop, propVal); + return ret == 0 ? std::string() : std::string(propVal); + } + + /// @brief Reads android device name + static std::string getDeviceName(void) { + std::stringstream ss; + std::string manufacturer = getProperty("ro.product.manufacturer"); + std::string model = getProperty("ro.product.model"); + if (manufacturer.empty() || model.empty()) { + return std::string(); + } + ss << manufacturer << "-" << model; + return ss.str(); + } +#endif // ELPP_OS_ANDROID + + /// @brief Runs command on terminal and returns the output. + /// + /// @detail This is applicable only on unix based systems, for all other OS, an empty string is returned. + /// @param command Bash command + /// @return Result of bash output or empty string if no result found. + static const std::string getBashOutput(const char* command) { +#if (ELPP_OS_UNIX && !ELPP_OS_ANDROID && !ELPP_CYGWIN) + if (command == nullptr) { + return std::string(); + } + FILE* proc = nullptr; + if ((proc = popen(command, "r")) == nullptr) { + ELPP_INTERNAL_ERROR("\nUnable to run command [" << command << "]", true); + return std::string(); + } + char hBuff[4096]; + if (fgets(hBuff, sizeof(hBuff), proc) != nullptr) { + pclose(proc); + if (hBuff[strlen(hBuff) - 1] == '\n') { + hBuff[strlen(hBuff) - 1] = '\0'; + } + return std::string(hBuff); + } + return std::string(); +#else + ELPP_UNUSED(command); + return std::string(); +#endif // (ELPP_OS_UNIX && !ELPP_OS_ANDROID && !ELPP_CYGWIN) + } + + /// @brief Gets environment variable. This is cross-platform and CRT safe (for VC++) + /// @param variableName Environment variable name + /// @param defaultVal If no environment variable or value found the value to return by default + /// @param alternativeBashCommand If environment variable not found what would be alternative bash command + /// in order to look for value user is looking for. E.g, for 'user' alternative command will 'whoami' + static std::string getEnvironmentVariable(const char* variableName, const char* defaultVal, const char* alternativeBashCommand = nullptr) { +#if ELPP_OS_UNIX + const char* val = getenv(variableName); +#elif ELPP_OS_WINDOWS + const char* val = getWindowsEnvironmentVariable(variableName); +#endif // ELPP_OS_UNIX + if ((val == nullptr) || ((strcmp(val, "") == 0))) { +#if ELPP_OS_UNIX && defined(ELPP_FORCE_ENV_VAR_FROM_BASH) + // Try harder on unix-based systems + std::string valBash = base::utils::OS::getBashOutput(alternativeBashCommand); + if (valBash.empty()) { + return std::string(defaultVal); + } + else { + return valBash; + } +#elif ELPP_OS_WINDOWS || ELPP_OS_UNIX + ELPP_UNUSED(alternativeBashCommand); + return std::string(defaultVal); +#endif // ELPP_OS_UNIX && defined(ELPP_FORCE_ENV_VAR_FROM_BASH) + } + return std::string(val); + } + /// @brief Gets current username. + static inline std::string currentUser(void) { +#if ELPP_OS_UNIX && !ELPP_OS_ANDROID + return getEnvironmentVariable("USER", base::consts::kUnknownUser, "whoami"); +#elif ELPP_OS_WINDOWS + return getEnvironmentVariable("USERNAME", base::consts::kUnknownUser); +#elif ELPP_OS_ANDROID + ELPP_UNUSED(base::consts::kUnknownUser); + return std::string("android"); +#else + return std::string(); +#endif // ELPP_OS_UNIX && !ELPP_OS_ANDROID + } + + /// @brief Gets current host name or computer name. + /// + /// @detail For android systems this is device name with its manufacturer and model seperated by hyphen + static inline std::string currentHost(void) { +#if ELPP_OS_UNIX && !ELPP_OS_ANDROID + return getEnvironmentVariable("HOSTNAME", base::consts::kUnknownHost, "hostname"); +#elif ELPP_OS_WINDOWS + return getEnvironmentVariable("COMPUTERNAME", base::consts::kUnknownHost); +#elif ELPP_OS_ANDROID + ELPP_UNUSED(base::consts::kUnknownHost); + return getDeviceName(); +#else + return std::string(); +#endif // ELPP_OS_UNIX && !ELPP_OS_ANDROID + } + /// @brief Whether or not terminal supports colors + static inline bool termSupportsColor(void) { + std::string term = getEnvironmentVariable("TERM", ""); + return term == "xterm" || term == "xterm-color" || term == "xterm-256color" || + term == "screen" || term == "linux" || term == "cygwin"; + } + }; + extern std::string s_currentUser; + extern std::string s_currentHost; + extern bool s_termSupportsColor; +#define ELPP_INITI_BASIC_DECLR \ + namespace el {\ + namespace base {\ + namespace utils {\ + std::string s_currentUser = el::base::utils::OS::currentUser(); \ + std::string s_currentHost = el::base::utils::OS::currentHost(); \ + bool s_termSupportsColor = el::base::utils::OS::termSupportsColor(); \ + }\ + }\ + } + /// @brief Contains utilities for cross-platform date/time. This class make use of el::base::utils::Str + class DateTime : base::StaticClass { + public: + /// @brief Cross platform gettimeofday for Windows and unix platform. This can be used to determine current millisecond. + /// + /// @detail For unix system it uses gettimeofday(timeval*, timezone*) and for Windows, a seperate implementation is provided + /// @param [in,out] tv Pointer that gets updated + static void gettimeofday(struct timeval* tv) { +#if ELPP_OS_WINDOWS + if (tv != nullptr) { +# if ELPP_COMPILER_MSVC || defined(_MSC_EXTENSIONS) + const unsigned __int64 delta_ = 11644473600000000Ui64; +# else + const unsigned __int64 delta_ = 11644473600000000ULL; +# endif // ELPP_COMPILER_MSVC || defined(_MSC_EXTENSIONS) + const double secOffSet = 0.000001; + const unsigned long usecOffSet = 1000000; + FILETIME fileTime; + GetSystemTimeAsFileTime(&fileTime); + unsigned __int64 present = 0; + present |= fileTime.dwHighDateTime; + present = present << 32; + present |= fileTime.dwLowDateTime; + present /= 10; // mic-sec + // Subtract the difference + present -= delta_; + tv->tv_sec = static_cast(present * secOffSet); + tv->tv_usec = static_cast(present % usecOffSet); + } +#else + ::gettimeofday(tv, nullptr); +#endif // ELPP_OS_WINDOWS + } + + /// @brief Gets current date and time with milliseconds. + /// @param format User provided date/time format + /// @param msWidth A pointer to base::MillisecondsWidth from configuration (non-null) + /// @returns string based date time in specified format. + static inline std::string getDateTime(const char* format, const base::MillisecondsWidth* msWidth) { + struct timeval currTime; + gettimeofday(&currTime); + struct ::tm timeInfo; + buildTimeInfo(&currTime, &timeInfo); + const int kBuffSize = 30; + char buff_[kBuffSize] = ""; + parseFormat(buff_, kBuffSize, format, &timeInfo, static_cast(currTime.tv_usec / msWidth->m_offset), msWidth); + return std::string(buff_); + } + + /// @brief Formats time to get unit accordingly, units like second if > 1000 or minutes if > 60000 etc + static base::type::string_t formatTime(unsigned long long time, base::TimestampUnit timestampUnit) { + double result = static_cast(time); + base::type::EnumType start = static_cast(timestampUnit); + const base::type::char_t* unit = base::consts::kTimeFormats[start].unit; + for (base::type::EnumType i = start; i < base::consts::kTimeFormatsCount - 1; ++i) { + if (result <= base::consts::kTimeFormats[i].value) { + break; + } + result /= base::consts::kTimeFormats[i].value; + unit = base::consts::kTimeFormats[i + 1].unit; + } + base::type::stringstream_t ss; + ss << result << " " << unit; + return ss.str(); + } + + /// @brief Gets time difference in milli/micro second depending on timestampUnit + static inline unsigned long long getTimeDifference(const struct timeval& endTime, const struct timeval& startTime, base::TimestampUnit timestampUnit) { + if (timestampUnit == base::TimestampUnit::Microsecond) { + return static_cast(static_cast(1000000 * endTime.tv_sec + endTime.tv_usec) - + static_cast(1000000 * startTime.tv_sec + startTime.tv_usec)); + } + else { + return static_cast((((endTime.tv_sec - startTime.tv_sec) * 1000000) + (endTime.tv_usec - startTime.tv_usec)) / 1000); + } + } + + private: + static inline struct ::tm* buildTimeInfo(struct timeval* currTime, struct ::tm* timeInfo) { +#if ELPP_OS_UNIX + time_t rawTime = currTime->tv_sec; + ::localtime_r(&rawTime, timeInfo); + return timeInfo; +#else +# if ELPP_COMPILER_MSVC + ELPP_UNUSED(currTime); + time_t t; + _time64(&t); + localtime_s(timeInfo, &t); + return timeInfo; +# else + // For any other compilers that don't have CRT warnings issue e.g, MinGW or TDM GCC- we use different method + time_t rawTime = currTime->tv_sec; + struct tm* tmInf = localtime(&rawTime); + *timeInfo = *tmInf; + return timeInfo; +# endif // ELPP_COMPILER_MSVC +#endif // ELPP_OS_UNIX + } + static char* parseFormat(char* buf, std::size_t bufSz, const char* format, const struct tm* tInfo, + std::size_t msec, const base::MillisecondsWidth* msWidth) { + const char* bufLim = buf + bufSz; + for (; *format; ++format) { + if (*format == base::consts::kFormatSpecifierChar) { + switch (*++format) { + case base::consts::kFormatSpecifierChar: // Escape + break; + case '\0': // End + --format; + break; + case 'd': // Day + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_mday, 2, buf, bufLim); + continue; + case 'a': // Day of week (short) + buf = base::utils::Str::addToBuff(base::consts::kDaysAbbrev[tInfo->tm_wday], buf, bufLim); + continue; + case 'A': // Day of week (long) + buf = base::utils::Str::addToBuff(base::consts::kDays[tInfo->tm_wday], buf, bufLim); + continue; + case 'M': // month + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_mon + 1, 2, buf, bufLim); + continue; + case 'b': // month (short) + buf = base::utils::Str::addToBuff(base::consts::kMonthsAbbrev[tInfo->tm_mon], buf, bufLim); + continue; + case 'B': // month (long) + buf = base::utils::Str::addToBuff(base::consts::kMonths[tInfo->tm_mon], buf, bufLim); + continue; + case 'y': // year (two digits) + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_year + base::consts::kYearBase, 2, buf, bufLim); + continue; + case 'Y': // year (four digits) + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_year + base::consts::kYearBase, 4, buf, bufLim); + continue; + case 'h': // hour (12-hour) + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_hour % 12, 2, buf, bufLim); + continue; + case 'H': // hour (24-hour) + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_hour, 2, buf, bufLim); + continue; + case 'm': // minute + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_min, 2, buf, bufLim); + continue; + case 's': // second + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_sec, 2, buf, bufLim); + continue; + case 'z': // milliseconds + case 'g': + buf = base::utils::Str::convertAndAddToBuff(msec, msWidth->m_width, buf, bufLim); + continue; + case 'F': // AM/PM + buf = base::utils::Str::addToBuff((tInfo->tm_hour >= 12) ? base::consts::kPm : base::consts::kAm, buf, bufLim); + continue; + default: + continue; + } + } + if (buf == bufLim) break; + *buf++ = *format; + } + return buf; + } + }; + /// @brief Command line arguments for application if specified using el::Helpers::setArgs(..) or START_EASYLOGGINGPP(..) + class CommandLineArgs { + public: + CommandLineArgs(void) { + setArgs(0, static_cast(nullptr)); + } + CommandLineArgs(int argc, const char** argv) { + setArgs(argc, argv); + } + CommandLineArgs(int argc, char** argv) { + setArgs(argc, argv); + } + virtual ~CommandLineArgs(void) {} + /// @brief Sets arguments and parses them + inline void setArgs(int argc, const char** argv) { + setArgs(argc, const_cast(argv)); + } + /// @brief Sets arguments and parses them + inline void setArgs(int argc, char** argv) { + m_params.clear(); + m_paramsWithValue.clear(); + if (argc == 0 || argv == nullptr) { + return; + } + m_argc = argc; + m_argv = argv; + for (int i = 1; i < m_argc; ++i) { + const char* v = (strstr(m_argv[i], "=")); + if (v != nullptr && strlen(v) > 0) { + std::string key = std::string(m_argv[i]); + key = key.substr(0, key.find_first_of('=')); + if (hasParamWithValue(key.c_str())) { + ELPP_INTERNAL_INFO(1, "Skipping [" << key << "] arg since it already has value [" + << getParamValue(key.c_str()) << "]"); + } + else { + m_paramsWithValue.insert(std::make_pair(key, std::string(v + 1))); + } + } + if (v == nullptr) { + if (hasParam(m_argv[i])) { + ELPP_INTERNAL_INFO(1, "Skipping [" << m_argv[i] << "] arg since it already exists"); + } + else { + m_params.push_back(std::string(m_argv[i])); + } + } + } + } + /// @brief Returns true if arguments contain paramKey with a value (seperated by '=') + inline bool hasParamWithValue(const char* paramKey) const { + return m_paramsWithValue.find(std::string(paramKey)) != m_paramsWithValue.end(); + } + /// @brief Returns value of arguments + /// @see hasParamWithValue(const char*) + inline const char* getParamValue(const char* paramKey) const { + return m_paramsWithValue.find(std::string(paramKey))->second.c_str(); + } + /// @brief Return true if arguments has a param (not having a value) i,e without '=' + inline bool hasParam(const char* paramKey) const { + return std::find(m_params.begin(), m_params.end(), std::string(paramKey)) != m_params.end(); + } + /// @brief Returns true if no params available. This exclude argv[0] + inline bool empty(void) const { + return m_params.empty() && m_paramsWithValue.empty(); + } + /// @brief Returns total number of arguments. This exclude argv[0] + inline std::size_t size(void) const { + return m_params.size() + m_paramsWithValue.size(); + } + inline friend base::type::ostream_t& operator<<(base::type::ostream_t& os, const CommandLineArgs& c) { + for (int i = 1; i < c.m_argc; ++i) { + os << ELPP_LITERAL("[") << c.m_argv[i] << ELPP_LITERAL("]"); + if (i < c.m_argc - 1) { + os << ELPP_LITERAL(" "); + } + } + return os; + } + + private: + int m_argc; + char** m_argv; + std::map m_paramsWithValue; + std::vector m_params; + }; + /// @brief Abstract registry (aka repository) that provides basic interface for pointer repository specified by T_Ptr type. + /// + /// @detail Most of the functions are virtual final methods but anything implementing this abstract class should implement + /// unregisterAll() and deepCopy(const AbstractRegistry&) and write registerNew() method according to container + /// and few more methods; get() to find element, unregister() to unregister single entry. + /// Please note that this is thread-unsafe and should also implement thread-safety mechanisms in implementation. + template + class AbstractRegistry : public base::threading::ThreadSafe { + public: + typedef typename Container::iterator iterator; + typedef typename Container::const_iterator const_iterator; + + /// @brief Default constructor + AbstractRegistry(void) {} + + /// @brief Move constructor that is useful for base classes + AbstractRegistry(AbstractRegistry&& sr) { + if (this == &sr) { + return; + } + unregisterAll(); + m_list = std::move(sr.m_list); + } + + bool operator==(const AbstractRegistry& other) { + if (size() != other.size()) { + return false; + } + for (std::size_t i = 0; i < m_list.size(); ++i) { + if (m_list.at(i) != other.m_list.at(i)) { + return false; + } + } + return true; + } + + bool operator!=(const AbstractRegistry& other) { + if (size() != other.size()) { + return true; + } + for (std::size_t i = 0; i < m_list.size(); ++i) { + if (m_list.at(i) != other.m_list.at(i)) { + return true; + } + } + return false; + } + + /// @brief Assignment move operator + AbstractRegistry& operator=(AbstractRegistry&& sr) { + if (this == &sr) { + return *this; + } + unregisterAll(); + m_list = std::move(sr.m_list); + return *this; + } + + virtual ~AbstractRegistry(void) { + } + + /// @return Iterator pointer from start of repository + virtual inline iterator begin(void) ELPP_FINAL { + return m_list.begin(); + } + + /// @return Iterator pointer from end of repository + virtual inline iterator end(void) ELPP_FINAL { + return m_list.end(); + } + + + /// @return Constant iterator pointer from start of repository + virtual inline const_iterator cbegin(void) const ELPP_FINAL { + return m_list.cbegin(); + } + + /// @return End of repository + virtual inline const_iterator cend(void) const ELPP_FINAL { + return m_list.cend(); + } + + /// @return Whether or not repository is empty + virtual inline bool empty(void) const ELPP_FINAL { + return m_list.empty(); + } + + /// @return Size of repository + virtual inline std::size_t size(void) const ELPP_FINAL { + return m_list.size(); + } + + /// @brief Returns underlying container by reference + virtual inline Container& list(void) ELPP_FINAL { + return m_list; + } + + /// @brief Returns underlying container by constant reference. + virtual inline const Container& list(void) const ELPP_FINAL { + return m_list; + } + + /// @brief Unregisters all the pointers from current repository. + virtual void unregisterAll(void) = 0; + + protected: + virtual void deepCopy(const AbstractRegistry&) = 0; + void reinitDeepCopy(const AbstractRegistry& sr) { + unregisterAll(); + deepCopy(sr); + } + + private: + Container m_list; + }; + + /// @brief A pointer registry mechanism to manage memory and provide search functionalities. (non-predicate version) + /// + /// @detail NOTE: This is thread-unsafe implementation (although it contains lock function, it does not use these functions) + /// of AbstractRegistry. Any implementation of this class should be + /// explicitly (by using lock functions) + template + class Registry : public AbstractRegistry> { + public: + typedef typename Registry::iterator iterator; + typedef typename Registry::const_iterator const_iterator; + + Registry(void) {} + + /// @brief Copy constructor that is useful for base classes. Try to avoid this constructor, use move constructor. + Registry(const Registry& sr) : AbstractRegistry>() { + if (this == &sr) { + return; + } + this->reinitDeepCopy(sr); + } + + /// @brief Assignment operator that unregisters all the existing registeries and deeply copies each of repo element + /// @see unregisterAll() + /// @see deepCopy(const AbstractRegistry&) + Registry& operator=(const Registry& sr) { + if (this == &sr) { + return *this; + } + this->reinitDeepCopy(sr); + return *this; + } + + virtual ~Registry(void) { + unregisterAll(); + } + + protected: + virtual inline void unregisterAll(void) ELPP_FINAL { + if (!this->empty()) { + for (auto&& curr : this->list()) { + base::utils::safeDelete(curr.second); + } + this->list().clear(); + } + } + + /// @brief Registers new registry to repository. + virtual inline void registerNew(const T_Key& uniqKey, T_Ptr* ptr) ELPP_FINAL { + unregister(uniqKey); + this->list().insert(std::make_pair(uniqKey, ptr)); + } + + /// @brief Unregisters single entry mapped to specified unique key + inline void unregister(const T_Key& uniqKey) { + T_Ptr* existing = get(uniqKey); + if (existing != nullptr) { + base::utils::safeDelete(existing); + this->list().erase(uniqKey); + } + } + + /// @brief Gets pointer from repository. If none found, nullptr is returned. + inline T_Ptr* get(const T_Key& uniqKey) { + iterator it = this->list().find(uniqKey); + return it == this->list().end() + ? nullptr + : it->second; + } + + private: + virtual inline void deepCopy(const AbstractRegistry>& sr) ELPP_FINAL { + for (const_iterator it = sr.cbegin(); it != sr.cend(); ++it) { + registerNew(it->first, new T_Ptr(*it->second)); + } + } + }; + + /// @brief A pointer registry mechanism to manage memory and provide search functionalities. (predicate version) + /// + /// @detail NOTE: This is thread-unsafe implementation of AbstractRegistry. Any implementation of this class + /// should be made thread-safe explicitly + template + class RegistryWithPred : public AbstractRegistry> { + public: + typedef typename RegistryWithPred::iterator iterator; + typedef typename RegistryWithPred::const_iterator const_iterator; + + RegistryWithPred(void) { + } + + virtual ~RegistryWithPred(void) { + unregisterAll(); + } + + /// @brief Copy constructor that is useful for base classes. Try to avoid this constructor, use move constructor. + RegistryWithPred(const RegistryWithPred& sr) : AbstractRegistry>() { + if (this == &sr) { + return; + } + this->reinitDeepCopy(sr); + } + + /// @brief Assignment operator that unregisters all the existing registeries and deeply copies each of repo element + /// @see unregisterAll() + /// @see deepCopy(const AbstractRegistry&) + RegistryWithPred& operator=(const RegistryWithPred& sr) { + if (this == &sr) { + return *this; + } + this->reinitDeepCopy(sr); + return *this; + } + + friend inline base::type::ostream_t& operator<<(base::type::ostream_t& os, const RegistryWithPred& sr) { + for (const_iterator it = sr.list().begin(); it != sr.list().end(); ++it) { + os << ELPP_LITERAL(" ") << **it << ELPP_LITERAL("\n"); + } + return os; + } + + protected: + virtual inline void unregisterAll(void) ELPP_FINAL { + if (!this->empty()) { + for (auto&& curr : this->list()) { + base::utils::safeDelete(curr); + } + this->list().clear(); + } + } + + virtual void unregister(T_Ptr*& ptr) ELPP_FINAL { + if (ptr) { + iterator iter = this->begin(); + for (; iter != this->end(); ++iter) { + if (ptr == *iter) { + break; + } + } + if (iter != this->end() && *iter != nullptr) { + this->list().erase(iter); + base::utils::safeDelete(*iter); + } + } + } + + virtual inline void registerNew(T_Ptr* ptr) ELPP_FINAL { + this->list().push_back(ptr); + } + + /// @brief Gets pointer from repository with speicifed arguments. Arguments are passed to predicate + /// in order to validate pointer. + template + inline T_Ptr* get(const T& arg1, const T2 arg2) { + iterator iter = std::find_if(this->list().begin(), this->list().end(), Pred(arg1, arg2)); + if (iter != this->list().end() && *iter != nullptr) { + return *iter; + } + return nullptr; + } + + private: + virtual inline void deepCopy(const AbstractRegistry>& sr) { + for (const_iterator it = sr.list().begin(); it != sr.list().end(); ++it) { + registerNew(new T_Ptr(**it)); + } + } + }; + + } // namespace utils + } // namespace base + /// @brief Base of Easylogging++ friendly class + /// + /// @detail After inheriting this class publicly, implement pure-virtual function `void log(std::ostream&) const` + class Loggable { + public: + virtual ~Loggable(void) {} + virtual void log(el::base::type::ostream_t&) const = 0; + private: + friend inline el::base::type::ostream_t& operator<<(el::base::type::ostream_t& os, const Loggable& loggable) { + loggable.log(os); + return os; + } + }; + namespace base { + /// @brief Represents log format containing flags and date format. This is used internally to start initial log + class LogFormat : public Loggable { + public: + LogFormat(void) : + m_level(Level::Unknown), + m_userFormat(base::type::string_t()), + m_format(base::type::string_t()), + m_dateTimeFormat(std::string()), + m_flags(0x0) { + } + + LogFormat(Level level, const base::type::string_t& format) + : m_level(level), m_userFormat(format) { + parseFromFormat(m_userFormat); + } + + LogFormat(const LogFormat& logFormat) { + m_level = logFormat.m_level; + m_userFormat = logFormat.m_userFormat; + m_format = logFormat.m_format; + m_dateTimeFormat = logFormat.m_dateTimeFormat; + m_flags = logFormat.m_flags; + } + + LogFormat(LogFormat&& logFormat) { + m_level = std::move(logFormat.m_level); + m_userFormat = std::move(logFormat.m_userFormat); + m_format = std::move(logFormat.m_format); + m_dateTimeFormat = std::move(logFormat.m_dateTimeFormat); + m_flags = std::move(logFormat.m_flags); + } + + LogFormat& operator=(const LogFormat& logFormat) { + m_level = logFormat.m_level; + m_userFormat = logFormat.m_userFormat; + m_dateTimeFormat = logFormat.m_dateTimeFormat; + m_flags = logFormat.m_flags; + return *this; + } + + virtual ~LogFormat(void) { + } + + inline bool operator==(const LogFormat& other) { + return m_level == other.m_level && m_userFormat == other.m_userFormat && m_format == other.m_format && + m_dateTimeFormat == other.m_dateTimeFormat && m_flags == other.m_flags; + } + + /// @brief Updates format to be used while logging. + /// @param userFormat User provided format + void parseFromFormat(const base::type::string_t& userFormat) { + // We make copy because we will be changing the format + // i.e, removing user provided date format from original format + // and then storing it. + base::type::string_t formatCopy = userFormat; + m_flags = 0x0; + auto conditionalAddFlag = [&](const base::type::char_t* specifier, base::FormatFlags flag) { + std::size_t foundAt = base::type::string_t::npos; + while ((foundAt = formatCopy.find(specifier, foundAt + 1)) != base::type::string_t::npos) { + if (foundAt > 0 && formatCopy[foundAt - 1] == base::consts::kFormatSpecifierChar) { + if (hasFlag(flag)) { + // If we already have flag we remove the escape chars so that '%%' is turned to '%' + // even after specifier resolution - this is because we only replaceFirst specifier + formatCopy.erase(foundAt > 0 ? foundAt - 1 : 0, 1); + ++foundAt; + } + } + else { + if (!hasFlag(flag)) addFlag(flag); + } + } + }; + conditionalAddFlag(base::consts::kAppNameFormatSpecifier, base::FormatFlags::AppName); + conditionalAddFlag(base::consts::kSeverityLevelFormatSpecifier, base::FormatFlags::Level); + conditionalAddFlag(base::consts::kSeverityLevelShortFormatSpecifier, base::FormatFlags::LevelShort); + conditionalAddFlag(base::consts::kLoggerIdFormatSpecifier, base::FormatFlags::LoggerId); + conditionalAddFlag(base::consts::kThreadIdFormatSpecifier, base::FormatFlags::ThreadId); + conditionalAddFlag(base::consts::kLogFileFormatSpecifier, base::FormatFlags::File); + conditionalAddFlag(base::consts::kLogFileBaseFormatSpecifier, base::FormatFlags::FileBase); + conditionalAddFlag(base::consts::kLogLineFormatSpecifier, base::FormatFlags::Line); + conditionalAddFlag(base::consts::kLogLocationFormatSpecifier, base::FormatFlags::Location); + conditionalAddFlag(base::consts::kLogFunctionFormatSpecifier, base::FormatFlags::Function); + conditionalAddFlag(base::consts::kCurrentUserFormatSpecifier, base::FormatFlags::User); + conditionalAddFlag(base::consts::kCurrentHostFormatSpecifier, base::FormatFlags::Host); + conditionalAddFlag(base::consts::kMessageFormatSpecifier, base::FormatFlags::LogMessage); + conditionalAddFlag(base::consts::kVerboseLevelFormatSpecifier, base::FormatFlags::VerboseLevel); + // For date/time we need to extract user's date format first + std::size_t dateIndex = std::string::npos; + if ((dateIndex = formatCopy.find(base::consts::kDateTimeFormatSpecifier)) != std::string::npos) { + while (dateIndex > 0 && formatCopy[dateIndex - 1] == base::consts::kFormatSpecifierChar) { + dateIndex = formatCopy.find(base::consts::kDateTimeFormatSpecifier, dateIndex + 1); + } + if (dateIndex != std::string::npos) { + addFlag(base::FormatFlags::DateTime); + updateDateFormat(dateIndex, formatCopy); + } + } + m_format = formatCopy; + updateFormatSpec(); + } + + inline Level level(void) const { + return m_level; + } + + inline const base::type::string_t& userFormat(void) const { + return m_userFormat; + } + + inline const base::type::string_t& format(void) const { + return m_format; + } + + inline const std::string& dateTimeFormat(void) const { + return m_dateTimeFormat; + } + + inline base::type::EnumType flags(void) const { + return m_flags; + } + + inline bool hasFlag(base::FormatFlags flag) const { + return base::utils::hasFlag(flag, m_flags); + } + + virtual void log(el::base::type::ostream_t& os) const { + os << m_format; + } + + protected: + /// @brief Updates date time format if available in currFormat. + /// @param index Index where %datetime, %date or %time was found + /// @param [in,out] currFormat current format that is being used to format + virtual void updateDateFormat(std::size_t index, base::type::string_t& currFormat) ELPP_FINAL { + if (hasFlag(base::FormatFlags::DateTime)) { + index += ELPP_STRLEN(base::consts::kDateTimeFormatSpecifier); + } + const base::type::char_t* ptr = currFormat.c_str() + index; + if ((currFormat.size() > index) && (ptr[0] == '{')) { + // User has provided format for date/time + ++ptr; + int count = 1; // Start by 1 in order to remove starting brace + std::stringstream ss; + for (; *ptr; ++ptr, ++count) { + if (*ptr == '}') { + ++count; // In order to remove ending brace + break; + } + ss << *ptr; + } + currFormat.erase(index, count); + m_dateTimeFormat = ss.str(); + } + else { + // No format provided, use default + if (hasFlag(base::FormatFlags::DateTime)) { + m_dateTimeFormat = std::string(base::consts::kDefaultDateTimeFormat); + } + } + } + + /// @brief Updates %level from format. This is so that we dont have to do it at log-writing-time. It uses m_format and m_level + virtual void updateFormatSpec(void) ELPP_FINAL { + // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet. + if (m_level == Level::Debug) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kDebugLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kDebugLevelShortLogValue); + } + else if (m_level == Level::Info) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kInfoLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kInfoLevelShortLogValue); + } + else if (m_level == Level::Warning) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kWarningLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kWarningLevelShortLogValue); + } + else if (m_level == Level::Error) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kErrorLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kErrorLevelShortLogValue); + } + else if (m_level == Level::Fatal) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kFatalLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kFatalLevelShortLogValue); + } + else if (m_level == Level::Verbose) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kVerboseLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kVerboseLevelShortLogValue); + } + else if (m_level == Level::Trace) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kTraceLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kTraceLevelShortLogValue); + } + if (hasFlag(base::FormatFlags::User)) { + std::string s = base::utils::s_currentUser; + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kCurrentUserFormatSpecifier, + base::utils::s_currentUser); + } + if (hasFlag(base::FormatFlags::Host)) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kCurrentHostFormatSpecifier, + base::utils::s_currentHost); + } + // Ignore Level::Global and Level::Unknown + } + + inline void addFlag(base::FormatFlags flag) { + base::utils::addFlag(flag, &m_flags); + } + + private: + Level m_level; + base::type::string_t m_userFormat; + base::type::string_t m_format; + std::string m_dateTimeFormat; + base::type::EnumType m_flags; + friend class el::Logger; // To resolve loggerId format specifier easily + }; + } // namespace base + /// @brief Resolving function for format specifier + typedef std::function FormatSpecifierValueResolver; + /// @brief User-provided custom format specifier + /// @see el::Helpers::installCustomFormatSpecifier + /// @see FormatSpecifierValueResolver + class CustomFormatSpecifier { + public: + CustomFormatSpecifier(const char* formatSpecifier, const FormatSpecifierValueResolver& resolver) : + m_formatSpecifier(formatSpecifier), m_resolver(resolver) {} + inline const char* formatSpecifier(void) const { return m_formatSpecifier; } + inline const FormatSpecifierValueResolver& resolver(void) const { return m_resolver; } + inline bool operator==(const char* formatSpecifier) { + return strcmp(m_formatSpecifier, formatSpecifier) == 0; + } + + private: + const char* m_formatSpecifier; + FormatSpecifierValueResolver m_resolver; + }; + /// @brief Represents single configuration that has representing level, configuration type and a string based value. + /// + /// @detail String based value means any value either its boolean, integer or string itself, it will be embedded inside quotes + /// and will be parsed later. + /// + /// Consider some examples below: + /// * el::Configuration confEnabledInfo(el::Level::Info, el::ConfigurationType::Enabled, "true"); + /// * el::Configuration confMaxLogFileSizeInfo(el::Level::Info, el::ConfigurationType::MaxLogFileSize, "2048"); + /// * el::Configuration confFilenameInfo(el::Level::Info, el::ConfigurationType::Filename, "/var/log/my.log"); + class Configuration : public Loggable { + public: + Configuration(const Configuration& c) : + m_level(c.m_level), + m_configurationType(c.m_configurationType), + m_value(c.m_value) { + } + + Configuration& operator=(const Configuration& c) { + m_level = c.m_level; + m_configurationType = c.m_configurationType; + m_value = c.m_value; + return *this; + } + + virtual ~Configuration(void) { + } + + /// @brief Full constructor used to sets value of configuration + Configuration(Level level, ConfigurationType configurationType, const std::string& value) : + m_level(level), + m_configurationType(configurationType), + m_value(value) { + } + + /// @brief Gets level of current configuration + inline Level level(void) const { + return m_level; + } + + /// @brief Gets configuration type of current configuration + inline ConfigurationType configurationType(void) const { + return m_configurationType; + } + + /// @brief Gets string based configuration value + inline const std::string& value(void) const { + return m_value; + } + + /// @brief Set string based configuration value + /// @param value Value to set. Values have to be std::string; For boolean values use "true", "false", for any integral values + /// use them in quotes. They will be parsed when configuring + inline void setValue(const std::string& value) { + m_value = value; + } + + virtual inline void log(el::base::type::ostream_t& os) const { + os << LevelHelper::convertToString(m_level) + << ELPP_LITERAL(" ") << ConfigurationTypeHelper::convertToString(m_configurationType) + << ELPP_LITERAL(" = ") << m_value.c_str(); + } + + /// @brief Used to find configuration from configuration (pointers) repository. Avoid using it. + class Predicate { + public: + Predicate(Level level, ConfigurationType configurationType) : + m_level(level), + m_configurationType(configurationType) { + } + + inline bool operator()(const Configuration* conf) const { + return ((conf != nullptr) && (conf->level() == m_level) && (conf->configurationType() == m_configurationType)); + } + + private: + Level m_level; + ConfigurationType m_configurationType; + }; + + private: + Level m_level; + ConfigurationType m_configurationType; + std::string m_value; + }; + + /// @brief Thread-safe Configuration repository + /// + /// @detail This repository represents configurations for all the levels and configuration type mapped to a value. + class Configurations : public base::utils::RegistryWithPred { + public: + /// @brief Default constructor with empty repository + Configurations(void) : + m_configurationFile(std::string()), + m_isFromFile(false) { + } + + /// @brief Constructor used to set configurations using configuration file. + /// @param configurationFile Full path to configuration file + /// @param useDefaultsForRemaining Lets you set the remaining configurations to default. + /// @param base If provided, this configuration will be based off existing repository that this argument is pointing to. + /// @see parseFromFile(const std::string&, Configurations* base) + /// @see setRemainingToDefault() + Configurations(const std::string& configurationFile, bool useDefaultsForRemaining = true, Configurations* base = nullptr) : + m_configurationFile(configurationFile), + m_isFromFile(false) { + parseFromFile(configurationFile, base); + if (useDefaultsForRemaining) { + setRemainingToDefault(); + } + } + + virtual ~Configurations(void) { + } + + /// @brief Parses configuration from file. + /// @param configurationFile Full path to configuration file + /// @param base Configurations to base new configuration repository off. This value is used when you want to use + /// existing Configurations to base all the values and then set rest of configuration via configuration file. + /// @return True if successfully parsed, false otherwise. You may define 'ELPP_DEBUG_ASSERT_FAILURE' to make sure you + /// do not proceed without successful parse. + inline bool parseFromFile(const std::string& configurationFile, Configurations* base = nullptr) { + // We initial assertion with true because if we have assertion diabled, we want to pass this + // check and if assertion is enabled we will have values re-assigned any way. + bool assertionPassed = true; + ELPP_ASSERT((assertionPassed = base::utils::File::pathExists(configurationFile.c_str(), true)), + "Configuration file [" << configurationFile << "] does not exist!"); + if (!assertionPassed) { + return false; + } + bool success = Parser::parseFromFile(configurationFile, this, base); + m_isFromFile = success; + return success; + } + + /// @brief Parse configurations from configuration string. + /// + /// @detail This configuration string has same syntax as configuration file contents. Make sure all the necessary + /// new line characters are provided. + /// @param base Configurations to base new configuration repository off. This value is used when you want to use + /// existing Configurations to base all the values and then set rest of configuration via configuration text. + /// @return True if successfully parsed, false otherwise. You may define 'ELPP_DEBUG_ASSERT_FAILURE' to make sure you + /// do not proceed without successful parse. + inline bool parseFromText(const std::string& configurationsString, Configurations* base = nullptr) { + bool success = Parser::parseFromText(configurationsString, this, base); + if (success) { + m_isFromFile = false; + } + return success; + } + + /// @brief Sets configuration based-off an existing configurations. + /// @param base Pointer to existing configurations. + inline void setFromBase(Configurations* base) { + if (base == nullptr || base == this) { + return; + } + base::threading::ScopedLock scopedLock(base->lock()); + for (Configuration*& conf : base->list()) { + set(conf); + } + } + + /// @brief Determines whether or not specified configuration type exists in the repository. + /// + /// @detail Returns as soon as first level is found. + /// @param configurationType Type of configuration to check existence for. + bool hasConfiguration(ConfigurationType configurationType) { + base::type::EnumType lIndex = LevelHelper::kMinValid; + bool result = false; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + if (hasConfiguration(LevelHelper::castFromInt(lIndex), configurationType)) { + result = true; + } + return result; + }); + return result; + } + + /// @brief Determines whether or not specified configuration type exists for specified level + /// @param level Level to check + /// @param configurationType Type of configuration to check existence for. + inline bool hasConfiguration(Level level, ConfigurationType configurationType) { + base::threading::ScopedLock scopedLock(lock()); +#if ELPP_COMPILER_INTEL + // We cant specify template types here, Intel C++ throws compilation error + // "error: type name is not allowed" + return RegistryWithPred::get(level, configurationType) != nullptr; +#else + return RegistryWithPred::get(level, configurationType) != nullptr; +#endif // ELPP_COMPILER_INTEL + } + + /// @brief Sets value of configuration for specified level. + /// + /// @detail Any existing configuration for specified level will be replaced. Also note that configuration types + /// ConfigurationType::MillisecondsWidth and ConfigurationType::PerformanceTracking will be ignored if not set for + /// Level::Global because these configurations are not dependant on level. + /// @param level Level to set configuration for (el::Level). + /// @param configurationType Type of configuration (el::ConfigurationType) + /// @param value A string based value. Regardless of what the data type of configuration is, it will always be string + /// from users' point of view. This is then parsed later to be used internally. + /// @see Configuration::setValue(const std::string& value) + /// @see el::Level + /// @see el::ConfigurationType + inline void set(Level level, ConfigurationType configurationType, const std::string& value) { + base::threading::ScopedLock scopedLock(lock()); + unsafeSet(level, configurationType, value); // This is not unsafe anymore as we have locked mutex + if (level == Level::Global) { + unsafeSetGlobally(configurationType, value, false); // Again this is not unsafe either + } + } + + /// @brief Sets single configuration based on other single configuration. + /// @see set(Level level, ConfigurationType configurationType, const std::string& value) + inline void set(Configuration* conf) { + if (conf == nullptr) { + return; + } + set(conf->level(), conf->configurationType(), conf->value()); + } + + inline Configuration* get(Level level, ConfigurationType configurationType) { + base::threading::ScopedLock scopedLock(lock()); + return RegistryWithPred::get(level, configurationType); + } + + /// @brief Sets configuration for all levels. + /// @param configurationType Type of configuration + /// @param value String based value + /// @see Configurations::set(Level level, ConfigurationType configurationType, const std::string& value) + inline void setGlobally(ConfigurationType configurationType, const std::string& value) { + setGlobally(configurationType, value, false); + } + + /// @brief Clears repository so that all the configurations are unset + inline void clear(void) { + base::threading::ScopedLock scopedLock(lock()); + unregisterAll(); + } + + /// @brief Gets configuration file used in parsing this configurations. + /// + /// @detail If this repository was set manually or by text this returns empty string. + inline const std::string& configurationFile(void) const { + return m_configurationFile; + } + + /// @brief Sets configurations to "factory based" configurations. + void setToDefault(void) { + setGlobally(ConfigurationType::Enabled, std::string("true"), true); +#if !defined(ELPP_NO_DEFAULT_LOG_FILE) + setGlobally(ConfigurationType::Filename, std::string(base::consts::kDefaultLogFile), true); +#else + ELPP_UNUSED(base::consts::kDefaultLogFile); +#endif // !defined(ELPP_NO_DEFAULT_LOG_FILE) + setGlobally(ConfigurationType::ToFile, std::string("true"), true); + setGlobally(ConfigurationType::ToStandardOutput, std::string("true"), true); + setGlobally(ConfigurationType::MillisecondsWidth, std::string("3"), true); + setGlobally(ConfigurationType::PerformanceTracking, std::string("true"), true); + setGlobally(ConfigurationType::MaxLogFileSize, std::string("0"), true); + setGlobally(ConfigurationType::LogFlushThreshold, std::string("0"), true); + + setGlobally(ConfigurationType::Format, std::string("%datetime %level [%logger] %msg"), true); + set(Level::Debug, ConfigurationType::Format, std::string("%datetime %level [%logger] [%user@%host] [%func] [%loc] %msg")); + // INFO and WARNING are set to default by Level::Global + set(Level::Error, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + set(Level::Fatal, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + set(Level::Verbose, ConfigurationType::Format, std::string("%datetime %level-%vlevel [%logger] %msg")); + set(Level::Trace, ConfigurationType::Format, std::string("%datetime %level [%logger] [%func] [%loc] %msg")); + } + + /// @brief Lets you set the remaining configurations to default. + /// + /// @detail By remaining, it means that the level/type a configuration does not exist for. + /// This function is useful when you want to minimize chances of failures, e.g, if you have a configuration file that sets + /// configuration for all the configurations except for Enabled or not, we use this so that ENABLED is set to default i.e, + /// true. If you dont do this explicitley (either by calling this function or by using second param in Constructor + /// and try to access a value, an error is thrown + void setRemainingToDefault(void) { + base::threading::ScopedLock scopedLock(lock()); + unsafeSetIfNotExist(Level::Global, ConfigurationType::Enabled, std::string("true")); +#if !defined(ELPP_NO_DEFAULT_LOG_FILE) + unsafeSetIfNotExist(Level::Global, ConfigurationType::Filename, std::string(base::consts::kDefaultLogFile)); +#endif // !defined(ELPP_NO_DEFAULT_LOG_FILE) + unsafeSetIfNotExist(Level::Global, ConfigurationType::ToFile, std::string("true")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::ToStandardOutput, std::string("true")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::MillisecondsWidth, std::string("3")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::PerformanceTracking, std::string("true")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::MaxLogFileSize, std::string("0")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + unsafeSetIfNotExist(Level::Debug, ConfigurationType::Format, + std::string("%datetime %level [%logger] [%user@%host] [%func] [%loc] %msg")); + // INFO and WARNING are set to default by Level::Global + unsafeSetIfNotExist(Level::Error, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + unsafeSetIfNotExist(Level::Fatal, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + unsafeSetIfNotExist(Level::Verbose, ConfigurationType::Format, std::string("%datetime %level-%vlevel [%logger] %msg")); + unsafeSetIfNotExist(Level::Trace, ConfigurationType::Format, std::string("%datetime %level [%logger] [%func] [%loc] %msg")); + } + + /// @brief Parser used internally to parse configurations from file or text. + /// + /// @detail This class makes use of base::utils::Str. + /// You should not need this unless you are working on some tool for Easylogging++ + class Parser : base::StaticClass { + public: + /// @brief Parses configuration from file. + /// @param configurationFile Full path to configuration file + /// @param sender Sender configurations pointer. Usually 'this' is used from calling class + /// @param base Configurations to base new configuration repository off. This value is used when you want to use + /// existing Configurations to base all the values and then set rest of configuration via configuration file. + /// @return True if successfully parsed, false otherwise. You may define '_STOP_ON_FIRSTELPP_ASSERTION' to make sure you + /// do not proceed without successful parse. + static bool parseFromFile(const std::string& configurationFile, Configurations* sender, Configurations* base = nullptr) { + sender->setFromBase(base); + std::ifstream fileStream_(configurationFile.c_str(), std::ifstream::in); + ELPP_ASSERT(fileStream_.is_open(), "Unable to open configuration file [" << configurationFile << "] for parsing."); + bool parsedSuccessfully = false; + std::string line = std::string(); + Level currLevel = Level::Unknown; + std::string currConfigStr = std::string(); + std::string currLevelStr = std::string(); + while (fileStream_.good()) { + std::getline(fileStream_, line); + parsedSuccessfully = parseLine(&line, &currConfigStr, &currLevelStr, &currLevel, sender); + ELPP_ASSERT(parsedSuccessfully, "Unable to parse configuration line: " << line); + } + return parsedSuccessfully; + } + + /// @brief Parse configurations from configuration string. + /// + /// @detail This configuration string has same syntax as configuration file contents. Make sure all the necessary + /// new line characters are provided. You may define '_STOP_ON_FIRSTELPP_ASSERTION' to make sure you + /// do not proceed without successful parse (This is recommended) + /// @param configurationsString + /// @param sender Sender configurations pointer. Usually 'this' is used from calling class + /// @param base Configurations to base new configuration repository off. This value is used when you want to use + /// existing Configurations to base all the values and then set rest of configuration via configuration text. + /// @return True if successfully parsed, false otherwise. + static bool parseFromText(const std::string& configurationsString, Configurations* sender, Configurations* base = nullptr) { + sender->setFromBase(base); + bool parsedSuccessfully = false; + std::stringstream ss(configurationsString); + std::string line = std::string(); + Level currLevel = Level::Unknown; + std::string currConfigStr = std::string(); + std::string currLevelStr = std::string(); + while (std::getline(ss, line)) { + parsedSuccessfully = parseLine(&line, &currConfigStr, &currLevelStr, &currLevel, sender); + ELPP_ASSERT(parsedSuccessfully, "Unable to parse configuration line: " << line); + } + return parsedSuccessfully; + } + + private: + friend class el::Loggers; + static void ignoreComments(std::string* line) { + std::size_t foundAt = 0; + std::size_t quotesStart = line->find("\""); + std::size_t quotesEnd = std::string::npos; + if (quotesStart != std::string::npos) { + quotesEnd = line->find("\"", quotesStart + 1); + while (quotesEnd != std::string::npos && line->at(quotesEnd - 1) == '\\') { + // Do not erase slash yet - we will erase it in parseLine(..) while loop + quotesEnd = line->find("\"", quotesEnd + 2); + } + } + if ((foundAt = line->find(base::consts::kConfigurationComment)) != std::string::npos) { + if (foundAt < quotesEnd) { + foundAt = line->find(base::consts::kConfigurationComment, quotesEnd + 1); + } + *line = line->substr(0, foundAt); + } + } + static inline bool isLevel(const std::string& line) { + return base::utils::Str::startsWith(line, std::string(base::consts::kConfigurationLevel)); + } + + static inline bool isComment(const std::string& line) { + return base::utils::Str::startsWith(line, std::string(base::consts::kConfigurationComment)); + } + + static inline bool isConfig(const std::string& line) { + std::size_t assignment = line.find('='); + return line != "" && + (line[0] >= 65 || line[0] <= 90 || line[0] >= 97 || line[0] <= 122) && + (assignment != std::string::npos) && + (line.size() > assignment); + } + + static bool parseLine(std::string* line, std::string* currConfigStr, std::string* currLevelStr, Level* currLevel, Configurations* conf) { + ConfigurationType currConfig = ConfigurationType::Unknown; + std::string currValue = std::string(); + *line = base::utils::Str::trim(*line); + if (isComment(*line)) return true; + ignoreComments(line); + *line = base::utils::Str::trim(*line); + if (line->empty()) { + // Comment ignored + return true; + } + if (isLevel(*line)) { + if (line->size() <= 2) { + return true; + } + *currLevelStr = line->substr(1, line->size() - 2); + *currLevelStr = base::utils::Str::toUpper(*currLevelStr); + *currLevelStr = base::utils::Str::trim(*currLevelStr); + *currLevel = LevelHelper::convertFromString(currLevelStr->c_str()); + return true; + } + if (isConfig(*line)) { + std::size_t assignment = line->find('='); + *currConfigStr = line->substr(0, assignment); + *currConfigStr = base::utils::Str::toUpper(*currConfigStr); + *currConfigStr = base::utils::Str::trim(*currConfigStr); + currConfig = ConfigurationTypeHelper::convertFromString(currConfigStr->c_str()); + currValue = line->substr(assignment + 1); + currValue = base::utils::Str::trim(currValue); + std::size_t quotesStart = currValue.find("\"", 0); + std::size_t quotesEnd = std::string::npos; + if (quotesStart != std::string::npos) { + quotesEnd = currValue.find("\"", quotesStart + 1); + while (quotesEnd != std::string::npos && currValue.at(quotesEnd - 1) == '\\') { + currValue = currValue.erase(quotesEnd - 1, 1); + quotesEnd = currValue.find("\"", quotesEnd + 2); + } + } + if (quotesStart != std::string::npos && quotesEnd != std::string::npos) { + // Quote provided - check and strip if valid + ELPP_ASSERT((quotesStart < quotesEnd), "Configuration error - No ending quote found in [" + << currConfigStr << "]"); + ELPP_ASSERT((quotesStart + 1 != quotesEnd), "Empty configuration value for [" << currConfigStr << "]"); + if ((quotesStart != quotesEnd) && (quotesStart + 1 != quotesEnd)) { + // Explicit check in case if assertion is disabled + currValue = currValue.substr(quotesStart + 1, quotesEnd - 1); + } + } + } + ELPP_ASSERT(*currLevel != Level::Unknown, "Unrecognized severity level [" << *currLevelStr << "]"); + ELPP_ASSERT(currConfig != ConfigurationType::Unknown, "Unrecognized configuration [" << *currConfigStr << "]"); + if (*currLevel == Level::Unknown || currConfig == ConfigurationType::Unknown) { + return false; // unrecognizable level or config + } + conf->set(*currLevel, currConfig, currValue); + return true; + } + }; + + private: + std::string m_configurationFile; + bool m_isFromFile; + friend class el::Loggers; + + /// @brief Unsafely sets configuration if does not already exist + void unsafeSetIfNotExist(Level level, ConfigurationType configurationType, const std::string& value) { + Configuration* conf = RegistryWithPred::get(level, configurationType); + if (conf == nullptr) { + unsafeSet(level, configurationType, value); + } + } + + /// @brief Thread unsafe set + void unsafeSet(Level level, ConfigurationType configurationType, const std::string& value) { + Configuration* conf = RegistryWithPred::get(level, configurationType); + if (conf == nullptr) { + registerNew(new Configuration(level, configurationType, value)); + } + else { + conf->setValue(value); + } + if (level == Level::Global) { + unsafeSetGlobally(configurationType, value, false); + } + } + + /// @brief Sets configurations for all levels including Level::Global if includeGlobalLevel is true + /// @see Configurations::setGlobally(ConfigurationType configurationType, const std::string& value) + void setGlobally(ConfigurationType configurationType, const std::string& value, bool includeGlobalLevel) { + if (includeGlobalLevel) { + set(Level::Global, configurationType, value); + } + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + set(LevelHelper::castFromInt(lIndex), configurationType, value); + return false; // Do not break lambda function yet as we need to set all levels regardless + }); + } + + /// @brief Sets configurations (Unsafely) for all levels including Level::Global if includeGlobalLevel is true + /// @see Configurations::setGlobally(ConfigurationType configurationType, const std::string& value) + void unsafeSetGlobally(ConfigurationType configurationType, const std::string& value, bool includeGlobalLevel) { + if (includeGlobalLevel) { + unsafeSet(Level::Global, configurationType, value); + } + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + unsafeSet(LevelHelper::castFromInt(lIndex), configurationType, value); + return false; // Do not break lambda function yet as we need to set all levels regardless + }); + } + }; + + namespace base { + typedef std::shared_ptr FileStreamPtr; + typedef std::map LogStreamsReferenceMap; + /// @brief Configurations with data types. + /// + /// @detail el::Configurations have string based values. This is whats used internally in order to read correct configurations. + /// This is to perform faster while writing logs using correct configurations. + /// + /// This is thread safe and final class containing non-virtual destructor (means nothing should inherit this class) + class TypedConfigurations : public base::threading::ThreadSafe { + public: + /// @brief Constructor to initialize (construct) the object off el::Configurations + /// @param configurations Configurations pointer/reference to base this typed configurations off. + /// @param logStreamsReference Use ELPP->registeredLoggers()->logStreamsReference() + TypedConfigurations(Configurations* configurations, base::LogStreamsReferenceMap* logStreamsReference) { + m_configurations = configurations; + m_logStreamsReference = logStreamsReference; + build(m_configurations); + } + + TypedConfigurations(const TypedConfigurations& other) { + this->m_configurations = other.m_configurations; + this->m_logStreamsReference = other.m_logStreamsReference; + build(m_configurations); + } + + virtual ~TypedConfigurations(void) { + } + + const Configurations* configurations(void) const { + return m_configurations; + } + + inline bool enabled(Level level) { + return getConfigByVal(level, &m_enabledMap, "enabled"); + } + + inline bool toFile(Level level) { + return getConfigByVal(level, &m_toFileMap, "toFile"); + } + + inline const std::string& filename(Level level) { + return getConfigByRef(level, &m_filenameMap, "filename"); + } + + inline bool toStandardOutput(Level level) { + return getConfigByVal(level, &m_toStandardOutputMap, "toStandardOutput"); + } + + inline const base::LogFormat& logFormat(Level level) { + return getConfigByRef(level, &m_logFormatMap, "logFormat"); + } + + inline const base::MillisecondsWidth& millisecondsWidth(Level level = Level::Global) { + return getConfigByRef(level, &m_millisecondsWidthMap, "millisecondsWidth"); + } + + inline bool performanceTracking(Level level = Level::Global) { + return getConfigByVal(level, &m_performanceTrackingMap, "performanceTracking"); + } + + inline base::type::fstream_t* fileStream(Level level) { + return getConfigByRef(level, &m_fileStreamMap, "fileStream").get(); + } + + inline std::size_t maxLogFileSize(Level level) { + return getConfigByVal(level, &m_maxLogFileSizeMap, "maxLogFileSize"); + } + + inline std::size_t logFlushThreshold(Level level) { + return getConfigByVal(level, &m_logFlushThresholdMap, "logFlushThreshold"); + } + + private: + Configurations* m_configurations; + std::map m_enabledMap; + std::map m_toFileMap; + std::map m_filenameMap; + std::map m_toStandardOutputMap; + std::map m_logFormatMap; + std::map m_millisecondsWidthMap; + std::map m_performanceTrackingMap; + std::map m_fileStreamMap; + std::map m_maxLogFileSizeMap; + std::map m_logFlushThresholdMap; + base::LogStreamsReferenceMap* m_logStreamsReference; + + friend class el::Helpers; + friend class el::base::MessageBuilder; + friend class el::base::Writer; + friend class el::base::DefaultLogDispatchCallback; + friend class el::base::LogDispatcher; + + template + inline Conf_T getConfigByVal(Level level, const std::map* confMap, const char* confName) { + base::threading::ScopedLock scopedLock(lock()); + return unsafeGetConfigByVal(level, confMap, confName); // This is not unsafe anymore - mutex locked in scope + } + + template + inline Conf_T& getConfigByRef(Level level, std::map* confMap, const char* confName) { + base::threading::ScopedLock scopedLock(lock()); + return unsafeGetConfigByRef(level, confMap, confName); // This is not unsafe anymore - mutex locked in scope + } + + template + inline Conf_T unsafeGetConfigByVal(Level level, const std::map* confMap, const char* confName) { + ELPP_UNUSED(confName); + typename std::map::const_iterator it = confMap->find(level); + if (it == confMap->end()) { + try { + return confMap->at(Level::Global); + } + catch (...) { + ELPP_INTERNAL_ERROR("Unable to get configuration [" << confName << "] for level [" + << LevelHelper::convertToString(level) << "]" + << std::endl << "Please ensure you have properly configured logger.", false); + return Conf_T(); + } + } + return it->second; + } + + template + inline Conf_T& unsafeGetConfigByRef(Level level, std::map* confMap, const char* confName) { + ELPP_UNUSED(confName); + typename std::map::iterator it = confMap->find(level); + if (it == confMap->end()) { + try { + return confMap->at(Level::Global); + } + catch (...) { + ELPP_INTERNAL_ERROR("Unable to get configuration [" << confName << "] for level [" + << LevelHelper::convertToString(level) << "]" + << std::endl << "Please ensure you have properly configured logger.", false); + } + } + return it->second; + } + + template + void setValue(Level level, const Conf_T& value, std::map* confMap, bool includeGlobalLevel = true) { + // If map is empty and we are allowed to add into generic level (Level::Global), do it! + if (confMap->empty() && includeGlobalLevel) { + confMap->insert(std::make_pair(Level::Global, value)); + return; + } + // If same value exist in generic level already, dont add it to explicit level + typename std::map::iterator it = confMap->find(Level::Global); + if (it != confMap->end() && it->second == value) { + return; + } + // Now make sure we dont double up values if we really need to add it to explicit level + it = confMap->find(level); + if (it == confMap->end()) { + // Value not found for level, add new + confMap->insert(std::make_pair(level, value)); + } + else { + // Value found, just update value + confMap->at(level) = value; + } + } + + void build(Configurations* configurations) { + base::threading::ScopedLock scopedLock(lock()); + auto getBool = [](std::string boolStr) -> bool { // Pass by value for trimming + base::utils::Str::trim(boolStr); + return (boolStr == "TRUE" || boolStr == "true" || boolStr == "1"); + }; + std::vector withFileSizeLimit; + for (Configurations::const_iterator it = configurations->begin(); it != configurations->end(); ++it) { + Configuration* conf = *it; + // We cannot use switch on strong enums because Intel C++ dont support them yet + if (conf->configurationType() == ConfigurationType::Enabled) { + setValue(conf->level(), getBool(conf->value()), &m_enabledMap); + } + else if (conf->configurationType() == ConfigurationType::ToFile) { + setValue(conf->level(), getBool(conf->value()), &m_toFileMap); + } + else if (conf->configurationType() == ConfigurationType::ToStandardOutput) { + setValue(conf->level(), getBool(conf->value()), &m_toStandardOutputMap); + } + else if (conf->configurationType() == ConfigurationType::Filename) { + // We do not yet configure filename but we will configure in another + // loop. This is because if file cannot be created, we will force ToFile + // to be false. Because configuring logger is not necessarily performance + // sensative operation, we can live with another loop; (by the way this loop + // is not very heavy either) + } + else if (conf->configurationType() == ConfigurationType::Format) { + setValue(conf->level(), base::LogFormat(conf->level(), + base::type::string_t(conf->value().begin(), conf->value().end())), &m_logFormatMap); + } + else if (conf->configurationType() == ConfigurationType::MillisecondsWidth) { + setValue(Level::Global, + base::MillisecondsWidth(static_cast(getULong(conf->value()))), &m_millisecondsWidthMap); + } + else if (conf->configurationType() == ConfigurationType::PerformanceTracking) { + setValue(Level::Global, getBool(conf->value()), &m_performanceTrackingMap); + } + else if (conf->configurationType() == ConfigurationType::MaxLogFileSize) { + setValue(conf->level(), static_cast(getULong(conf->value())), &m_maxLogFileSizeMap); +#if !defined(ELPP_NO_DEFAULT_LOG_FILE) + withFileSizeLimit.push_back(conf); +#endif // !defined(ELPP_NO_DEFAULT_LOG_FILE) + } + else if (conf->configurationType() == ConfigurationType::LogFlushThreshold) { + setValue(conf->level(), static_cast(getULong(conf->value())), &m_logFlushThresholdMap); + } + } + // As mentioned early, we will now set filename configuration in separate loop to deal with non-existent files + for (Configurations::const_iterator it = configurations->begin(); it != configurations->end(); ++it) { + Configuration* conf = *it; + if (conf->configurationType() == ConfigurationType::Filename) { + insertFile(conf->level(), conf->value()); + } + } + for (std::vector::iterator conf = withFileSizeLimit.begin(); + conf != withFileSizeLimit.end(); ++conf) { + // This is not unsafe as mutex is locked in currect scope + unsafeValidateFileRolling((*conf)->level(), base::defaultPreRollOutCallback); + } + } + + unsigned long getULong(std::string confVal) { + bool valid = true; + base::utils::Str::trim(confVal); + valid = !confVal.empty() && std::find_if(confVal.begin(), confVal.end(), + [](char c) { return !base::utils::Str::isDigit(c); }) == confVal.end(); + if (!valid) { + valid = false; + ELPP_ASSERT(valid, "Configuration value not a valid integer [" << confVal << "]"); + return 0; + } + return atol(confVal.c_str()); + } + + std::string resolveFilename(const std::string& filename) { + std::string resultingFilename = filename; + std::size_t dateIndex = std::string::npos; + std::string dateTimeFormatSpecifierStr = std::string(base::consts::kDateTimeFormatSpecifierForFilename); + if ((dateIndex = resultingFilename.find(dateTimeFormatSpecifierStr.c_str())) != std::string::npos) { + while (dateIndex > 0 && resultingFilename[dateIndex - 1] == base::consts::kFormatSpecifierChar) { + dateIndex = resultingFilename.find(dateTimeFormatSpecifierStr.c_str(), dateIndex + 1); + } + if (dateIndex != std::string::npos) { + const char* ptr = resultingFilename.c_str() + dateIndex; + // Goto end of specifier + ptr += dateTimeFormatSpecifierStr.size(); + std::string fmt; + if ((resultingFilename.size() > dateIndex) && (ptr[0] == '{')) { + // User has provided format for date/time + ++ptr; + int count = 1; // Start by 1 in order to remove starting brace + std::stringstream ss; + for (; *ptr; ++ptr, ++count) { + if (*ptr == '}') { + ++count; // In order to remove ending brace + break; + } + ss << *ptr; + } + resultingFilename.erase(dateIndex + dateTimeFormatSpecifierStr.size(), count); + fmt = ss.str(); + } + else { + fmt = std::string(base::consts::kDefaultDateTimeFormatInFilename); + } + base::MillisecondsWidth msWidth(3); + std::string now = base::utils::DateTime::getDateTime(fmt.c_str(), &msWidth); + base::utils::Str::replaceAll(now, '/', '-'); // Replace path element since we are dealing with filename + base::utils::Str::replaceAll(resultingFilename, dateTimeFormatSpecifierStr, now); + } + } + return resultingFilename; + } + + void insertFile(Level level, const std::string& fullFilename) { + std::string resolvedFilename = resolveFilename(fullFilename); + if (resolvedFilename.empty()) { + std::cerr << "Could not load empty file for logging, please re-check your configurations for level [" + << LevelHelper::convertToString(level) << "]"; + } + std::string filePath = base::utils::File::extractPathFromFilename(resolvedFilename, base::consts::kFilePathSeperator); + if (filePath.size() < resolvedFilename.size()) { + base::utils::File::createPath(filePath); + } + auto create = [&](Level level) { + base::LogStreamsReferenceMap::iterator filestreamIter = m_logStreamsReference->find(resolvedFilename); + base::type::fstream_t* fs = nullptr; + if (filestreamIter == m_logStreamsReference->end()) { + // We need a completely new stream, nothing to share with + fs = base::utils::File::newFileStream(resolvedFilename); + m_filenameMap.insert(std::make_pair(level, resolvedFilename)); + m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(fs))); + m_logStreamsReference->insert(std::make_pair(resolvedFilename, base::FileStreamPtr(m_fileStreamMap.at(level)))); + } + else { + // Woops! we have an existing one, share it! + m_filenameMap.insert(std::make_pair(level, filestreamIter->first)); + m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(filestreamIter->second))); + fs = filestreamIter->second.get(); + } + if (fs == nullptr) { + // We display bad file error from newFileStream() + ELPP_INTERNAL_ERROR("Setting [TO_FILE] of [" + << LevelHelper::convertToString(level) << "] to FALSE", false); + setValue(level, false, &m_toFileMap); + } + }; + // If we dont have file conf for any level, create it for Level::Global first + // otherwise create for specified level + create(m_filenameMap.empty() && m_fileStreamMap.empty() ? Level::Global : level); + } + + bool unsafeValidateFileRolling(Level level, const PreRollOutCallback& PreRollOutCallback) { + base::type::fstream_t* fs = unsafeGetConfigByRef(level, &m_fileStreamMap, "fileStream").get(); + if (fs == nullptr) { + return true; + } + std::size_t maxLogFileSize = unsafeGetConfigByVal(level, &m_maxLogFileSizeMap, "maxLogFileSize"); + std::size_t currFileSize = base::utils::File::getSizeOfFile(fs); + if (maxLogFileSize != 0 && currFileSize >= maxLogFileSize) { + std::string fname = unsafeGetConfigByRef(level, &m_filenameMap, "filename"); + ELPP_INTERNAL_INFO(1, "Truncating log file [" << fname << "] as a result of configurations for level [" + << LevelHelper::convertToString(level) << "]"); + fs->close(); + PreRollOutCallback(fname.c_str(), currFileSize); + fs->open(fname, std::fstream::out | std::fstream::trunc); + return true; + } + return false; + } + + bool validateFileRolling(Level level, const PreRollOutCallback& PreRollOutCallback) { + base::threading::ScopedLock scopedLock(lock()); + return unsafeValidateFileRolling(level, PreRollOutCallback); + } + }; + /// @brief Class that keeps record of current line hit for occasional logging + class HitCounter { + public: + HitCounter(void) : + m_filename(""), + m_lineNumber(0), + m_hitCounts(0) { + } + + HitCounter(const char* filename, unsigned long int lineNumber) : + m_filename(filename), + m_lineNumber(lineNumber), + m_hitCounts(0) { + } + + HitCounter(const HitCounter& hitCounter) : + m_filename(hitCounter.m_filename), + m_lineNumber(hitCounter.m_lineNumber), + m_hitCounts(hitCounter.m_hitCounts) { + } + + HitCounter& operator=(const HitCounter& hitCounter) { + m_filename = hitCounter.m_filename; + m_lineNumber = hitCounter.m_lineNumber; + m_hitCounts = hitCounter.m_hitCounts; + return *this; + } + + virtual ~HitCounter(void) { + } + + /// @brief Resets location of current hit counter + inline void resetLocation(const char* filename, unsigned long int lineNumber) { + m_filename = filename; + m_lineNumber = lineNumber; + } + + /// @brief Validates hit counts and resets it if necessary + inline void validateHitCounts(std::size_t n) { + if (m_hitCounts >= base::consts::kMaxLogPerCounter) { + m_hitCounts = (n >= 1 ? base::consts::kMaxLogPerCounter % n : 0); + } + ++m_hitCounts; + } + + inline const char* filename(void) const { + return m_filename; + } + + inline unsigned long int lineNumber(void) const { + return m_lineNumber; + } + + inline std::size_t hitCounts(void) const { + return m_hitCounts; + } + + inline void increment(void) { + ++m_hitCounts; + } + + class Predicate { + public: + Predicate(const char* filename, unsigned long int lineNumber) + : m_filename(filename), + m_lineNumber(lineNumber) { + } + inline bool operator()(const HitCounter* counter) { + return ((counter != nullptr) && + (strcmp(counter->m_filename, m_filename) == 0) && + (counter->m_lineNumber == m_lineNumber)); + } + + private: + const char* m_filename; + unsigned long int m_lineNumber; + }; + + private: + const char* m_filename; + unsigned long int m_lineNumber; + std::size_t m_hitCounts; + }; + /// @brief Repository for hit counters used across the application + class RegisteredHitCounters : public base::utils::RegistryWithPred { + public: + /// @brief Validates counter for every N, i.e, registers new if does not exist otherwise updates original one + /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned + bool validateEveryN(const char* filename, unsigned long int lineNumber, std::size_t n) { + base::threading::ScopedLock scopedLock(lock()); + base::HitCounter* counter = get(filename, lineNumber); + if (counter == nullptr) { + registerNew(counter = new base::HitCounter(filename, lineNumber)); + } + counter->validateHitCounts(n); + bool result = (n >= 1 && counter->hitCounts() != 0 && counter->hitCounts() % n == 0); + return result; + } + + /// @brief Validates counter for hits >= N, i.e, registers new if does not exist otherwise updates original one + /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned + bool validateAfterN(const char* filename, unsigned long int lineNumber, std::size_t n) { + base::threading::ScopedLock scopedLock(lock()); + base::HitCounter* counter = get(filename, lineNumber); + if (counter == nullptr) { + registerNew(counter = new base::HitCounter(filename, lineNumber)); + } + // Do not use validateHitCounts here since we do not want to reset counter here + // Note the >= instead of > because we are incrementing + // after this check + if (counter->hitCounts() >= n) + return true; + counter->increment(); + return false; + } + + /// @brief Validates counter for hits are <= n, i.e, registers new if does not exist otherwise updates original one + /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned + bool validateNTimes(const char* filename, unsigned long int lineNumber, std::size_t n) { + base::threading::ScopedLock scopedLock(lock()); + base::HitCounter* counter = get(filename, lineNumber); + if (counter == nullptr) { + registerNew(counter = new base::HitCounter(filename, lineNumber)); + } + counter->increment(); + // Do not use validateHitCounts here since we do not want to reset counter here + if (counter->hitCounts() <= n) + return true; + return false; + } + + /// @brief Gets hit counter registered at specified position + inline const base::HitCounter* getCounter(const char* filename, unsigned long int lineNumber) { + base::threading::ScopedLock scopedLock(lock()); + return get(filename, lineNumber); + } + }; + /// @brief Action to be taken for dispatching + enum class DispatchAction : base::type::EnumType { + None = 1, NormalLog = 2, SysLog = 4 + }; + } // namespace base + template + class Callback : protected base::threading::ThreadSafe { + public: + Callback(void) : m_enabled(true) {} + inline bool enabled(void) const { return m_enabled; } + inline void setEnabled(bool enabled) { + base::threading::ScopedLock scopedLock(lock()); + m_enabled = enabled; + } + protected: + virtual void handle(const T* handlePtr) = 0; + private: + bool m_enabled; + }; + class LogDispatchData { + public: + LogDispatchData() : m_logMessage(nullptr), m_dispatchAction(base::DispatchAction::None) {} + inline const LogMessage* logMessage(void) const { return m_logMessage; } + inline base::DispatchAction dispatchAction(void) const { return m_dispatchAction; } + private: + LogMessage* m_logMessage; + base::DispatchAction m_dispatchAction; + friend class base::LogDispatcher; + + inline void setLogMessage(LogMessage* logMessage) { m_logMessage = logMessage; } + inline void setDispatchAction(base::DispatchAction dispatchAction) { m_dispatchAction = dispatchAction; } + }; + class LogDispatchCallback : public Callback { + private: + friend class base::LogDispatcher; + }; + class PerformanceTrackingCallback : public Callback { + private: + friend class base::PerformanceTracker; + }; + class LogBuilder : base::NoCopy { + public: + virtual ~LogBuilder(void) { ELPP_INTERNAL_INFO(3, "Destroying log builder...") } + virtual base::type::string_t build(const LogMessage* logMessage, bool appendNewLine) const = 0; + void convertToColoredOutput(base::type::string_t* logLine, Level level) { + if (!base::utils::s_termSupportsColor) return; + const base::type::char_t* resetColor = ELPP_LITERAL("\x1b[0m"); + if (level == Level::Error || level == Level::Fatal) + *logLine = ELPP_LITERAL("\x1b[31m") + *logLine + resetColor; + else if (level == Level::Warning) + *logLine = ELPP_LITERAL("\x1b[33m") + *logLine + resetColor; + } + private: + friend class el::base::DefaultLogDispatchCallback; + }; + typedef std::shared_ptr LogBuilderPtr; + /// @brief Represents a logger holding ID and configurations we need to write logs + /// + /// @detail This class does not write logs itself instead its used by writer to read configuations from. + class Logger : public base::threading::ThreadSafe, public Loggable { + public: + Logger(const std::string& id, base::LogStreamsReferenceMap* logStreamsReference) : + m_id(id), + m_typedConfigurations(nullptr), + m_parentApplicationName(std::string()), + m_isConfigured(false), + m_logStreamsReference(logStreamsReference) { + initUnflushedCount(); + } + + Logger(const std::string& id, const Configurations& configurations, base::LogStreamsReferenceMap* logStreamsReference) : + m_id(id), + m_typedConfigurations(nullptr), + m_parentApplicationName(std::string()), + m_isConfigured(false), + m_logStreamsReference(logStreamsReference) { + initUnflushedCount(); + configure(configurations); + } + + Logger(const Logger& logger) { + base::utils::safeDelete(m_typedConfigurations); + m_id = logger.m_id; + m_typedConfigurations = logger.m_typedConfigurations; + m_parentApplicationName = logger.m_parentApplicationName; + m_isConfigured = logger.m_isConfigured; + m_configurations = logger.m_configurations; + m_unflushedCount = logger.m_unflushedCount; + m_logStreamsReference = logger.m_logStreamsReference; + } + + Logger& operator=(const Logger& logger) { + base::utils::safeDelete(m_typedConfigurations); + m_id = logger.m_id; + m_typedConfigurations = logger.m_typedConfigurations; + m_parentApplicationName = logger.m_parentApplicationName; + m_isConfigured = logger.m_isConfigured; + m_configurations = logger.m_configurations; + m_unflushedCount = logger.m_unflushedCount; + m_logStreamsReference = logger.m_logStreamsReference; + return *this; + } + + virtual ~Logger(void) { + base::utils::safeDelete(m_typedConfigurations); + } + + virtual inline void log(el::base::type::ostream_t& os) const { + os << m_id.c_str(); + } + + /// @brief Configures the logger using specified configurations. + void configure(const Configurations& configurations) { + m_isConfigured = false; // we set it to false in case if we fail + initUnflushedCount(); + if (m_typedConfigurations != nullptr) { + Configurations* c = const_cast(m_typedConfigurations->configurations()); + if (c->hasConfiguration(Level::Global, ConfigurationType::Filename)) { + // This check is definitely needed for cases like ELPP_NO_DEFAULT_LOG_FILE + flush(); + } + } + base::threading::ScopedLock scopedLock(lock()); + if (m_configurations != configurations) { + m_configurations.setFromBase(const_cast(&configurations)); + } + base::utils::safeDelete(m_typedConfigurations); + m_typedConfigurations = new base::TypedConfigurations(&m_configurations, m_logStreamsReference); + resolveLoggerFormatSpec(); + m_isConfigured = true; + } + + /// @brief Reconfigures logger using existing configurations + inline void reconfigure(void) { + ELPP_INTERNAL_INFO(1, "Reconfiguring logger [" << m_id << "]"); + configure(m_configurations); + } + + inline const std::string& id(void) const { + return m_id; + } + + inline const std::string& parentApplicationName(void) const { + return m_parentApplicationName; + } + + inline void setParentApplicationName(const std::string& parentApplicationName) { + m_parentApplicationName = parentApplicationName; + } + + inline Configurations* configurations(void) { + return &m_configurations; + } + + inline base::TypedConfigurations* typedConfigurations(void) { + return m_typedConfigurations; + } + + static inline bool isValidId(const std::string& id) { + for (std::string::const_iterator it = id.begin(); it != id.end(); ++it) { + if (!base::utils::Str::contains(base::consts::kValidLoggerIdSymbols, *it)) { + return false; + } + } + return true; + } + /// @brief Flushes logger to sync all log files for all levels + inline void flush(void) { + ELPP_INTERNAL_INFO(3, "Flushing logger [" << m_id << "] all levels"); + base::threading::ScopedLock scopedLock(lock()); + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + flush(LevelHelper::castFromInt(lIndex), nullptr); + return false; + }); + } + + inline void flush(Level level, base::type::fstream_t* fs) { + if (fs == nullptr && m_typedConfigurations->toFile(level)) { + fs = m_typedConfigurations->fileStream(level); + } + if (fs != nullptr) { + fs->flush(); + m_unflushedCount.find(level)->second = 0; + } + } + + inline bool isFlushNeeded(Level level) { + return ++m_unflushedCount.find(level)->second >= m_typedConfigurations->logFlushThreshold(level); + } + + inline LogBuilder* logBuilder(void) const { + return m_logBuilder.get(); + } + + inline void setLogBuilder(const LogBuilderPtr& logBuilder) { + m_logBuilder = logBuilder; + } + + inline bool enabled(Level level) const { + return m_typedConfigurations->enabled(level); + } + +#if ELPP_VARIADIC_TEMPLATES_SUPPORTED +# define LOGGER_LEVEL_WRITERS_SIGNATURES(FUNCTION_NAME)\ + template \ + inline void FUNCTION_NAME(const char*, const T&, const Args&...);\ + template \ + inline void FUNCTION_NAME(const T&); + + template + inline void verbose(int, const char*, const T&, const Args&...); + + template + inline void verbose(int, const T&); + + LOGGER_LEVEL_WRITERS_SIGNATURES(info) + LOGGER_LEVEL_WRITERS_SIGNATURES(debug) + LOGGER_LEVEL_WRITERS_SIGNATURES(warn) + LOGGER_LEVEL_WRITERS_SIGNATURES(error) + LOGGER_LEVEL_WRITERS_SIGNATURES(fatal) + LOGGER_LEVEL_WRITERS_SIGNATURES(trace) +# undef LOGGER_LEVEL_WRITERS_SIGNATURES +#endif // ELPP_VARIADIC_TEMPLATES_SUPPORTED + private: + std::string m_id; + base::TypedConfigurations* m_typedConfigurations; + base::type::stringstream_t m_stream; + std::string m_parentApplicationName; + bool m_isConfigured; + Configurations m_configurations; + std::map m_unflushedCount; + base::LogStreamsReferenceMap* m_logStreamsReference; + LogBuilderPtr m_logBuilder; + + friend class el::LogMessage; + friend class el::Loggers; + friend class el::Helpers; + friend class el::base::RegisteredLoggers; + friend class el::base::DefaultLogDispatchCallback; + friend class el::base::MessageBuilder; + friend class el::base::Writer; + friend class el::base::PErrorWriter; + friend class el::base::Storage; + friend class el::base::PerformanceTracker; + friend class el::base::LogDispatcher; + + Logger(void); + +#if ELPP_VARIADIC_TEMPLATES_SUPPORTED + template + void log_(Level, int, const char*, const T&, const Args&...); + + template + inline void log_(Level, int, const T&); + + template + void log(Level, const char*, const T&, const Args&...); + + template + inline void log(Level, const T&); +#endif // ELPP_VARIADIC_TEMPLATES_SUPPORTED + + void initUnflushedCount(void) { + m_unflushedCount.clear(); + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + m_unflushedCount.insert(std::make_pair(LevelHelper::castFromInt(lIndex), 0)); + return false; + }); + } + + inline base::type::stringstream_t& stream(void) { + return m_stream; + } + + void resolveLoggerFormatSpec(void) const { + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + base::LogFormat* logFormat = + const_cast(&m_typedConfigurations->logFormat(LevelHelper::castFromInt(lIndex))); + base::utils::Str::replaceFirstWithEscape(logFormat->m_format, base::consts::kLoggerIdFormatSpecifier, m_id); + return false; + }); + } + }; + namespace base { + /// @brief Loggers repository + class RegisteredLoggers : public base::utils::Registry { + public: + explicit RegisteredLoggers(const LogBuilderPtr& defaultLogBuilder) : + m_defaultLogBuilder(defaultLogBuilder) { + m_defaultConfigurations.setToDefault(); + } + + virtual ~RegisteredLoggers(void) { + flushAll(); + } + + inline void setDefaultConfigurations(const Configurations& configurations) { + base::threading::ScopedLock scopedLock(lock()); + m_defaultConfigurations.setFromBase(const_cast(&configurations)); + } + + inline Configurations* defaultConfigurations(void) { + return &m_defaultConfigurations; + } + + Logger* get(const std::string& id, bool forceCreation = true) { + base::threading::ScopedLock scopedLock(lock()); + Logger* logger_ = base::utils::Registry::get(id); + if (logger_ == nullptr && forceCreation) { + bool validId = Logger::isValidId(id); + if (!validId) { + ELPP_ASSERT(validId, "Invalid logger ID [" << id << "]. Not registering this logger."); + return nullptr; + } + logger_ = new Logger(id, m_defaultConfigurations, &m_logStreamsReference); + logger_->m_logBuilder = m_defaultLogBuilder; + registerNew(id, logger_); + } + return logger_; + } + + bool remove(const std::string& id) { + if (id == "default") { + return false; + } + Logger* logger = base::utils::Registry::get(id); + if (logger != nullptr) { + unregister(logger); + } + return true; + } + + inline bool has(const std::string& id) { + return get(id, false) != nullptr; + } + + inline void unregister(Logger*& logger) { + base::threading::ScopedLock scopedLock(lock()); + base::utils::Registry::unregister(logger->id()); + } + + inline base::LogStreamsReferenceMap* logStreamsReference(void) { + return &m_logStreamsReference; + } + + inline void flushAll(void) { + ELPP_INTERNAL_INFO(1, "Flushing all log files"); + base::threading::ScopedLock scopedLock(lock()); + for (base::LogStreamsReferenceMap::iterator it = m_logStreamsReference.begin(); + it != m_logStreamsReference.end(); ++it) { + if (it->second.get() == nullptr) continue; + it->second->flush(); + } + } + + private: + LogBuilderPtr m_defaultLogBuilder; + Configurations m_defaultConfigurations; + base::LogStreamsReferenceMap m_logStreamsReference; + friend class el::base::Storage; + }; + /// @brief Represents registries for verbose logging + class VRegistry : base::NoCopy, public base::threading::ThreadSafe { + public: + explicit VRegistry(base::type::VerboseLevel level, base::type::EnumType* pFlags) : m_level(level), m_pFlags(pFlags) { + } + + /// @brief Sets verbose level. Accepted range is 0-9 + inline void setLevel(base::type::VerboseLevel level) { + base::threading::ScopedLock scopedLock(lock()); + if (level < 0) + m_level = 0; + else if (level > 9) + m_level = base::consts::kMaxVerboseLevel; + else + m_level = level; + } + + inline base::type::VerboseLevel level(void) const { + return m_level; + } + + inline void clearModules(void) { + base::threading::ScopedLock scopedLock(lock()); + m_modules.clear(); + } + + void setModules(const char* modules) { + base::threading::ScopedLock scopedLock(lock()); + auto addSuffix = [](std::stringstream& ss, const char* sfx, const char* prev) { + if (prev != nullptr && base::utils::Str::endsWith(ss.str(), std::string(prev))) { + std::string chr(ss.str().substr(0, ss.str().size() - strlen(prev))); + ss.str(std::string("")); + ss << chr; + } + if (base::utils::Str::endsWith(ss.str(), std::string(sfx))) { + std::string chr(ss.str().substr(0, ss.str().size() - strlen(sfx))); + ss.str(std::string("")); + ss << chr; + } + ss << sfx; + }; + auto insert = [&](std::stringstream& ss, base::type::VerboseLevel level) { + if (!base::utils::hasFlag(LoggingFlag::DisableVModulesExtensions, *m_pFlags)) { + addSuffix(ss, ".h", nullptr); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".c", ".h"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".cpp", ".c"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".cc", ".cpp"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".cxx", ".cc"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".-inl.h", ".cxx"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".hxx", ".-inl.h"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".hpp", ".hxx"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".hh", ".hpp"); + } + m_modules.insert(std::make_pair(ss.str(), level)); + }; + bool isMod = true; + bool isLevel = false; + std::stringstream ss; + int level = -1; + for (; *modules; ++modules) { + switch (*modules) { + case '=': + isLevel = true; + isMod = false; + break; + case ',': + isLevel = false; + isMod = true; + if (!ss.str().empty() && level != -1) { + insert(ss, level); + ss.str(std::string("")); + level = -1; + } + break; + default: + if (isMod) { + ss << *modules; + } + else if (isLevel) { + if (isdigit(*modules)) { + level = static_cast(*modules) - 48; + } + } + break; + } + } + if (!ss.str().empty() && level != -1) { + insert(ss, level); + } + } + + bool allowed(base::type::VerboseLevel vlevel, const char* file) { + base::threading::ScopedLock scopedLock(lock()); + if (m_modules.empty() || file == nullptr) { + return vlevel <= m_level; + } + else { + std::map::iterator it = m_modules.begin(); + for (; it != m_modules.end(); ++it) { + if (base::utils::Str::wildCardMatch(file, it->first.c_str())) { + return vlevel <= it->second; + } + } + if (base::utils::hasFlag(LoggingFlag::AllowVerboseIfModuleNotSpecified, *m_pFlags)) { + return true; + } + return false; + } + } + + inline const std::map& modules(void) const { + return m_modules; + } + + void setFromArgs(const base::utils::CommandLineArgs* commandLineArgs) { + if (commandLineArgs->hasParam("-v") || commandLineArgs->hasParam("--verbose") || + commandLineArgs->hasParam("-V") || commandLineArgs->hasParam("--VERBOSE")) { + setLevel(base::consts::kMaxVerboseLevel); + } + else if (commandLineArgs->hasParamWithValue("--v")) { + setLevel(atoi(commandLineArgs->getParamValue("--v"))); + } + else if (commandLineArgs->hasParamWithValue("--V")) { + setLevel(atoi(commandLineArgs->getParamValue("--V"))); + } + else if ((commandLineArgs->hasParamWithValue("-vmodule")) && vModulesEnabled()) { + setModules(commandLineArgs->getParamValue("-vmodule")); + } + else if (commandLineArgs->hasParamWithValue("-VMODULE") && vModulesEnabled()) { + setModules(commandLineArgs->getParamValue("-VMODULE")); + } + } + + /// @brief Whether or not vModules enabled + inline bool vModulesEnabled(void) { + return !base::utils::hasFlag(LoggingFlag::DisableVModules, *m_pFlags); + } + + private: + base::type::VerboseLevel m_level; + base::type::EnumType* m_pFlags; + std::map m_modules; + }; + } // namespace base + class LogMessage { + public: + LogMessage(Level level, const std::string& file, unsigned long int line, const std::string& func, + base::type::VerboseLevel verboseLevel, Logger* logger) : + m_level(level), m_file(file), m_line(line), m_func(func), + m_verboseLevel(verboseLevel), m_logger(logger), m_message(std::move(logger->stream().str())) { + } + inline Level level(void) const { return m_level; } + inline const std::string& file(void) const { return m_file; } + inline unsigned long int line(void) const { return m_line; } // NOLINT + inline const std::string& func(void) const { return m_func; } + inline base::type::VerboseLevel verboseLevel(void) const { return m_verboseLevel; } + inline Logger* logger(void) const { return m_logger; } + inline const base::type::string_t& message(void) const { return m_message; } + private: + Level m_level; + std::string m_file; + unsigned long int m_line; + std::string m_func; + base::type::VerboseLevel m_verboseLevel; + Logger* m_logger; + base::type::string_t m_message; + }; + namespace base { +#if ELPP_ASYNC_LOGGING + class AsyncLogItem { + public: + explicit AsyncLogItem(const LogMessage& logMessage, const LogDispatchData& data, const base::type::string_t& logLine) + : m_logMessage(logMessage), m_dispatchData(data), m_logLine(logLine) {} + virtual ~AsyncLogItem() {} + inline LogMessage* logMessage(void) { return &m_logMessage; } + inline LogDispatchData* data(void) { return &m_dispatchData; } + inline base::type::string_t logLine(void) { return m_logLine; } + private: + LogMessage m_logMessage; + LogDispatchData m_dispatchData; + base::type::string_t m_logLine; + }; + class AsyncLogQueue : public base::threading::ThreadSafe { + public: + virtual ~AsyncLogQueue() { + ELPP_INTERNAL_INFO(6, "~AsyncLogQueue"); + } + + inline AsyncLogItem next(void) { + base::threading::ScopedLock scopedLock(lock()); + AsyncLogItem result = m_queue.front(); + m_queue.pop(); + return result; + } + + inline void push(const AsyncLogItem& item) { + base::threading::ScopedLock scopedLock(lock()); + m_queue.push(item); + } + inline void pop(void) { + base::threading::ScopedLock scopedLock(lock()); + m_queue.pop(); + } + inline AsyncLogItem front(void) { + base::threading::ScopedLock scopedLock(lock()); + return m_queue.front(); + } + inline bool empty(void) { + base::threading::ScopedLock scopedLock(lock()); + return m_queue.empty(); + } + private: + std::queue m_queue; + }; + class IWorker { + public: + virtual ~IWorker() {} + virtual void start() = 0; + }; +#endif // ELPP_ASYNC_LOGGING + /// @brief Easylogging++ management storage + class Storage : base::NoCopy, public base::threading::ThreadSafe { + public: +#if ELPP_ASYNC_LOGGING + Storage(const LogBuilderPtr& defaultLogBuilder, base::IWorker* asyncDispatchWorker) : +#else + explicit Storage(const LogBuilderPtr& defaultLogBuilder) : +#endif // ELPP_ASYNC_LOGGING + m_registeredHitCounters(new base::RegisteredHitCounters()), + m_registeredLoggers(new base::RegisteredLoggers(defaultLogBuilder)), + m_flags(0x0), + m_vRegistry(new base::VRegistry(0, &m_flags)), +#if ELPP_ASYNC_LOGGING + m_asyncLogQueue(new base::AsyncLogQueue()), + m_asyncDispatchWorker(asyncDispatchWorker), +#endif // ELPP_ASYNC_LOGGING + m_preRollOutCallback(base::defaultPreRollOutCallback) { + // Register default logger + m_registeredLoggers->get(std::string(base::consts::kDefaultLoggerId)); + // Register performance logger and reconfigure format + Logger* performanceLogger = m_registeredLoggers->get(std::string(base::consts::kPerformanceLoggerId)); + performanceLogger->configurations()->setGlobally(ConfigurationType::Format, std::string("%datetime %level %msg")); + performanceLogger->reconfigure(); +#if defined(ELPP_SYSLOG) + // Register syslog logger and reconfigure format + Logger* sysLogLogger = m_registeredLoggers->get(std::string(base::consts::kSysLogLoggerId)); + sysLogLogger->configurations()->setGlobally(ConfigurationType::Format, std::string("%level: %msg")); + sysLogLogger->reconfigure(); +#else + ELPP_UNUSED(base::consts::kSysLogLoggerId); +#endif // defined(ELPP_SYSLOG) + addFlag(LoggingFlag::AllowVerboseIfModuleNotSpecified); +#if ELPP_ASYNC_LOGGING + installLogDispatchCallback(std::string("AsyncLogDispatchCallback")); +#else + installLogDispatchCallback(std::string("DefaultLogDispatchCallback")); +#endif // ELPP_ASYNC_LOGGING + installPerformanceTrackingCallback(std::string("DefaultPerformanceTrackingCallback")); + ELPP_INTERNAL_INFO(1, "Easylogging++ has been initialized"); +#if ELPP_ASYNC_LOGGING + m_asyncDispatchWorker->start(); +#endif // ELPP_ASYNC_LOGGING + } + + virtual ~Storage(void) { + ELPP_INTERNAL_INFO(4, "Destroying storage"); +#if ELPP_ASYNC_LOGGING + ELPP_INTERNAL_INFO(5, "Replacing log dispatch callback to synchronous"); + uninstallLogDispatchCallback(std::string("AsyncLogDispatchCallback")); + installLogDispatchCallback(std::string("DefaultLogDispatchCallback")); + ELPP_INTERNAL_INFO(5, "Destroying asyncDispatchWorker"); + base::utils::safeDelete(m_asyncDispatchWorker); + ELPP_INTERNAL_INFO(5, "Destroying asyncLogQueue"); + base::utils::safeDelete(m_asyncLogQueue); +#endif // ELPP_ASYNC_LOGGING + ELPP_INTERNAL_INFO(5, "Destroying registeredHitCounters"); + base::utils::safeDelete(m_registeredHitCounters); + ELPP_INTERNAL_INFO(5, "Destroying registeredLoggers"); + base::utils::safeDelete(m_registeredLoggers); + ELPP_INTERNAL_INFO(5, "Destroying vRegistry"); + base::utils::safeDelete(m_vRegistry); + } + + inline bool validateEveryNCounter(const char* filename, unsigned long int lineNumber, std::size_t occasion) { + return hitCounters()->validateEveryN(filename, lineNumber, occasion); + } + + inline bool validateAfterNCounter(const char* filename, unsigned long int lineNumber, std::size_t n) { // NOLINT + return hitCounters()->validateAfterN(filename, lineNumber, n); + } + + inline bool validateNTimesCounter(const char* filename, unsigned long int lineNumber, std::size_t n) { // NOLINT + return hitCounters()->validateNTimes(filename, lineNumber, n); + } + + inline base::RegisteredHitCounters* hitCounters(void) const { + return m_registeredHitCounters; + } + + inline base::RegisteredLoggers* registeredLoggers(void) const { + return m_registeredLoggers; + } + + inline base::VRegistry* vRegistry(void) const { + return m_vRegistry; + } + +#if ELPP_ASYNC_LOGGING + inline base::AsyncLogQueue* asyncLogQueue(void) const { + return m_asyncLogQueue; + } +#endif // ELPP_ASYNC_LOGGING + + inline const base::utils::CommandLineArgs* commandLineArgs(void) const { + return &m_commandLineArgs; + } + + inline void addFlag(LoggingFlag flag) { + base::utils::addFlag(flag, &m_flags); + } + + inline void removeFlag(LoggingFlag flag) { + base::utils::removeFlag(flag, &m_flags); + } + + inline bool hasFlag(LoggingFlag flag) const { + return base::utils::hasFlag(flag, m_flags); + } + + inline base::type::EnumType flags(void) const { + return m_flags; + } + + inline void setFlags(base::type::EnumType flags) { + m_flags = flags; + } + + inline void setPreRollOutCallback(const PreRollOutCallback& callback) { + m_preRollOutCallback = callback; + } + + inline void unsetPreRollOutCallback(void) { + m_preRollOutCallback = base::defaultPreRollOutCallback; + } + + inline PreRollOutCallback& preRollOutCallback(void) { + return m_preRollOutCallback; + } + + inline bool hasCustomFormatSpecifier(const char* formatSpecifier) { + base::threading::ScopedLock scopedLock(lock()); + return std::find(m_customFormatSpecifiers.begin(), m_customFormatSpecifiers.end(), + formatSpecifier) != m_customFormatSpecifiers.end(); + } + + inline void installCustomFormatSpecifier(const CustomFormatSpecifier& customFormatSpecifier) { + if (hasCustomFormatSpecifier(customFormatSpecifier.formatSpecifier())) { + return; + } + base::threading::ScopedLock scopedLock(lock()); + m_customFormatSpecifiers.push_back(customFormatSpecifier); + } + + inline bool uninstallCustomFormatSpecifier(const char* formatSpecifier) { + base::threading::ScopedLock scopedLock(lock()); + std::vector::iterator it = std::find(m_customFormatSpecifiers.begin(), + m_customFormatSpecifiers.end(), formatSpecifier); + if (it != m_customFormatSpecifiers.end() && strcmp(formatSpecifier, it->formatSpecifier()) == 0) { + m_customFormatSpecifiers.erase(it); + return true; + } + return false; + } + + const std::vector* customFormatSpecifiers(void) const { + return &m_customFormatSpecifiers; + } + + inline void setLoggingLevel(Level level) { + m_loggingLevel = level; + } + + template + inline bool installLogDispatchCallback(const std::string& id) { + return installCallback(id, &m_logDispatchCallbacks); + } + + template + inline void uninstallLogDispatchCallback(const std::string& id) { + uninstallCallback(id, &m_logDispatchCallbacks); + } + template + inline T* logDispatchCallback(const std::string& id) { + return callback(id, &m_logDispatchCallbacks); + } + + template + inline bool installPerformanceTrackingCallback(const std::string& id) { + return installCallback(id, &m_performanceTrackingCallbacks); + } + + template + inline void uninstallPerformanceTrackingCallback(const std::string& id) { + uninstallCallback(id, &m_performanceTrackingCallbacks); + } + + template + inline T* performanceTrackingCallback(const std::string& id) { + return callback(id, &m_performanceTrackingCallbacks); + } + private: + base::RegisteredHitCounters* m_registeredHitCounters; + base::RegisteredLoggers* m_registeredLoggers; + base::type::EnumType m_flags; + base::VRegistry* m_vRegistry; +#if ELPP_ASYNC_LOGGING + base::AsyncLogQueue* m_asyncLogQueue; + base::IWorker* m_asyncDispatchWorker; +#endif // ELPP_ASYNC_LOGGING + base::utils::CommandLineArgs m_commandLineArgs; + PreRollOutCallback m_preRollOutCallback; + std::map m_logDispatchCallbacks; + std::map m_performanceTrackingCallbacks; + std::vector m_customFormatSpecifiers; + Level m_loggingLevel; + + friend class el::Helpers; + friend class el::base::DefaultLogDispatchCallback; + friend class el::LogBuilder; + friend class el::base::MessageBuilder; + friend class el::base::Writer; + friend class el::base::PerformanceTracker; + friend class el::base::LogDispatcher; + + void setApplicationArguments(int argc, char** argv) { + m_commandLineArgs.setArgs(argc, argv); + m_vRegistry->setFromArgs(commandLineArgs()); + // default log file +#if !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG) + if (m_commandLineArgs.hasParamWithValue(base::consts::kDefaultLogFileParam)) { + Configurations c; + c.setGlobally(ConfigurationType::Filename, std::string(m_commandLineArgs.getParamValue(base::consts::kDefaultLogFileParam))); + registeredLoggers()->setDefaultConfigurations(c); + for (base::RegisteredLoggers::iterator it = registeredLoggers()->begin(); + it != registeredLoggers()->end(); ++it) { + it->second->configure(c); + } + } +#endif // !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG) +#if defined(ELPP_LOGGING_FLAGS_FROM_ARG) + if (m_commandLineArgs.hasParamWithValue(base::consts::kLoggingFlagsParam)) { + m_flags = atoi(m_commandLineArgs.getParamValue(base::consts::kLoggingFlagsParam)); + } +#endif // defined(ELPP_LOGGING_FLAGS_FROM_ARG) + } + + inline void setApplicationArguments(int argc, const char** argv) { + setApplicationArguments(argc, const_cast(argv)); + } + + template + inline bool installCallback(const std::string& id, std::map* mapT) { + if (mapT->find(id) == mapT->end()) { + mapT->insert(std::make_pair(id, TPtr(new T()))); + return true; + } + return false; + } + + template + inline void uninstallCallback(const std::string& id, std::map* mapT) { + if (mapT->find(id) != mapT->end()) { + mapT->erase(id); + } + } + + template + inline T* callback(const std::string& id, std::map* mapT) { + typename std::map::iterator iter = mapT->find(id); + if (iter != mapT->end()) { + return static_cast(iter->second.get()); + } + return nullptr; + } + }; + extern ELPP_EXPORT base::type::StoragePointer elStorage; +#define ELPP el::base::elStorage + class DefaultLogDispatchCallback : public LogDispatchCallback { + protected: + void handle(const LogDispatchData* data) { + m_data = data; + dispatch(std::move(m_data->logMessage()->logger()->logBuilder()->build(m_data->logMessage(), + m_data->dispatchAction() == base::DispatchAction::NormalLog))); + } + private: + const LogDispatchData* m_data; + void dispatch(base::type::string_t&& logLine) { + if (m_data->dispatchAction() == base::DispatchAction::NormalLog) { + if (m_data->logMessage()->logger()->m_typedConfigurations->toFile(m_data->logMessage()->level())) { + base::type::fstream_t* fs = m_data->logMessage()->logger()->m_typedConfigurations->fileStream(m_data->logMessage()->level()); + if (fs != nullptr) { + fs->write(logLine.c_str(), logLine.size()); + if (fs->fail()) { + ELPP_INTERNAL_ERROR("Unable to write log to file [" + << m_data->logMessage()->logger()->m_typedConfigurations->filename(m_data->logMessage()->level()) << "].\n" + << "Few possible reasons (could be something else):\n" << " * Permission denied\n" + << " * Disk full\n" << " * Disk is not writable", true); + } + else { + if (ELPP->hasFlag(LoggingFlag::ImmediateFlush) || (m_data->logMessage()->logger()->isFlushNeeded(m_data->logMessage()->level()))) { + m_data->logMessage()->logger()->flush(m_data->logMessage()->level(), fs); + } + } + } + else { + ELPP_INTERNAL_ERROR("Log file for [" << LevelHelper::convertToString(m_data->logMessage()->level()) << "] " + << "has not been configured but [TO_FILE] is configured to TRUE. [Logger ID: " + << m_data->logMessage()->logger()->id() << "]", false); + } + } + if (m_data->logMessage()->logger()->m_typedConfigurations->toStandardOutput(m_data->logMessage()->level())) { + if (ELPP->hasFlag(LoggingFlag::ColoredTerminalOutput)) + m_data->logMessage()->logger()->logBuilder()->convertToColoredOutput(&logLine, m_data->logMessage()->level()); + ELPP_COUT << ELPP_COUT_LINE(logLine); + } + } +#if defined(ELPP_SYSLOG) + else if (m_data->dispatchAction() == base::DispatchAction::SysLog) { + // Determine syslog priority + int sysLogPriority = 0; + if (m_data->logMessage()->level() == Level::Fatal) + sysLogPriority = LOG_EMERG; + else if (m_data->logMessage()->level() == Level::Error) + sysLogPriority = LOG_ERR; + else if (m_data->logMessage()->level() == Level::Warning) + sysLogPriority = LOG_WARNING; + else if (m_data->logMessage()->level() == Level::Info) + sysLogPriority = LOG_INFO; + else if (m_data->logMessage()->level() == Level::Debug) + sysLogPriority = LOG_DEBUG; + else + sysLogPriority = LOG_NOTICE; +# if defined(ELPP_UNICODE) + char* line = base::utils::Str::wcharPtrToCharPtr(logLine.c_str()); + syslog(sysLogPriority, "%s", line); + free(line); +# else + syslog(sysLogPriority, "%s", logLine.c_str()); +# endif + } +#endif // defined(ELPP_SYSLOG) + } + }; +#if ELPP_ASYNC_LOGGING + class AsyncLogDispatchCallback : public LogDispatchCallback { + protected: + void handle(const LogDispatchData* data) { + base::type::string_t logLine = data->logMessage()->logger()->logBuilder()->build(data->logMessage(), data->dispatchAction() == base::DispatchAction::NormalLog); + if (data->dispatchAction() == base::DispatchAction::NormalLog && data->logMessage()->logger()->typedConfigurations()->toStandardOutput(data->logMessage()->level())) { + if (ELPP->hasFlag(LoggingFlag::ColoredTerminalOutput)) + data->logMessage()->logger()->logBuilder()->convertToColoredOutput(&logLine, data->logMessage()->level()); + ELPP_COUT << ELPP_COUT_LINE(logLine); + } + // Save resources and only queue if we want to write to file otherwise just ignore handler + if (data->logMessage()->logger()->typedConfigurations()->toFile(data->logMessage()->level())) { + ELPP->asyncLogQueue()->push(AsyncLogItem(*(data->logMessage()), *data, logLine)); + } + } + }; + class AsyncDispatchWorker : public base::IWorker, public base::threading::ThreadSafe { + public: + AsyncDispatchWorker() { + setContinueRunning(false); + } + + virtual ~AsyncDispatchWorker() { + setContinueRunning(false); + ELPP_INTERNAL_INFO(6, "Stopping dispatch worker - Cleaning log queue"); + clean(); + ELPP_INTERNAL_INFO(6, "Log queue cleaned"); + } + + inline bool clean() { + std::mutex m; + std::unique_lock lk(m); + cv.wait(lk, [] { return !ELPP->asyncLogQueue()->empty(); }); + emptyQueue(); + lk.unlock(); + cv.notify_one(); + return ELPP->asyncLogQueue()->empty(); + } + + inline void emptyQueue() { + while (!ELPP->asyncLogQueue()->empty()) { + AsyncLogItem data = ELPP->asyncLogQueue()->next(); + handle(&data); + base::threading::msleep(100); + } + } + + virtual inline void start() { + base::threading::msleep(5000); // Wait extra few seconds + setContinueRunning(true); + std::thread t1(&AsyncDispatchWorker::runner, this); + t1.join(); + } + + void handle(AsyncLogItem* logItem) { + LogDispatchData* data = logItem->data(); + LogMessage* logMessage = logItem->logMessage(); + Logger* logger = logMessage->logger(); + base::TypedConfigurations* conf = logger->typedConfigurations(); + base::type::string_t logLine = logItem->logLine(); + if (data->dispatchAction() == base::DispatchAction::NormalLog) { + if (conf->toFile(logMessage->level())) { + base::type::fstream_t* fs = conf->fileStream(logMessage->level()); + if (fs != nullptr) { + fs->write(logLine.c_str(), logLine.size()); + if (fs->fail()) { + ELPP_INTERNAL_ERROR("Unable to write log to file [" + << conf->filename(logMessage->level()) << "].\n" + << "Few possible reasons (could be something else):\n" << " * Permission denied\n" + << " * Disk full\n" << " * Disk is not writable", true); + } + else { + if (ELPP->hasFlag(LoggingFlag::ImmediateFlush) || (logger->isFlushNeeded(logMessage->level()))) { + logger->flush(logMessage->level(), fs); + } + } + } + else { + ELPP_INTERNAL_ERROR("Log file for [" << LevelHelper::convertToString(logMessage->level()) << "] " + << "has not been configured but [TO_FILE] is configured to TRUE. [Logger ID: " << logger->id() << "]", false); + } + } + } +# if defined(ELPP_SYSLOG) + else if (data->dispatchAction() == base::DispatchAction::SysLog) { + // Determine syslog priority + int sysLogPriority = 0; + if (logMessage->level() == Level::Fatal) + sysLogPriority = LOG_EMERG; + else if (logMessage->level() == Level::Error) + sysLogPriority = LOG_ERR; + else if (logMessage->level() == Level::Warning) + sysLogPriority = LOG_WARNING; + else if (logMessage->level() == Level::Info) + sysLogPriority = LOG_INFO; + else if (logMessage->level() == Level::Debug) + sysLogPriority = LOG_DEBUG; + else + sysLogPriority = LOG_NOTICE; +# if defined(ELPP_UNICODE) + char* line = base::utils::Str::wcharPtrToCharPtr(logLine.c_str()); + syslog(sysLogPriority, "%s", line); + free(line); +# else + syslog(sysLogPriority, "%s", logLine.c_str()); +# endif + } +# endif // defined(ELPP_SYSLOG) + } + + void run() { + while (continueRunning()) { + emptyQueue(); + base::threading::msleep(10); // 10ms + } + } + + static void* runner(void *context) { + static_cast(context)->run(); + return NULL; + } + + void setContinueRunning(bool value) { + base::threading::ScopedLock scopedLock(m_continueRunningMutex); + m_continueRunning = value; + } + bool continueRunning(void) { + return m_continueRunning; + } + private: + std::condition_variable cv; + bool m_continueRunning; + base::threading::Mutex m_continueRunningMutex; + }; +#endif // ELPP_ASYNC_LOGGING + } // namespace base + namespace base { + class DefaultLogBuilder : public LogBuilder { + public: + base::type::string_t build(const LogMessage* logMessage, bool appendNewLine) const { + base::TypedConfigurations* tc = logMessage->logger()->typedConfigurations(); + const base::LogFormat* logFormat = &tc->logFormat(logMessage->level()); + base::type::string_t logLine = logFormat->format(); + char buff[base::consts::kSourceFilenameMaxLength + base::consts::kSourceLineMaxLength] = ""; + const char* bufLim = buff + sizeof(buff); + if (logFormat->hasFlag(base::FormatFlags::AppName)) { + // App name + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kAppNameFormatSpecifier, + logMessage->logger()->parentApplicationName()); + } + if (logFormat->hasFlag(base::FormatFlags::ThreadId)) { + // Thread ID + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kThreadIdFormatSpecifier, + base::threading::getCurrentThreadId()); + } + if (logFormat->hasFlag(base::FormatFlags::DateTime)) { + // DateTime + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kDateTimeFormatSpecifier, + base::utils::DateTime::getDateTime(logFormat->dateTimeFormat().c_str(), + &tc->millisecondsWidth(logMessage->level()))); + } + if (logFormat->hasFlag(base::FormatFlags::Function)) { + // Function + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogFunctionFormatSpecifier, logMessage->func()); + } + if (logFormat->hasFlag(base::FormatFlags::File)) { + // File + char* buf = base::utils::Str::clearBuff(buff, base::consts::kSourceFilenameMaxLength); + base::utils::File::buildStrippedFilename(logMessage->file().c_str(), buff); + buf = base::utils::Str::addToBuff(buff, buf, bufLim); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogFileFormatSpecifier, std::string(buff)); + } + if (logFormat->hasFlag(base::FormatFlags::FileBase)) { + // FileBase + char* buf = base::utils::Str::clearBuff(buff, base::consts::kSourceFilenameMaxLength); + base::utils::File::buildBaseFilename(logMessage->file(), buff); + buf = base::utils::Str::addToBuff(buff, buf, bufLim); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogFileBaseFormatSpecifier, std::string(buff)); + } + if (logFormat->hasFlag(base::FormatFlags::Line)) { + // Line + char* buf = base::utils::Str::clearBuff(buff, base::consts::kSourceLineMaxLength); + buf = base::utils::Str::convertAndAddToBuff(logMessage->line(), + base::consts::kSourceLineMaxLength, buf, bufLim, false); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogLineFormatSpecifier, std::string(buff)); + } + if (logFormat->hasFlag(base::FormatFlags::Location)) { + // Location + char* buf = base::utils::Str::clearBuff(buff, + base::consts::kSourceFilenameMaxLength + base::consts::kSourceLineMaxLength); + base::utils::File::buildStrippedFilename(logMessage->file().c_str(), buff); + buf = base::utils::Str::addToBuff(buff, buf, bufLim); + buf = base::utils::Str::addToBuff(":", buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(logMessage->line(), + base::consts::kSourceLineMaxLength, buf, bufLim, false); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogLocationFormatSpecifier, std::string(buff)); + } + if (logMessage->level() == Level::Verbose && logFormat->hasFlag(base::FormatFlags::VerboseLevel)) { + // Verbose level + char* buf = base::utils::Str::clearBuff(buff, 1); + buf = base::utils::Str::convertAndAddToBuff(logMessage->verboseLevel(), 1, buf, bufLim, false); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kVerboseLevelFormatSpecifier, std::string(buff)); + } + if (logFormat->hasFlag(base::FormatFlags::LogMessage)) { + // Log message + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kMessageFormatSpecifier, logMessage->message()); + } +#if !defined(ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS) + for (std::vector::const_iterator it = ELPP->customFormatSpecifiers()->begin(); + it != ELPP->customFormatSpecifiers()->end(); ++it) { + std::string fs(it->formatSpecifier()); + base::type::string_t wcsFormatSpecifier(fs.begin(), fs.end()); + base::utils::Str::replaceFirstWithEscape(logLine, wcsFormatSpecifier, std::string(it->resolver()())); + } +#endif // !defined(ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS) + if (appendNewLine) logLine += ELPP_LITERAL("\n"); + return logLine; + } + }; + /// @brief Dispatches log messages + class LogDispatcher : base::NoCopy { + public: + LogDispatcher(bool proceed, LogMessage&& logMessage, base::DispatchAction dispatchAction) : + m_proceed(proceed), + m_logMessage(std::move(logMessage)), + m_dispatchAction(std::move(dispatchAction)) { + } + + void dispatch(void) { + if (m_proceed && m_dispatchAction == base::DispatchAction::None) { + m_proceed = false; + } + if (!m_proceed) { + return; + } + // We minimize the time of ELPP's lock - this lock is released after log is written + base::threading::ScopedLock scopedLock(ELPP->lock()); + base::TypedConfigurations* tc = m_logMessage.logger()->m_typedConfigurations; + if (ELPP->hasFlag(LoggingFlag::StrictLogFileSizeCheck)) { + tc->validateFileRolling(m_logMessage.level(), ELPP->preRollOutCallback()); + } + LogDispatchCallback* callback = nullptr; + LogDispatchData data; + for (const std::pair& h + : ELPP->m_logDispatchCallbacks) { + callback = h.second.get(); + if (callback != nullptr && callback->enabled()) { + data.setLogMessage(&m_logMessage); + data.setDispatchAction(m_dispatchAction); + callback->acquireLock(); + callback->handle(&data); + callback->releaseLock(); + } + } + } + + private: + bool m_proceed; + LogMessage m_logMessage; + base::DispatchAction m_dispatchAction; + }; +#if defined(ELPP_STL_LOGGING) + /// @brief Workarounds to write some STL logs + /// + /// @detail There is workaround needed to loop through some stl containers. In order to do that, we need iterable containers + /// of same type and provide iterator interface and pass it on to writeIterator(). + /// Remember, this is passed by value in constructor so that we dont change original containers. + /// This operation is as expensive as Big-O(std::min(class_.size(), base::consts::kMaxLogPerContainer)) + namespace workarounds { + /// @brief Abstract IterableContainer template that provides interface for iterable classes of type T + template + class IterableContainer { + public: + typedef typename Container::iterator iterator; + typedef typename Container::const_iterator const_iterator; + IterableContainer(void) {} + virtual ~IterableContainer(void) {} + iterator begin(void) { return getContainer().begin(); } + iterator end(void) { return getContainer().end(); } + private: + virtual Container& getContainer(void) = 0; + }; + /// @brief Implements IterableContainer and provides iterable std::priority_queue class + template, typename Comparator = std::less> + class IterablePriorityQueue : public IterableContainer, public std::priority_queue { + public: + IterablePriorityQueue(std::priority_queue queue_) { + std::size_t count_ = 0; + while (++count_ < base::consts::kMaxLogPerContainer && !queue_.empty()) { + this->push(queue_.top()); + queue_.pop(); + } + } + private: + inline Container& getContainer(void) { + return this->c; + } + }; + /// @brief Implements IterableContainer and provides iterable std::queue class + template> + class IterableQueue : public IterableContainer, public std::queue { + public: + IterableQueue(std::queue queue_) { + std::size_t count_ = 0; + while (++count_ < base::consts::kMaxLogPerContainer && !queue_.empty()) { + this->push(queue_.front()); + queue_.pop(); + } + } + private: + inline Container& getContainer(void) { + return this->c; + } + }; + /// @brief Implements IterableContainer and provides iterable std::stack class + template> + class IterableStack : public IterableContainer, public std::stack { + public: + IterableStack(std::stack stack_) { + std::size_t count_ = 0; + while (++count_ < base::consts::kMaxLogPerContainer && !stack_.empty()) { + this->push(stack_.top()); + stack_.pop(); + } + } + private: + inline Container& getContainer(void) { + return this->c; + } + }; + } // namespace workarounds +#endif // defined(ELPP_STL_LOGGING) + // Log message builder + class MessageBuilder { + public: + MessageBuilder(void) : m_logger(nullptr), m_containerLogSeperator(ELPP_LITERAL("")) {} + void initialize(Logger* logger) { + m_logger = logger; + m_containerLogSeperator = ELPP->hasFlag(LoggingFlag::NewLineForContainer) ? + ELPP_LITERAL("\n ") : ELPP_LITERAL(", "); + } + +# define ELPP_SIMPLE_LOG(LOG_TYPE)\ + inline MessageBuilder& operator<<(LOG_TYPE msg) {\ + m_logger->stream() << msg;\ + if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) {\ + m_logger->stream() << " ";\ + }\ + return *this;\ + } + + inline MessageBuilder& operator<<(const std::string& msg) { + return operator<<(msg.c_str()); + } + ELPP_SIMPLE_LOG(char) + ELPP_SIMPLE_LOG(bool) + ELPP_SIMPLE_LOG(signed short) + ELPP_SIMPLE_LOG(unsigned short) + ELPP_SIMPLE_LOG(signed int) + ELPP_SIMPLE_LOG(unsigned int) + ELPP_SIMPLE_LOG(signed long) + ELPP_SIMPLE_LOG(unsigned long) + ELPP_SIMPLE_LOG(float) + ELPP_SIMPLE_LOG(double) + ELPP_SIMPLE_LOG(char*) + ELPP_SIMPLE_LOG(const char*) + ELPP_SIMPLE_LOG(const void*) + ELPP_SIMPLE_LOG(long double) + inline MessageBuilder& operator<<(const std::wstring& msg) { + return operator<<(msg.c_str()); + } + inline MessageBuilder& operator<<(const wchar_t* msg) { + if (msg == nullptr) { + m_logger->stream() << base::consts::kNullPointer; + return *this; + } +# if defined(ELPP_UNICODE) + m_logger->stream() << msg; +# else + char* buff_ = base::utils::Str::wcharPtrToCharPtr(msg); + m_logger->stream() << buff_; + free(buff_); +# endif + if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) { + m_logger->stream() << " "; + } + return *this; + } + // ostream manipulators + inline MessageBuilder& operator<<(std::ostream& (*OStreamMani)(std::ostream&)) { + m_logger->stream() << OStreamMani; + return *this; + } +#define ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } +#define ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } +#define ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } +#define ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } +#define ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } + +#if defined(ELPP_STL_LOGGING) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::vector) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::list) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::deque) + ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(std::set) + ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(std::multiset) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::map) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::multimap) + template + inline MessageBuilder& operator<<(const std::queue& queue_) { + base::workarounds::IterableQueue iterableQueue_ = + static_cast >(queue_); + return writeIterator(iterableQueue_.begin(), iterableQueue_.end(), iterableQueue_.size()); + } + template + inline MessageBuilder& operator<<(const std::stack& stack_) { + base::workarounds::IterableStack iterableStack_ = + static_cast >(stack_); + return writeIterator(iterableStack_.begin(), iterableStack_.end(), iterableStack_.size()); + } + template + inline MessageBuilder& operator<<(const std::priority_queue& priorityQueue_) { + base::workarounds::IterablePriorityQueue iterablePriorityQueue_ = + static_cast >(priorityQueue_); + return writeIterator(iterablePriorityQueue_.begin(), iterablePriorityQueue_.end(), iterablePriorityQueue_.size()); + } + template + inline MessageBuilder& operator<<(const std::pair& pair_) { + m_logger->stream() << ELPP_LITERAL("("); + operator << (static_cast(pair_.first)); + m_logger->stream() << ELPP_LITERAL(", "); + operator << (static_cast(pair_.second)); + m_logger->stream() << ELPP_LITERAL(")"); + return *this; + } + template + inline MessageBuilder& operator<<(const std::bitset& bitset_) { + m_logger->stream() << ELPP_LITERAL("["); + operator << (bitset_.to_string()); + m_logger->stream() << ELPP_LITERAL("]"); + return *this; + } +# if defined(ELPP_LOG_STD_ARRAY) + template + inline MessageBuilder& operator<<(const std::array& array) { + return writeIterator(array.begin(), array.end(), array.size()); + } +# endif // defined(ELPP_LOG_STD_ARRAY) +# if defined(ELPP_LOG_UNORDERED_MAP) + ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(std::unordered_map) + ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(std::unordered_multimap) +# endif // defined(ELPP_LOG_UNORDERED_MAP) +# if defined(ELPP_LOG_UNORDERED_SET) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::unordered_set) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::unordered_multiset) +# endif // defined(ELPP_LOG_UNORDERED_SET) +#endif // defined(ELPP_STL_LOGGING) +#if defined(ELPP_QT_LOGGING) + inline MessageBuilder& operator<<(const QString& msg) { +# if defined(ELPP_UNICODE) + m_logger->stream() << msg.toStdWString(); +# else + m_logger->stream() << msg.toStdString(); +# endif // defined(ELPP_UNICODE) + return *this; + } + inline MessageBuilder& operator<<(const QByteArray& msg) { + return operator << (QString(msg)); + } + inline MessageBuilder& operator<<(const QStringRef& msg) { + return operator<<(msg.toString()); + } + inline MessageBuilder& operator<<(qint64 msg) { +# if defined(ELPP_UNICODE) + m_logger->stream() << QString::number(msg).toStdWString(); +# else + m_logger->stream() << QString::number(msg).toStdString(); +# endif // defined(ELPP_UNICODE) + return *this; + } + inline MessageBuilder& operator<<(quint64 msg) { +# if defined(ELPP_UNICODE) + m_logger->stream() << QString::number(msg).toStdWString(); +# else + m_logger->stream() << QString::number(msg).toStdString(); +# endif // defined(ELPP_UNICODE) + return *this; + } + inline MessageBuilder& operator<<(QChar msg) { + m_logger->stream() << msg.toLatin1(); + return *this; + } + inline MessageBuilder& operator<<(const QLatin1String& msg) { + m_logger->stream() << msg.latin1(); + return *this; + } + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QList) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QVector) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QQueue) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QSet) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QLinkedList) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QStack) + template + inline MessageBuilder& operator<<(const QPair& pair_) { + m_logger->stream() << ELPP_LITERAL("("); + operator << (static_cast(pair_.first)); + m_logger->stream() << ELPP_LITERAL(", "); + operator << (static_cast(pair_.second)); + m_logger->stream() << ELPP_LITERAL(")"); + return *this; + } + template + inline MessageBuilder& operator<<(const QMap& map_) { + m_logger->stream() << ELPP_LITERAL("["); + QList keys = map_.keys(); + typename QList::const_iterator begin = keys.begin(); + typename QList::const_iterator end = keys.end(); + int max_ = static_cast(base::consts::kMaxLogPerContainer); // to prevent warning + for (int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) { + m_logger->stream() << ELPP_LITERAL("("); + operator << (static_cast(*begin)); + m_logger->stream() << ELPP_LITERAL(", "); + operator << (static_cast(map_.value(*begin))); + m_logger->stream() << ELPP_LITERAL(")"); + m_logger->stream() << ((index_ < keys.size() - 1) ? m_containerLogSeperator : ELPP_LITERAL("")); + } + if (begin != end) { + m_logger->stream() << ELPP_LITERAL("..."); + } + m_logger->stream() << ELPP_LITERAL("]"); + return *this; + } + template + inline MessageBuilder& operator<<(const QMultiMap& map_) { + operator << (static_cast>(map_)); + return *this; + } + template + inline MessageBuilder& operator<<(const QHash& hash_) { + m_logger->stream() << ELPP_LITERAL("["); + QList keys = hash_.keys(); + typename QList::const_iterator begin = keys.begin(); + typename QList::const_iterator end = keys.end(); + int max_ = static_cast(base::consts::kMaxLogPerContainer); // prevent type warning + for (int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) { + m_logger->stream() << ELPP_LITERAL("("); + operator << (static_cast(*begin)); + m_logger->stream() << ELPP_LITERAL(", "); + operator << (static_cast(hash_.value(*begin))); + m_logger->stream() << ELPP_LITERAL(")"); + m_logger->stream() << ((index_ < keys.size() - 1) ? m_containerLogSeperator : ELPP_LITERAL("")); + } + if (begin != end) { + m_logger->stream() << ELPP_LITERAL("..."); + } + m_logger->stream() << ELPP_LITERAL("]"); + return *this; + } + template + inline MessageBuilder& operator<<(const QMultiHash& multiHash_) { + operator << (static_cast>(multiHash_)); + return *this; + } +#endif // defined(ELPP_QT_LOGGING) +#if defined(ELPP_BOOST_LOGGING) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::vector) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::stable_vector) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::list) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::deque) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(boost::container::map) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(boost::container::flat_map) + ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(boost::container::set) + ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(boost::container::flat_set) +#endif // defined(ELPP_BOOST_LOGGING) + + /// @brief Macro used internally that can be used externally to make containers easylogging++ friendly + /// + /// @detail This macro expands to write an ostream& operator<< for container. This container is expected to + /// have begin() and end() methods that return respective iterators + /// @param ContainerType Type of container e.g, MyList from WX_DECLARE_LIST(int, MyList); in wxwidgets + /// @param SizeMethod Method used to get size of container. + /// @param ElementInstance Instance of element to be fed out. Insance name is "elem". See WXELPP_ENABLED macro + /// for an example usage +#define MAKE_CONTAINERELPP_FRIENDLY(ContainerType, SizeMethod, ElementInstance) \ + el::base::type::ostream_t& operator<<(el::base::type::ostream_t& ss, const ContainerType& container) {\ + const el::base::type::char_t* sep = ELPP->hasFlag(el::LoggingFlag::NewLineForContainer) ? \ + ELPP_LITERAL("\n ") : ELPP_LITERAL(", ");\ + ContainerType::const_iterator elem = container.begin();\ + ContainerType::const_iterator endElem = container.end();\ + std::size_t size_ = container.SizeMethod; \ + ss << ELPP_LITERAL("[");\ + for (std::size_t i = 0; elem != endElem && i < el::base::consts::kMaxLogPerContainer; ++i, ++elem) { \ + ss << ElementInstance;\ + ss << ((i < size_ - 1) ? sep : ELPP_LITERAL(""));\ + }\ + if (elem != endElem) {\ + ss << ELPP_LITERAL("...");\ + }\ + ss << ELPP_LITERAL("]");\ + return ss;\ + } +#if defined(ELPP_WXWIDGETS_LOGGING) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(wxVector) +# define ELPP_WX_PTR_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), *(*elem)) +# define ELPP_WX_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), (*elem)) +# define ELPP_WX_HASH_MAP_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), \ + ELPP_LITERAL("(") << elem->first << ELPP_LITERAL(", ") << elem->second << ELPP_LITERAL(")") +#else +# define ELPP_WX_PTR_ENABLED(ContainerType) +# define ELPP_WX_ENABLED(ContainerType) +# define ELPP_WX_HASH_MAP_ENABLED(ContainerType) +#endif // defined(ELPP_WXWIDGETS_LOGGING) + // Other classes + template + ELPP_SIMPLE_LOG(const Class&) +#undef ELPP_SIMPLE_LOG +#undef ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG +#undef ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG +#undef ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG +#undef ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG +#undef ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG + private: + Logger* m_logger; + const base::type::char_t* m_containerLogSeperator; + + template + inline MessageBuilder& writeIterator(Iterator begin_, Iterator end_, std::size_t size_) { + m_logger->stream() << ELPP_LITERAL("["); + for (std::size_t i = 0; begin_ != end_ && i < base::consts::kMaxLogPerContainer; ++i, ++begin_) { + operator << (*begin_); + m_logger->stream() << ((i < size_ - 1) ? m_containerLogSeperator : ELPP_LITERAL("")); + } + if (begin_ != end_) { + m_logger->stream() << ELPP_LITERAL("..."); + } + m_logger->stream() << ELPP_LITERAL("]"); + if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) { + m_logger->stream() << " "; + } + return *this; + } + }; + /// @brief Writes nothing - Used when certain log is disabled + class NullWriter : base::NoCopy { + public: + NullWriter(void) {} + + // Null manipulator + inline NullWriter& operator<<(std::ostream& (*)(std::ostream&)) { + return *this; + } + + template + inline NullWriter& operator<<(const T&) { + return *this; + } + }; + /// @brief Main entry point of each logging + class Writer : base::NoCopy { + public: + Writer(Level level, const char* file, unsigned long int line, + const char* func, base::DispatchAction dispatchAction = base::DispatchAction::NormalLog, + base::type::VerboseLevel verboseLevel = 0) : + m_level(level), m_file(file), m_line(line), m_func(func), m_verboseLevel(verboseLevel), + m_proceed(false), m_dispatchAction(dispatchAction) { + } + + virtual ~Writer(void) { + processDispatch(); + } + + template + inline Writer& operator<<(const T& log) { +#if ELPP_LOGGING_ENABLED + if (m_proceed) { + m_messageBuilder << log; + } +#endif // ELPP_LOGGING_ENABLED + return *this; + } + + inline Writer& operator<<(std::ostream& (*log)(std::ostream&)) { +#if ELPP_LOGGING_ENABLED + if (m_proceed) { + m_messageBuilder << log; + } +#endif // ELPP_LOGGING_ENABLED + return *this; + } + + Writer& construct(Logger* logger, bool needLock = true) { + m_logger = logger; + initializeLogger(logger->id(), false, needLock); + m_messageBuilder.initialize(m_logger); + return *this; + } + + Writer& construct(int count, const char* loggerIds, ...) { + if (ELPP->hasFlag(LoggingFlag::MultiLoggerSupport)) { + va_list loggersList; + va_start(loggersList, loggerIds); + const char* id = loggerIds; + for (int i = 0; i < count; ++i) { + m_loggerIds.push_back(std::string(id)); + id = va_arg(loggersList, const char*); + } + va_end(loggersList); + initializeLogger(m_loggerIds.at(0)); + } + else { + initializeLogger(std::string(loggerIds)); + } + m_messageBuilder.initialize(m_logger); + return *this; + } + protected: + Level m_level; + const char* m_file; + const unsigned long int m_line; + const char* m_func; + base::type::VerboseLevel m_verboseLevel; + Logger* m_logger; + bool m_proceed; + base::MessageBuilder m_messageBuilder; + base::DispatchAction m_dispatchAction; + std::vector m_loggerIds; + friend class el::Helpers; + + void initializeLogger(const std::string& loggerId, bool lookup = true, bool needLock = true) { + if (lookup) { + m_logger = ELPP->registeredLoggers()->get(loggerId, ELPP->hasFlag(LoggingFlag::CreateLoggerAutomatically)); + } + if (m_logger == nullptr) { + ELPP->acquireLock(); + if (!ELPP->registeredLoggers()->has(std::string(base::consts::kDefaultLoggerId))) { + // Somehow default logger has been unregistered. Not good! Register again + ELPP->registeredLoggers()->get(std::string(base::consts::kDefaultLoggerId)); + } + ELPP->releaseLock(); // Need to unlock it for next writer + Writer(Level::Debug, m_file, m_line, m_func).construct(1, base::consts::kDefaultLoggerId) + << "Logger [" << loggerId << "] is not registered yet!"; + m_proceed = false; + } + else { + if (needLock) { + m_logger->acquireLock(); // This should not be unlocked by checking m_proceed because + // m_proceed can be changed by lines below + } + if (ELPP->hasFlag(LoggingFlag::HierarchicalLogging)) { + m_proceed = m_level == Level::Verbose ? m_logger->enabled(m_level) : + LevelHelper::castToInt(m_level) >= LevelHelper::castToInt(ELPP->m_loggingLevel); + } + else { + m_proceed = m_logger->enabled(m_level); + } + } + } + + void processDispatch() { +#if ELPP_LOGGING_ENABLED + if (ELPP->hasFlag(LoggingFlag::MultiLoggerSupport)) { + bool firstDispatched = false; + base::type::string_t logMessage; + std::size_t i = 0; + do { + if (m_proceed) { + if (firstDispatched) { + m_logger->stream() << logMessage; + } + else { + firstDispatched = true; + if (m_loggerIds.size() > 1) { + logMessage = m_logger->stream().str(); + } + } + triggerDispatch(); + } + else if (m_logger != nullptr) { + m_logger->stream().str(ELPP_LITERAL("")); + m_logger->releaseLock(); + } + if (i + 1 < m_loggerIds.size()) { + initializeLogger(m_loggerIds.at(i + 1)); + } + } while (++i < m_loggerIds.size()); + } + else { + if (m_proceed) { + triggerDispatch(); + } + else if (m_logger != nullptr) { + m_logger->stream().str(ELPP_LITERAL("")); + m_logger->releaseLock(); + } + } +#else + if (m_logger != nullptr) { + m_logger->stream().str(ELPP_LITERAL("")); + m_logger->releaseLock(); + } +#endif // ELPP_LOGGING_ENABLED + } + + void triggerDispatch(void) { + if (m_proceed) { + base::LogDispatcher(m_proceed, LogMessage(m_level, m_file, m_line, m_func, m_verboseLevel, + m_logger), m_dispatchAction).dispatch(); + } + if (m_logger != nullptr) { + m_logger->stream().str(ELPP_LITERAL("")); + m_logger->releaseLock(); + } + if (m_proceed && m_level == Level::Fatal + && !ELPP->hasFlag(LoggingFlag::DisableApplicationAbortOnFatalLog)) { + base::Writer(Level::Warning, m_file, m_line, m_func).construct(1, base::consts::kDefaultLoggerId) + << "Aborting application. Reason: Fatal log at [" << m_file << ":" << m_line << "]"; + std::stringstream reasonStream; + reasonStream << "Fatal log at [" << m_file << ":" << m_line << "]" + << " If you wish to disable 'abort on fatal log' please use " + << "el::Helpers::addFlag(el::LoggingFlag::DisableApplicationAbortOnFatalLog)"; + base::utils::abort(1, reasonStream.str()); + } + m_proceed = false; + } + }; + class PErrorWriter : public base::Writer { + public: + PErrorWriter(Level level, const char* file, unsigned long int line, + const char* func, base::DispatchAction dispatchAction = base::DispatchAction::NormalLog, + base::type::VerboseLevel verboseLevel = 0) : + base::Writer(level, file, line, func, dispatchAction, verboseLevel) { + } + + virtual ~PErrorWriter(void) { + if (m_proceed) { +#if ELPP_COMPILER_MSVC + char buff[256]; + strerror_s(buff, 256, errno); + m_logger->stream() << ": " << buff << " [" << errno << "]"; +#else + m_logger->stream() << ": " << strerror(errno) << " [" << errno << "]"; +#endif + } + } + }; + } // namespace base + // Logging from Logger class. Why this is here? Because we have Storage and Writer class available +#if ELPP_VARIADIC_TEMPLATES_SUPPORTED + template + void Logger::log_(Level level, int vlevel, const char* s, const T& value, const Args&... args) { + base::MessageBuilder b; + b.initialize(this); + while (*s) { + if (*s == base::consts::kFormatSpecifierChar) { + if (*(s + 1) == base::consts::kFormatSpecifierChar) { + ++s; + } + else { + if (*(s + 1) == base::consts::kFormatSpecifierCharValue) { + ++s; + b << value; + log_(level, vlevel, ++s, args...); + return; + } + } + } + b << *s++; + } + ELPP_INTERNAL_ERROR("Too many arguments provided. Unable to handle. Please provide more format specifiers", false); + } + template + inline void Logger::log_(Level level, int vlevel, const T& log) { + if (level == Level::Verbose) { + if (ELPP->vRegistry()->allowed(vlevel, __FILE__)) { + base::Writer(Level::Verbose, "FILE", 0, "FUNCTION", + base::DispatchAction::NormalLog, vlevel).construct(this, false) << log; + } + else { + stream().str(ELPP_LITERAL("")); + } + } + else { + base::Writer(level, "FILE", 0, "FUNCTION").construct(this, false) << log; + } + } + template + void Logger::log(Level level, const char* s, const T& value, const Args&... args) { + base::threading::ScopedLock scopedLock(lock()); + log_(level, 0, s, value, args...); + } + template + inline void Logger::log(Level level, const T& log) { + base::threading::ScopedLock scopedLock(lock()); + log_(level, 0, log); + } +# if ELPP_VERBOSE_LOG + template + inline void Logger::verbose(int vlevel, const char* s, const T& value, const Args&... args) { + base::threading::ScopedLock scopedLock(lock()); + log_(el::Level::Verbose, vlevel, s, value, args...); + } + template + inline void Logger::verbose(int vlevel, const T& log) { + base::threading::ScopedLock scopedLock(lock()); + log_(el::Level::Verbose, vlevel, log); + } +# else + template + inline void Logger::verbose(int, const char*, const T&, const Args&...) { + return; + } + template + inline void Logger::verbose(int, const T&) { + return; + } +# endif // ELPP_VERBOSE_LOG +# define LOGGER_LEVEL_WRITERS(FUNCTION_NAME, LOG_LEVEL)\ + template \ + inline void Logger::FUNCTION_NAME(const char* s, const T& value, const Args&... args) {\ + log(LOG_LEVEL, s, value, args...);\ + }\ + template \ + inline void Logger::FUNCTION_NAME(const T& value) {\ + log(LOG_LEVEL, value);\ + } +# define LOGGER_LEVEL_WRITERS_DISABLED(FUNCTION_NAME, LOG_LEVEL)\ + template \ + inline void Logger::FUNCTION_NAME(const char*, const T&, const Args&...) {\ + return;\ + }\ + template \ + inline void Logger::FUNCTION_NAME(const T&) {\ + return;\ + } + +# if ELPP_INFO_LOG + LOGGER_LEVEL_WRITERS(info, Level::Info) +# else + LOGGER_LEVEL_WRITERS_DISABLED(info, Level::Info) +# endif // ELPP_INFO_LOG +# if ELPP_DEBUG_LOG + LOGGER_LEVEL_WRITERS(debug, Level::Debug) +# else + LOGGER_LEVEL_WRITERS_DISABLED(debug, Level::Debug) +# endif // ELPP_DEBUG_LOG +# if ELPP_WARNING_LOG + LOGGER_LEVEL_WRITERS(warn, Level::Warning) +# else + LOGGER_LEVEL_WRITERS_DISABLED(warn, Level::Warning) +# endif // ELPP_WARNING_LOG +# if ELPP_ERROR_LOG + LOGGER_LEVEL_WRITERS(error, Level::Error) +# else + LOGGER_LEVEL_WRITERS_DISABLED(error, Level::Error) +# endif // ELPP_ERROR_LOG +# if ELPP_FATAL_LOG + LOGGER_LEVEL_WRITERS(fatal, Level::Fatal) +# else + LOGGER_LEVEL_WRITERS_DISABLED(fatal, Level::Fatal) +# endif // ELPP_FATAL_LOG +# if ELPP_TRACE_LOG + LOGGER_LEVEL_WRITERS(trace, Level::Trace) +# else + LOGGER_LEVEL_WRITERS_DISABLED(trace, Level::Trace) +# endif // ELPP_TRACE_LOG +# undef LOGGER_LEVEL_WRITERS +# undef LOGGER_LEVEL_WRITERS_DISABLED +#endif // ELPP_VARIADIC_TEMPLATES_SUPPORTED +#if ELPP_COMPILER_MSVC +# define ELPP_VARIADIC_FUNC_MSVC(variadicFunction, variadicArgs) variadicFunction variadicArgs +# define ELPP_VARIADIC_FUNC_MSVC_RUN(variadicFunction, ...) ELPP_VARIADIC_FUNC_MSVC(variadicFunction, (__VA_ARGS__)) +# define el_getVALength(...) ELPP_VARIADIC_FUNC_MSVC_RUN(el_resolveVALength, 0, ## __VA_ARGS__,\ + 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#else +# if ELPP_COMPILER_CLANG +# define el_getVALength(...) el_resolveVALength(0, __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +# else +# define el_getVALength(...) el_resolveVALength(0, ## __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +# endif // ELPP_COMPILER_CLANG +#endif // ELPP_COMPILER_MSVC +#define el_resolveVALength(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N +#define ELPP_WRITE_LOG(writer, level, dispatchAction, ...) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#define ELPP_WRITE_LOG_IF(writer, condition, level, dispatchAction, ...) if (condition) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#define ELPP_WRITE_LOG_EVERY_N(writer, occasion, level, dispatchAction, ...) \ + if (ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion)) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#define ELPP_WRITE_LOG_AFTER_N(writer, n, level, dispatchAction, ...) \ + if (ELPP->validateAfterNCounter(__FILE__, __LINE__, n)) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#define ELPP_WRITE_LOG_N_TIMES(writer, n, level, dispatchAction, ...) \ + if (ELPP->validateNTimesCounter(__FILE__, __LINE__, n)) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#undef ELPP_CURR_FILE_PERFORMANCE_LOGGER +#if defined(ELPP_PERFORMANCE_LOGGER) +# define ELPP_CURR_FILE_PERFORMANCE_LOGGER ELPP_PERFORMANCE_LOGGER +#else +# define ELPP_CURR_FILE_PERFORMANCE_LOGGER el::base::consts::kPerformanceLoggerId +#endif + class PerformanceTrackingData { + public: + enum class DataType : base::type::EnumType { + Checkpoint = 1, Complete = 2 + }; + // Do not use constructor, will run into multiple definition error, use init(PerformanceTracker*) + explicit PerformanceTrackingData(DataType dataType) : m_performanceTracker(nullptr), + m_dataType(dataType), m_file(""), m_line(0), m_func("") {} + inline const std::string* blockName(void) const; + inline const struct timeval* startTime(void) const; + inline const struct timeval* endTime(void) const; + inline const struct timeval* lastCheckpointTime(void) const; + inline const base::PerformanceTracker* performanceTracker(void) const { return m_performanceTracker; } + inline PerformanceTrackingData::DataType dataType(void) const { return m_dataType; } + inline bool firstCheckpoint(void) const { return m_firstCheckpoint; } + inline std::string checkpointId(void) const { return m_checkpointId; } + inline const char* file(void) const { return m_file; } + inline unsigned long int line(void) const { return m_line; } + inline const char* func(void) const { return m_func; } + inline const base::type::string_t* formattedTimeTaken() const { return &m_formattedTimeTaken; } + inline const std::string& loggerId(void) const; + private: + base::PerformanceTracker* m_performanceTracker; + base::type::string_t m_formattedTimeTaken; + PerformanceTrackingData::DataType m_dataType; + bool m_firstCheckpoint; + std::string m_checkpointId; + const char* m_file; + unsigned long int m_line; + const char* m_func; + inline void init(base::PerformanceTracker* performanceTracker, bool firstCheckpoint = false) { + m_performanceTracker = performanceTracker; + m_firstCheckpoint = firstCheckpoint; + } + + friend class el::base::PerformanceTracker; + }; + namespace base { + /// @brief Represents performanceTracker block of code that conditionally adds performance status to log + /// either when goes outside the scope of when checkpoint() is called + class PerformanceTracker : public base::threading::ThreadSafe, public Loggable { + public: + PerformanceTracker(const std::string& blockName, + base::TimestampUnit timestampUnit = base::TimestampUnit::Millisecond, + const std::string& loggerId = std::string(ELPP_CURR_FILE_PERFORMANCE_LOGGER), + bool scopedLog = true, Level level = base::consts::kPerformanceTrackerDefaultLevel) : + m_blockName(blockName), m_timestampUnit(timestampUnit), m_loggerId(loggerId), m_scopedLog(scopedLog), + m_level(level), m_hasChecked(false), m_lastCheckpointId(std::string()), m_enabled(false) { +#if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + // We store it locally so that if user happen to change configuration by the end of scope + // or before calling checkpoint, we still depend on state of configuraton at time of construction + el::Logger* loggerPtr = ELPP->registeredLoggers()->get(loggerId, false); + m_enabled = loggerPtr != nullptr && loggerPtr->m_typedConfigurations->performanceTracking(m_level); + if (m_enabled) { + base::utils::DateTime::gettimeofday(&m_startTime); + } +#endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + } + /// @brief Copy constructor + PerformanceTracker(const PerformanceTracker& t) : + m_blockName(t.m_blockName), m_timestampUnit(t.m_timestampUnit), m_loggerId(t.m_loggerId), m_scopedLog(t.m_scopedLog), + m_level(t.m_level), m_hasChecked(t.m_hasChecked), m_lastCheckpointId(t.m_lastCheckpointId), m_enabled(t.m_enabled), + m_startTime(t.m_startTime), m_endTime(t.m_endTime), m_lastCheckpointTime(t.m_lastCheckpointTime) { + } + virtual ~PerformanceTracker(void) { +#if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + if (m_enabled) { + base::threading::ScopedLock scopedLock(lock()); + if (m_scopedLog) { + base::utils::DateTime::gettimeofday(&m_endTime); + base::type::string_t formattedTime = getFormattedTimeTaken(); + PerformanceTrackingData data(PerformanceTrackingData::DataType::Complete); + data.init(this); + data.m_formattedTimeTaken = formattedTime; + PerformanceTrackingCallback* callback = nullptr; + for (const std::pair& h + : ELPP->m_performanceTrackingCallbacks) { + callback = h.second.get(); + if (callback != nullptr && callback->enabled()) { + callback->acquireLock(); + callback->handle(&data); + callback->releaseLock(); + } + } + } + } +#endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) + } + /// @brief A checkpoint for current performanceTracker block. + void checkpoint(const std::string& id = std::string(), const char* file = __FILE__, unsigned long int line = __LINE__, const char* func = "") { +#if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + if (m_enabled) { + base::threading::ScopedLock scopedLock(lock()); + base::utils::DateTime::gettimeofday(&m_endTime); + base::type::string_t formattedTime = m_hasChecked ? getFormattedTimeTaken(m_lastCheckpointTime) : ELPP_LITERAL(""); + PerformanceTrackingData data(PerformanceTrackingData::DataType::Checkpoint); + data.init(this); + data.m_checkpointId = id; + data.m_file = file; + data.m_line = line; + data.m_func = func; + data.m_formattedTimeTaken = formattedTime; + PerformanceTrackingCallback* callback = nullptr; + for (const std::pair& h + : ELPP->m_performanceTrackingCallbacks) { + callback = h.second.get(); + if (callback != nullptr && callback->enabled()) { + callback->acquireLock(); + callback->handle(&data); + callback->releaseLock(); + } + } + base::utils::DateTime::gettimeofday(&m_lastCheckpointTime); + m_hasChecked = true; + m_lastCheckpointId = id; + } +#endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + ELPP_UNUSED(id); + ELPP_UNUSED(file); + ELPP_UNUSED(line); + ELPP_UNUSED(func); + } + inline Level level(void) const { return m_level; } + private: + std::string m_blockName; + base::TimestampUnit m_timestampUnit; + std::string m_loggerId; + bool m_scopedLog; + Level m_level; + bool m_hasChecked; + std::string m_lastCheckpointId; + bool m_enabled; + struct timeval m_startTime, m_endTime, m_lastCheckpointTime; + + PerformanceTracker(void); + + friend class el::PerformanceTrackingData; + friend class base::DefaultPerformanceTrackingCallback; + + const inline base::type::string_t getFormattedTimeTaken() const { + return getFormattedTimeTaken(m_startTime); + } + + const base::type::string_t getFormattedTimeTaken(struct timeval startTime) const { + if (ELPP->hasFlag(LoggingFlag::FixedTimeFormat)) { + base::type::stringstream_t ss; + ss << base::utils::DateTime::getTimeDifference(m_endTime, + startTime, m_timestampUnit) << " " << base::consts::kTimeFormats[static_cast(m_timestampUnit)].unit; + return ss.str(); + } + return base::utils::DateTime::formatTime(base::utils::DateTime::getTimeDifference(m_endTime, + startTime, m_timestampUnit), m_timestampUnit); + } + + virtual inline void log(el::base::type::ostream_t& os) const { + os << getFormattedTimeTaken(); + } + }; + class DefaultPerformanceTrackingCallback : public PerformanceTrackingCallback { + protected: + void handle(const PerformanceTrackingData* data) { + m_data = data; + base::type::stringstream_t ss; + if (m_data->dataType() == PerformanceTrackingData::DataType::Complete) { + ss << ELPP_LITERAL("Executed [") << m_data->blockName()->c_str() << ELPP_LITERAL("] in [") << *m_data->formattedTimeTaken() << ELPP_LITERAL("]"); + } + else { + ss << ELPP_LITERAL("Performance checkpoint"); + if (!m_data->checkpointId().empty()) { + ss << ELPP_LITERAL(" [") << m_data->checkpointId().c_str() << ELPP_LITERAL("]"); + } + ss << ELPP_LITERAL(" for block [") << m_data->blockName()->c_str() << ELPP_LITERAL("] : [") << *m_data->performanceTracker(); + if (!ELPP->hasFlag(LoggingFlag::DisablePerformanceTrackingCheckpointComparison) && m_data->performanceTracker()->m_hasChecked) { + ss << ELPP_LITERAL(" ([") << *m_data->formattedTimeTaken() << ELPP_LITERAL("] from "); + if (m_data->performanceTracker()->m_lastCheckpointId.empty()) { + ss << ELPP_LITERAL("last checkpoint"); + } + else { + ss << ELPP_LITERAL("checkpoint '") << m_data->performanceTracker()->m_lastCheckpointId.c_str() << ELPP_LITERAL("'"); + } + ss << ELPP_LITERAL(")]"); + } + else { + ss << ELPP_LITERAL("]"); + } + } + el::base::Writer(m_data->performanceTracker()->level(), m_data->file(), m_data->line(), m_data->func()).construct(1, m_data->loggerId().c_str()) << ss.str(); + } + private: + const PerformanceTrackingData* m_data; + }; + } // namespace base + inline const std::string* PerformanceTrackingData::blockName() const { + return const_cast(&m_performanceTracker->m_blockName); + } + inline const struct timeval* PerformanceTrackingData::startTime() const { + return const_cast(&m_performanceTracker->m_startTime); + } + inline const struct timeval* PerformanceTrackingData::endTime() const { + return const_cast(&m_performanceTracker->m_endTime); + } + inline const struct timeval* PerformanceTrackingData::lastCheckpointTime() const { + return const_cast(&m_performanceTracker->m_lastCheckpointTime); + } + inline const std::string& PerformanceTrackingData::loggerId(void) const { return m_performanceTracker->m_loggerId; } + namespace base { + /// @brief Contains some internal debugging tools like crash handler and stack tracer + namespace debug { + class StackTrace : base::NoCopy { + public: + static const std::size_t kMaxStack = 64; + static const std::size_t kStackStart = 2; // We want to skip c'tor and StackTrace::generateNew() + class StackTraceEntry { + public: + StackTraceEntry(std::size_t index, const char* loc, const char* demang, const char* hex, const char* addr) { + m_index = index; + m_location = std::string(loc); + m_demangled = std::string(demang); + m_hex = std::string(hex); + m_addr = std::string(addr); + } + StackTraceEntry(std::size_t index, char* loc) { + m_index = index; + m_location = std::string(loc); + } + std::size_t m_index; + std::string m_location; + std::string m_demangled; + std::string m_hex; + std::string m_addr; + friend std::ostream& operator<<(std::ostream& ss, const StackTraceEntry& si) { + ss << "[" << si.m_index << "] " << si.m_location << (si.m_demangled.empty() ? "" : ":") << si.m_demangled + << (si.m_hex.empty() ? "" : "+") << si.m_hex << si.m_addr; + return ss; + } + + private: + StackTraceEntry(void); + }; + + StackTrace(void) { + generateNew(); + } + + virtual ~StackTrace(void) { + } + + inline std::vector& getLatestStack(void) { + return m_stack; + } + + friend inline std::ostream& operator<<(std::ostream& os, const StackTrace& st) { + std::vector::const_iterator it = st.m_stack.begin(); + while (it != st.m_stack.end()) { + os << " " << *it++ << "\n"; + } + return os; + } + + private: + std::vector m_stack; + + void generateNew(void) { +#if ELPP_STACKTRACE + m_stack.clear(); + void* stack[kMaxStack]; + std::size_t size = backtrace(stack, kMaxStack); + char** strings = backtrace_symbols(stack, size); + if (size > kStackStart) { // Skip StackTrace c'tor and generateNew + for (std::size_t i = kStackStart; i < size; ++i) { + char* mangName = nullptr; + char* hex = nullptr; + char* addr = nullptr; + for (char* c = strings[i]; *c; ++c) { + switch (*c) { + case '(': + mangName = c; + break; + case '+': + hex = c; + break; + case ')': + addr = c; + break; + } + } + // Perform demangling if parsed properly + if (mangName != nullptr && hex != nullptr && addr != nullptr && mangName < hex) { + *mangName++ = '\0'; + *hex++ = '\0'; + *addr++ = '\0'; + int status = 0; + char* demangName = abi::__cxa_demangle(mangName, 0, 0, &status); + // if demangling is successful, output the demangled function name + if (status == 0) { + // Success (see http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html) + StackTraceEntry entry(i - 1, strings[i], demangName, hex, addr); + m_stack.push_back(entry); + } + else { + // Not successful - we will use mangled name + StackTraceEntry entry(i - 1, strings[i], mangName, hex, addr); + m_stack.push_back(entry); + } + free(demangName); + } + else { + StackTraceEntry entry(i - 1, strings[i]); + m_stack.push_back(entry); + } + } + } + free(strings); +#else + ELPP_INTERNAL_INFO(1, "Stacktrace generation not supported for selected compiler"); +#endif // ELPP_STACKTRACE + } + }; + static std::string crashReason(int sig) { + std::stringstream ss; + bool foundReason = false; + for (int i = 0; i < base::consts::kCrashSignalsCount; ++i) { + if (base::consts::kCrashSignals[i].numb == sig) { + ss << "Application has crashed due to [" << base::consts::kCrashSignals[i].name << "] signal"; + if (ELPP->hasFlag(el::LoggingFlag::LogDetailedCrashReason)) { + ss << std::endl << + " " << base::consts::kCrashSignals[i].brief << std::endl << + " " << base::consts::kCrashSignals[i].detail; + } + foundReason = true; + } + } + if (!foundReason) { + ss << "Application has crashed due to unknown signal [" << sig << "]"; + } + return ss.str(); + } + /// @brief Logs reason of crash from sig + static void logCrashReason(int sig, bool stackTraceIfAvailable, Level level, const char* logger) { + std::stringstream ss; + ss << "CRASH HANDLED; "; + ss << crashReason(sig); +#if ELPP_STACKTRACE + if (stackTraceIfAvailable) { + ss << std::endl << " ======= Backtrace: =========" << std::endl << base::debug::StackTrace(); + } +#else + ELPP_UNUSED(stackTraceIfAvailable); +#endif // ELPP_STACKTRACE + ELPP_WRITE_LOG(el::base::Writer, level, base::DispatchAction::NormalLog, logger) << ss.str(); + } + static inline void crashAbort(int sig) { + base::utils::abort(sig); + } + /// @brief Default application crash handler + /// + /// @detail This function writes log using 'default' logger, prints stack trace for GCC based compilers and aborts program. + static inline void defaultCrashHandler(int sig) { + base::debug::logCrashReason(sig, true, Level::Fatal, base::consts::kDefaultLoggerId); + base::debug::crashAbort(sig); + } + /// @brief Handles unexpected crashes + class CrashHandler : base::NoCopy { + public: + typedef void(*Handler)(int); + + explicit CrashHandler(bool useDefault) { + if (useDefault) { + setHandler(defaultCrashHandler); + } + } + explicit CrashHandler(const Handler& cHandler) { + setHandler(cHandler); + } + void setHandler(const Handler& cHandler) { + m_handler = cHandler; +#if defined(ELPP_HANDLE_SIGABRT) + int i = 0; // SIGABRT is at base::consts::kCrashSignals[0] +#else + int i = 1; +#endif // defined(ELPP_HANDLE_SIGABRT) + for (; i < base::consts::kCrashSignalsCount; ++i) { + m_handler = signal(base::consts::kCrashSignals[i].numb, cHandler); + } + } + + private: + Handler m_handler; + }; + } // namespace debug + } // namespace base + extern base::debug::CrashHandler elCrashHandler; +#define MAKE_LOGGABLE(ClassType, ClassInstance, OutputStreamInstance) \ + el::base::type::ostream_t& operator<<(el::base::type::ostream_t& OutputStreamInstance, const ClassType& ClassInstance) + /// @brief Initializes syslog with process ID, options and facility. calls closelog() on d'tor + class SysLogInitializer { + public: + SysLogInitializer(const char* processIdent, int options = 0, int facility = 0) { +#if defined(ELPP_SYSLOG) + openlog(processIdent, options, facility); +#else + ELPP_UNUSED(processIdent); + ELPP_UNUSED(options); + ELPP_UNUSED(facility); +#endif // defined(ELPP_SYSLOG) + } + virtual ~SysLogInitializer(void) { +#if defined(ELPP_SYSLOG) + closelog(); +#endif // defined(ELPP_SYSLOG) + } + }; +#define ELPP_INITIALIZE_SYSLOG(id, opt, fac) el::SysLogInitializer elSyslogInit(id, opt, fac) + /// @brief Static helpers for developers + class Helpers : base::StaticClass { + public: + /// @brief Shares logging repository (base::Storage) + static inline void setStorage(base::type::StoragePointer storage) { + ELPP = storage; + } + /// @return Main storage repository + static inline base::type::StoragePointer storage() { + return ELPP; + } + /// @brief Sets application arguments and figures out whats active for logging and whats not. + static inline void setArgs(int argc, char** argv) { + ELPP->setApplicationArguments(argc, argv); + } + /// @copydoc setArgs(int argc, char** argv) + static inline void setArgs(int argc, const char** argv) { + ELPP->setApplicationArguments(argc, const_cast(argv)); + } + /// @brief Overrides default crash handler and installs custom handler. + /// @param crashHandler A functor with no return type that takes single int argument. + /// Handler is a typedef with specification: void (*Handler)(int) + static inline void setCrashHandler(const el::base::debug::CrashHandler::Handler& crashHandler) { + el::elCrashHandler.setHandler(crashHandler); + } + /// @brief Abort due to crash with signal in parameter + /// @param sig Crash signal + static inline void crashAbort(int sig, const char* sourceFile = "", unsigned int long line = 0) { + std::stringstream ss; + ss << base::debug::crashReason(sig).c_str(); + ss << " - [Called el::Helpers::crashAbort(" << sig << ")]"; + if (sourceFile != nullptr && strlen(sourceFile) > 0) { + ss << " - Source: " << sourceFile; + if (line > 0) + ss << ":" << line; + else + ss << " (line number not specified)"; + } + base::utils::abort(sig, ss.str()); + } + /// @brief Logs reason of crash as per sig + /// @param sig Crash signal + /// @param stackTraceIfAvailable Includes stack trace if available + /// @param level Logging level + /// @param logger Logger to use for logging + static inline void logCrashReason(int sig, bool stackTraceIfAvailable = false, + Level level = Level::Fatal, const char* logger = base::consts::kDefaultLoggerId) { + el::base::debug::logCrashReason(sig, stackTraceIfAvailable, level, logger); + } + /// @brief Installs pre rollout callback, this callback is triggered when log file is about to be rolled out + /// (can be useful for backing up) + static inline void installPreRollOutCallback(const PreRollOutCallback& callback) { + ELPP->setPreRollOutCallback(callback); + } + /// @brief Uninstalls pre rollout callback + static inline void uninstallPreRollOutCallback(void) { + ELPP->unsetPreRollOutCallback(); + } + /// @brief Installs post log dispatch callback, this callback is triggered when log is dispatched + template + static inline bool installLogDispatchCallback(const std::string& id) { + return ELPP->installLogDispatchCallback(id); + } + /// @brief Uninstalls log dispatch callback + template + static inline void uninstallLogDispatchCallback(const std::string& id) { + ELPP->uninstallLogDispatchCallback(id); + } + template + static inline T* logDispatchCallback(const std::string& id) { + return ELPP->logDispatchCallback(id); + } + /// @brief Installs post performance tracking callback, this callback is triggered when performance tracking is finished + template + static inline bool installPerformanceTrackingCallback(const std::string& id) { + return ELPP->installPerformanceTrackingCallback(id); + } + /// @brief Uninstalls post performance tracking handler + template + static inline void uninstallPerformanceTrackingCallback(const std::string& id) { + ELPP->uninstallPerformanceTrackingCallback(id); + } + template + static inline T* performanceTrackingCallback(const std::string& id) { + return ELPP->performanceTrackingCallback(id); + } + /// @brief Converts template to std::string - useful for loggable classes to log containers within log(std::ostream&) const + template + static std::string convertTemplateToStdString(const T& templ) { + el::Logger* logger = + ELPP->registeredLoggers()->get(el::base::consts::kDefaultLoggerId); + if (logger == nullptr) { + return std::string(); + } + base::MessageBuilder b; + b.initialize(logger); + logger->acquireLock(); + b << templ; +#if defined(ELPP_UNICODE) + std::string s = std::string(logger->stream().str().begin(), logger->stream().str().end()); +#else + std::string s = logger->stream().str(); +#endif // defined(ELPP_UNICODE) + logger->stream().str(ELPP_LITERAL("")); + logger->releaseLock(); + return s; + } + /// @brief Returns command line arguments (pointer) provided to easylogging++ + static inline const el::base::utils::CommandLineArgs* commandLineArgs(void) { + return ELPP->commandLineArgs(); + } + /// @brief Installs user defined format specifier and handler + static inline void installCustomFormatSpecifier(const CustomFormatSpecifier& customFormatSpecifier) { + ELPP->installCustomFormatSpecifier(customFormatSpecifier); + } + /// @brief Uninstalls user defined format specifier and handler + static inline bool uninstallCustomFormatSpecifier(const char* formatSpecifier) { + return ELPP->uninstallCustomFormatSpecifier(formatSpecifier); + } + /// @brief Returns true if custom format specifier is installed + static inline bool hasCustomFormatSpecifier(const char* formatSpecifier) { + return ELPP->hasCustomFormatSpecifier(formatSpecifier); + } + static inline void validateFileRolling(Logger* logger, Level level) { + if (logger == nullptr) return; + logger->m_typedConfigurations->validateFileRolling(level, ELPP->preRollOutCallback()); + } + }; + /// @brief Static helpers to deal with loggers and their configurations + class Loggers : base::StaticClass { + public: + /// @brief Gets existing or registers new logger + static inline Logger* getLogger(const std::string& identity, bool registerIfNotAvailable = true) { + base::threading::ScopedLock scopedLock(ELPP->lock()); + return ELPP->registeredLoggers()->get(identity, registerIfNotAvailable); + } + /// @brief Unregisters logger - use it only when you know what you are doing, you may unregister + /// loggers initialized / used by third-party libs. + static inline bool unregisterLogger(const std::string& identity) { + base::threading::ScopedLock scopedLock(ELPP->lock()); + return ELPP->registeredLoggers()->remove(identity); + } + /// @brief Whether or not logger with id is registered + static inline bool hasLogger(const std::string& identity) { + base::threading::ScopedLock scopedLock(ELPP->lock()); + return ELPP->registeredLoggers()->has(identity); + } + /// @brief Reconfigures specified logger with new configurations + static inline Logger* reconfigureLogger(Logger* logger, const Configurations& configurations) { + if (!logger) return nullptr; + logger->configure(configurations); + return logger; + } + /// @brief Reconfigures logger with new configurations after looking it up using identity + static inline Logger* reconfigureLogger(const std::string& identity, const Configurations& configurations) { + return Loggers::reconfigureLogger(Loggers::getLogger(identity), configurations); + } + /// @brief Reconfigures logger's single configuration + static inline Logger* reconfigureLogger(const std::string& identity, ConfigurationType configurationType, + const std::string& value) { + Logger* logger = Loggers::getLogger(identity); + if (logger == nullptr) { + return nullptr; + } + logger->configurations()->set(Level::Global, configurationType, value); + logger->reconfigure(); + return logger; + } + /// @brief Reconfigures all the existing loggers with new configurations + static inline void reconfigureAllLoggers(const Configurations& configurations) { + for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->begin(); + it != ELPP->registeredLoggers()->end(); ++it) { + Loggers::reconfigureLogger(it->second, configurations); + } + } + /// @brief Reconfigures single configuration for all the loggers + static inline void reconfigureAllLoggers(ConfigurationType configurationType, const std::string& value) { + reconfigureAllLoggers(Level::Global, configurationType, value); + } + /// @brief Reconfigures single configuration for all the loggers for specified level + static inline void reconfigureAllLoggers(Level level, ConfigurationType configurationType, + const std::string& value) { + for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->begin(); + it != ELPP->registeredLoggers()->end(); ++it) { + Logger* logger = it->second; + logger->configurations()->set(level, configurationType, value); + logger->reconfigure(); + } + } + /// @brief Sets default configurations. This configuration is used for future (and conditionally for existing) loggers + static inline void setDefaultConfigurations(const Configurations& configurations, bool reconfigureExistingLoggers = false) { + ELPP->registeredLoggers()->setDefaultConfigurations(configurations); + if (reconfigureExistingLoggers) { + Loggers::reconfigureAllLoggers(configurations); + } + } + /// @brief Returns current default + static inline const Configurations* defaultConfigurations(void) { + return ELPP->registeredLoggers()->defaultConfigurations(); + } + /// @brief Returns log stream reference pointer if needed by user + static inline const base::LogStreamsReferenceMap* logStreamsReference(void) { + return ELPP->registeredLoggers()->logStreamsReference(); + } + /// @brief Default typed configuration based on existing defaultConf + static base::TypedConfigurations defaultTypedConfigurations(void) { + return base::TypedConfigurations( + ELPP->registeredLoggers()->defaultConfigurations(), + ELPP->registeredLoggers()->logStreamsReference()); + } + /// @brief Populates all logger IDs in current repository. + /// @param [out] targetList List of fill up. + static inline std::vector* populateAllLoggerIds(std::vector* targetList) { + targetList->clear(); + for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->list().begin(); + it != ELPP->registeredLoggers()->list().end(); ++it) { + targetList->push_back(it->first); + } + return targetList; + } + /// @brief Sets configurations from global configuration file. + static void configureFromGlobal(const char* globalConfigurationFilePath) { + std::ifstream gcfStream(globalConfigurationFilePath, std::ifstream::in); + ELPP_ASSERT(gcfStream.is_open(), "Unable to open global configuration file [" << globalConfigurationFilePath + << "] for parsing."); + std::string line = std::string(); + std::stringstream ss; + Logger* logger = nullptr; + auto configure = [&](void) { + ELPP_INTERNAL_INFO(8, "Configuring logger: '" << logger->id() << "' with configurations \n" << ss.str() + << "\n--------------"); + Configurations c; + c.parseFromText(ss.str()); + logger->configure(c); + }; + while (gcfStream.good()) { + std::getline(gcfStream, line); + ELPP_INTERNAL_INFO(1, "Parsing line: " << line); + base::utils::Str::trim(line); + if (Configurations::Parser::isComment(line)) continue; + Configurations::Parser::ignoreComments(&line); + base::utils::Str::trim(line); + if (line.size() > 2 && base::utils::Str::startsWith(line, std::string(base::consts::kConfigurationLoggerId))) { + if (!ss.str().empty() && logger != nullptr) { + configure(); + } + ss.str(std::string("")); + line = line.substr(2); + base::utils::Str::trim(line); + if (line.size() > 1) { + ELPP_INTERNAL_INFO(1, "Getting logger: '" << line << "'"); + logger = getLogger(line); + } + } + else { + ss << line << "\n"; + } + } + if (!ss.str().empty() && logger != nullptr) { + configure(); + } + } + /// @brief Configures loggers using command line arg. Ensure you have already set command line args, + /// @return False if invalid argument or argument with no value provided, true if attempted to configure logger. + /// If true is returned that does not mean it has been configured successfully, it only means that it + /// has attempeted to configure logger using configuration file provided in argument + static inline bool configureFromArg(const char* argKey) { +#if defined(ELPP_DISABLE_CONFIGURATION_FROM_PROGRAM_ARGS) + ELPP_UNUSED(argKey); +#else + if (!Helpers::commandLineArgs()->hasParamWithValue(argKey)) { + return false; + } + configureFromGlobal(Helpers::commandLineArgs()->getParamValue(argKey)); +#endif // defined(ELPP_DISABLE_CONFIGURATION_FROM_PROGRAM_ARGS) + return true; + } + /// @brief Flushes all loggers for all levels - Be careful if you dont know how many loggers are registered + static inline void flushAll(void) { + ELPP->registeredLoggers()->flushAll(); + } + /// @brief Adds logging flag used internally. + static inline void addFlag(LoggingFlag flag) { + ELPP->addFlag(flag); + } + /// @brief Removes logging flag used internally. + static inline void removeFlag(LoggingFlag flag) { + ELPP->removeFlag(flag); + } + /// @brief Determines whether or not certain flag is active + static inline bool hasFlag(LoggingFlag flag) { + return ELPP->hasFlag(flag); + } + /// @brief Adds flag and removes it when scope goes out + class ScopedAddFlag { + public: + ScopedAddFlag(LoggingFlag flag) : m_flag(flag) { Loggers::addFlag(m_flag); } + ~ScopedAddFlag(void) { Loggers::removeFlag(m_flag); } + private: + LoggingFlag m_flag; + }; + /// @brief Removes flag and add it when scope goes out + class ScopedRemoveFlag { + public: + ScopedRemoveFlag(LoggingFlag flag) : m_flag(flag) { Loggers::removeFlag(m_flag); } + ~ScopedRemoveFlag(void) { Loggers::addFlag(m_flag); } + private: + LoggingFlag m_flag; + }; + /// @brief Sets hierarchy for logging. Needs to enable logging flag (HierarchicalLogging) + static inline void setLoggingLevel(Level level) { + ELPP->setLoggingLevel(level); + } + /// @brief Sets verbose level on the fly + static inline void setVerboseLevel(base::type::VerboseLevel level) { + ELPP->vRegistry()->setLevel(level); + } + /// @brief Gets current verbose level + static inline base::type::VerboseLevel verboseLevel(void) { + return ELPP->vRegistry()->level(); + } + /// @brief Sets vmodules as specified (on the fly) + static inline void setVModules(const char* modules) { + if (ELPP->vRegistry()->vModulesEnabled()) { + ELPP->vRegistry()->setModules(modules); + } + } + /// @brief Clears vmodules + static inline void clearVModules(void) { + ELPP->vRegistry()->clearModules(); + } + }; + class VersionInfo : base::StaticClass { + public: + /// @brief Current version number + static inline const std::string version(void) { return std::string("9.80"); } + /// @brief Release date of current version + static inline const std::string releaseDate(void) { return std::string("08-01-2015 0850hrs"); } + }; +} // namespace el +#undef VLOG_IS_ON + /// @brief Determines whether verbose logging is on for specified level current file. +#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__)) +#undef TIMED_BLOCK +#undef TIMED_SCOPE +#undef TIMED_FUNC +#undef ELPP_MIN_UNIT +#if defined(ELPP_PERFORMANCE_MICROSECONDS) +# define ELPP_MIN_UNIT el::base::TimestampUnit::Microsecond +#else +# define ELPP_MIN_UNIT el::base::TimestampUnit::Millisecond +#endif // (defined(ELPP_PERFORMANCE_MICROSECONDS)) + /// @brief Performance tracked scope. Performance gets written when goes out of scope using + /// 'performance' logger. + /// + /// @detail Please note in order to check the performance at a certain time you can use obj.checkpoint(); + /// @see el::base::PerformanceTracker + /// @see el::base::PerformanceTracker::checkpoint + // Note: Do not surround this definition with null macro because of obj instance +#define TIMED_SCOPE(obj, blockname) el::base::PerformanceTracker obj(blockname, ELPP_MIN_UNIT) +#define TIMED_BLOCK(obj, blockName) for (struct { int i; el::base::PerformanceTracker timer; } obj = { 0, \ + el::base::PerformanceTracker(blockName, ELPP_MIN_UNIT) }; obj.i < 1; ++obj.i) + /// @brief Performance tracked function. Performance gets written when goes out of scope using + /// 'performance' logger. + /// + /// @detail Please note in order to check the performance at a certain time you can use obj.checkpoint(); + /// @see el::base::PerformanceTracker + /// @see el::base::PerformanceTracker::checkpoint +#define TIMED_FUNC(obj) TIMED_SCOPE(obj, ELPP_FUNC) +#undef PERFORMANCE_CHECKPOINT +#undef PERFORMANCE_CHECKPOINT_WITH_ID +#define PERFORMANCE_CHECKPOINT(obj) obj.checkpoint(std::string(), __FILE__, __LINE__, ELPP_FUNC) +#define PERFORMANCE_CHECKPOINT_WITH_ID(obj, id) obj.checkpoint(id, __FILE__, __LINE__, ELPP_FUNC) +#undef ELPP_COUNTER +#undef ELPP_COUNTER_POS + /// @brief Gets hit counter for file/line +#define ELPP_COUNTER (ELPP->hitCounters()->getCounter(__FILE__, __LINE__)) + /// @brief Gets hit counter position for file/line, -1 if not registered yet +#define ELPP_COUNTER_POS (ELPP_COUNTER == nullptr ? -1 : ELPP_COUNTER->hitCounts()) + // Undef levels to support LOG(LEVEL) +#undef INFO +#undef WARNING +#undef DEBUG +#undef ERROR +#undef FATAL +#undef TRACE +#undef VERBOSE + // Undef existing +#undef CINFO +#undef CWARNING +#undef CDEBUG +#undef CFATAL +#undef CERROR +#undef CTRACE +#undef CVERBOSE +#undef CINFO_IF +#undef CWARNING_IF +#undef CDEBUG_IF +#undef CERROR_IF +#undef CFATAL_IF +#undef CTRACE_IF +#undef CVERBOSE_IF +#undef CINFO_EVERY_N +#undef CWARNING_EVERY_N +#undef CDEBUG_EVERY_N +#undef CERROR_EVERY_N +#undef CFATAL_EVERY_N +#undef CTRACE_EVERY_N +#undef CVERBOSE_EVERY_N +#undef CINFO_AFTER_N +#undef CWARNING_AFTER_N +#undef CDEBUG_AFTER_N +#undef CERROR_AFTER_N +#undef CFATAL_AFTER_N +#undef CTRACE_AFTER_N +#undef CVERBOSE_AFTER_N +#undef CINFO_N_TIMES +#undef CWARNING_N_TIMES +#undef CDEBUG_N_TIMES +#undef CERROR_N_TIMES +#undef CFATAL_N_TIMES +#undef CTRACE_N_TIMES +#undef CVERBOSE_N_TIMES + // Normal logs +#if ELPP_INFO_LOG +# define CINFO(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer(\ + el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#else +# define CVERBOSE(writer, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG + // Conditional logs +#if ELPP_INFO_LOG +# define CINFO_IF(writer, condition_, dispatchAction, ...) \ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \ + el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#else +# define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG + // Occasional logs +#if ELPP_INFO_LOG +# define CINFO_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...)\ + CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__) +#else +# define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG + // After N logs +#if ELPP_INFO_LOG +# define CINFO_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...)\ + CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__) +#else +# define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG + // N Times logs +#if ELPP_INFO_LOG +# define CINFO_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...)\ + CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__) +#else +# define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG + // + // Custom Loggers - Requires (level, dispatchAction, loggerId/s) + // + // undef existing +#undef CLOG +#undef CLOG_VERBOSE +#undef CVLOG +#undef CLOG_IF +#undef CLOG_VERBOSE_IF +#undef CVLOG_IF +#undef CLOG_EVERY_N +#undef CVLOG_EVERY_N +#undef CLOG_AFTER_N +#undef CVLOG_AFTER_N +#undef CLOG_N_TIMES +#undef CVLOG_N_TIMES + // Normal logs +#define CLOG(LEVEL, ...)\ + C##LEVEL(el::base::Writer, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG(vlevel, ...) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) + // Conditional logs +#define CLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG_IF(condition, vlevel, ...)\ + CVERBOSE_IF(el::base::Writer, condition, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) + // Hit counts based logs +#define CLOG_EVERY_N(n, LEVEL, ...)\ + C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG_EVERY_N(n, vlevel, ...)\ + CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CLOG_AFTER_N(n, LEVEL, ...)\ + C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG_AFTER_N(n, vlevel, ...)\ + CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CLOG_N_TIMES(n, LEVEL, ...)\ + C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG_N_TIMES(n, vlevel, ...)\ + CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) + // + // Default Loggers macro using CLOG(), CLOG_VERBOSE() and CVLOG() macros + // + // undef existing +#undef LOG +#undef VLOG +#undef LOG_IF +#undef VLOG_IF +#undef LOG_EVERY_N +#undef VLOG_EVERY_N +#undef LOG_AFTER_N +#undef VLOG_AFTER_N +#undef LOG_N_TIMES +#undef VLOG_N_TIMES +#undef ELPP_CURR_FILE_LOGGER_ID +#if defined(ELPP_DEFAULT_LOGGER) +# define ELPP_CURR_FILE_LOGGER_ID ELPP_DEFAULT_LOGGER +#else +# define ELPP_CURR_FILE_LOGGER_ID el::base::consts::kDefaultLoggerId +#endif +#undef ELPP_TRACE +#define ELPP_TRACE CLOG(TRACE, ELPP_CURR_FILE_LOGGER_ID) + // Normal logs +#define LOG(LEVEL) CLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG(vlevel) CVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID) + // Conditional logs +#define LOG_IF(condition, LEVEL) CLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG_IF(condition, vlevel) CVLOG_IF(condition, vlevel, ELPP_CURR_FILE_LOGGER_ID) + // Hit counts based logs +#define LOG_EVERY_N(n, LEVEL) CLOG_EVERY_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +#define LOG_AFTER_N(n, LEVEL) CLOG_AFTER_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +#define LOG_N_TIMES(n, LEVEL) CLOG_N_TIMES(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) + // Generic PLOG() +#undef CPLOG +#undef CPLOG_IF +#undef PLOG +#undef PLOG_IF +#undef DCPLOG +#undef DCPLOG_IF +#undef DPLOG +#undef DPLOG_IF +#define CPLOG(LEVEL, ...)\ + C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CPLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::PErrorWriter, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define DCPLOG(LEVEL, ...)\ + if (ELPP_DEBUG_LOG) C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define DCPLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::PErrorWriter, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define PLOG(LEVEL) CPLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define PLOG_IF(condition, LEVEL) CPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DPLOG(LEVEL) DCPLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DPLOG_IF(condition, LEVEL) DCPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID) + // Generic SYSLOG() +#undef CSYSLOG +#undef CSYSLOG_IF +#undef CSYSLOG_EVERY_N +#undef CSYSLOG_AFTER_N +#undef CSYSLOG_N_TIMES +#undef SYSLOG +#undef SYSLOG_IF +#undef SYSLOG_EVERY_N +#undef SYSLOG_AFTER_N +#undef SYSLOG_N_TIMES +#undef DCSYSLOG +#undef DCSYSLOG_IF +#undef DCSYSLOG_EVERY_N +#undef DCSYSLOG_AFTER_N +#undef DCSYSLOG_N_TIMES +#undef DSYSLOG +#undef DSYSLOG_IF +#undef DSYSLOG_EVERY_N +#undef DSYSLOG_AFTER_N +#undef DSYSLOG_N_TIMES +#if defined(ELPP_SYSLOG) +# define CSYSLOG(LEVEL, ...)\ + C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define CSYSLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define CSYSLOG_EVERY_N(n, LEVEL, ...) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define CSYSLOG_AFTER_N(n, LEVEL, ...) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define CSYSLOG_N_TIMES(n, LEVEL, ...) C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define SYSLOG(LEVEL) CSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId) +# define SYSLOG_IF(condition, LEVEL) CSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId) +# define SYSLOG_EVERY_N(n, LEVEL) CSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define SYSLOG_AFTER_N(n, LEVEL) CSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define SYSLOG_N_TIMES(n, LEVEL) CSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define DCSYSLOG(LEVEL, ...) if (ELPP_DEBUG_LOG) C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DCSYSLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::Writer, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DCSYSLOG_EVERY_N(n, LEVEL, ...)\ + if (ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DCSYSLOG_AFTER_N(n, LEVEL, ...)\ + if (ELPP_DEBUG_LOG) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DCSYSLOG_N_TIMES(n, LEVEL, ...)\ + if (ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DSYSLOG(LEVEL) DCSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId) +# define DSYSLOG_IF(condition, LEVEL) DCSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId) +# define DSYSLOG_EVERY_N(n, LEVEL) DCSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define DSYSLOG_AFTER_N(n, LEVEL) DCSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define DSYSLOG_N_TIMES(n, LEVEL) DCSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId) +#else +# define CSYSLOG(LEVEL, ...) el::base::NullWriter() +# define CSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter() +# define CSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter() +# define CSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter() +# define CSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter() +# define SYSLOG(LEVEL) el::base::NullWriter() +# define SYSLOG_IF(condition, LEVEL) el::base::NullWriter() +# define SYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter() +# define SYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter() +# define SYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter() +# define DCSYSLOG(LEVEL, ...) el::base::NullWriter() +# define DCSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter() +# define DCSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter() +# define DCSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter() +# define DCSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter() +# define DSYSLOG(LEVEL) el::base::NullWriter() +# define DSYSLOG_IF(condition, LEVEL) el::base::NullWriter() +# define DSYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter() +# define DSYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter() +# define DSYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter() +#endif // defined(ELPP_SYSLOG) + // + // Custom Debug Only Loggers - Requires (level, loggerId/s) + // + // undef existing +#undef DCLOG +#undef DCVLOG +#undef DCLOG_IF +#undef DCVLOG_IF +#undef DCLOG_EVERY_N +#undef DCVLOG_EVERY_N +#undef DCLOG_AFTER_N +#undef DCVLOG_AFTER_N +#undef DCLOG_N_TIMES +#undef DCVLOG_N_TIMES + // Normal logs +#define DCLOG(LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG(LEVEL, __VA_ARGS__) +#define DCLOG_VERBOSE(vlevel, ...) if (ELPP_DEBUG_LOG) CLOG_VERBOSE(vlevel, __VA_ARGS__) +#define DCVLOG(vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__) + // Conditional logs +#define DCLOG_IF(condition, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_IF(condition, LEVEL, __VA_ARGS__) +#define DCVLOG_IF(condition, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_IF(condition, vlevel, __VA_ARGS__) + // Hit counts based logs +#define DCLOG_EVERY_N(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_EVERY_N(n, LEVEL, __VA_ARGS__) +#define DCVLOG_EVERY_N(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_EVERY_N(n, vlevel, __VA_ARGS__) +#define DCLOG_AFTER_N(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_AFTER_N(n, LEVEL, __VA_ARGS__) +#define DCVLOG_AFTER_N(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_AFTER_N(n, vlevel, __VA_ARGS__) +#define DCLOG_N_TIMES(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_N_TIMES(n, LEVEL, __VA_ARGS__) +#define DCVLOG_N_TIMES(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_N_TIMES(n, vlevel, __VA_ARGS__) + // + // Default Debug Only Loggers macro using CLOG(), CLOG_VERBOSE() and CVLOG() macros + // + // undef existing +#undef DLOG +#undef DVLOG +#undef DLOG_IF +#undef DVLOG_IF +#undef DLOG_EVERY_N +#undef DVLOG_EVERY_N +#undef DLOG_AFTER_N +#undef DVLOG_AFTER_N +#undef DLOG_N_TIMES +#undef DVLOG_N_TIMES + // Normal logs +#define DLOG(LEVEL) DCLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG(vlevel) DCVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID) + // Conditional logs +#define DLOG_IF(condition, LEVEL) DCLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG_IF(condition, vlevel) DCVLOG_IF(condition, vlevel, ELPP_CURR_FILE_LOGGER_ID) + // Hit counts based logs +#define DLOG_EVERY_N(n, LEVEL) DCLOG_EVERY_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG_EVERY_N(n, vlevel) DCVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +#define DLOG_AFTER_N(n, LEVEL) DCLOG_AFTER_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG_AFTER_N(n, vlevel) DCVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +#define DLOG_N_TIMES(n, LEVEL) DCLOG_N_TIMES(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG_N_TIMES(n, vlevel) DCVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) + // Check macros +#undef CCHECK +#undef CPCHECK +#undef CCHECK_EQ +#undef CCHECK_NE +#undef CCHECK_LT +#undef CCHECK_GT +#undef CCHECK_LE +#undef CCHECK_GE +#undef CCHECK_BOUNDS +#undef CCHECK_NOTNULL +#undef CCHECK_STRCASEEQ +#undef CCHECK_STRCASENE +#undef CHECK +#undef PCHECK +#undef CHECK_EQ +#undef CHECK_NE +#undef CHECK_LT +#undef CHECK_GT +#undef CHECK_LE +#undef CHECK_GE +#undef CHECK_BOUNDS +#undef CHECK_NOTNULL +#undef CHECK_STRCASEEQ +#undef CHECK_STRCASENE +#define CCHECK(condition, ...) CLOG_IF(!(condition), FATAL, __VA_ARGS__) << "Check failed: [" << #condition << "] " +#define CPCHECK(condition, ...) CPLOG_IF(!(condition), FATAL, __VA_ARGS__) << "Check failed: [" << #condition << "] " +#define CHECK(condition) CCHECK(condition, ELPP_CURR_FILE_LOGGER_ID) +#define PCHECK(condition) CPCHECK(condition, ELPP_CURR_FILE_LOGGER_ID) +#define CCHECK_EQ(a, b, ...) CCHECK(a == b, __VA_ARGS__) +#define CCHECK_NE(a, b, ...) CCHECK(a != b, __VA_ARGS__) +#define CCHECK_LT(a, b, ...) CCHECK(a < b, __VA_ARGS__) +#define CCHECK_GT(a, b, ...) CCHECK(a > b, __VA_ARGS__) +#define CCHECK_LE(a, b, ...) CCHECK(a <= b, __VA_ARGS__) +#define CCHECK_GE(a, b, ...) CCHECK(a >= b, __VA_ARGS__) +#define CCHECK_BOUNDS(val, min, max, ...) CCHECK(val >= min && val <= max, __VA_ARGS__) +#define CHECK_EQ(a, b) CCHECK_EQ(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_NE(a, b) CCHECK_NE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_LT(a, b) CCHECK_LT(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_GT(a, b) CCHECK_GT(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_LE(a, b) CCHECK_LE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_GE(a, b) CCHECK_GE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_BOUNDS(val, min, max) CCHECK_BOUNDS(val, min, max, ELPP_CURR_FILE_LOGGER_ID) +namespace el { + namespace base { + namespace utils { + template + static T* checkNotNull(T* ptr, const char* name, const char* loggers, ...) { + CLOG_IF(ptr == nullptr, FATAL, loggers) << "Check failed: [" << name << " != nullptr]"; + return ptr; + } + } // namespace utils + } // namespace base +} // namespace el +#define CCHECK_NOTNULL(ptr, ...) el::base::utils::checkNotNull(ptr, #ptr, __VA_ARGS__) +#define CCHECK_STREQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \ + << "Check failed: [" << #str1 << " == " << #str2 << "] " +#define CCHECK_STRNE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \ + << "Check failed: [" << #str1 << " != " << #str2 << "] " +#define CCHECK_STRCASEEQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \ + << "Check failed: [" << #str1 << " == " << #str2 << "] " +#define CCHECK_STRCASENE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \ + << "Check failed: [" << #str1 << " != " << #str2 << "] " +#define CHECK_NOTNULL(ptr) CCHECK_NOTNULL(ptr, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_STREQ(str1, str2) CCHECK_STREQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_STRNE(str1, str2) CCHECK_STRNE(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_STRCASEEQ(str1, str2) CCHECK_STRCASEEQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_STRCASENE(str1, str2) CCHECK_STRCASENE(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#undef DCCHECK +#undef DCCHECK_EQ +#undef DCCHECK_NE +#undef DCCHECK_LT +#undef DCCHECK_GT +#undef DCCHECK_LE +#undef DCCHECK_GE +#undef DCCHECK_BOUNDS +#undef DCCHECK_NOTNULL +#undef DCCHECK_STRCASEEQ +#undef DCCHECK_STRCASENE +#undef DCPCHECK +#undef DCHECK +#undef DCHECK_EQ +#undef DCHECK_NE +#undef DCHECK_LT +#undef DCHECK_GT +#undef DCHECK_LE +#undef DCHECK_GE +#undef DCHECK_BOUNDS_ +#undef DCHECK_NOTNULL +#undef DCHECK_STRCASEEQ +#undef DCHECK_STRCASENE +#undef DPCHECK +#define DCCHECK(condition, ...) if (ELPP_DEBUG_LOG) CCHECK(condition, __VA_ARGS__) +#define DCCHECK_EQ(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_EQ(a, b, __VA_ARGS__) +#define DCCHECK_NE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_NE(a, b, __VA_ARGS__) +#define DCCHECK_LT(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_LT(a, b, __VA_ARGS__) +#define DCCHECK_GT(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_GT(a, b, __VA_ARGS__) +#define DCCHECK_LE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_LE(a, b, __VA_ARGS__) +#define DCCHECK_GE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_GE(a, b, __VA_ARGS__) +#define DCCHECK_BOUNDS(val, min, max, ...) if (ELPP_DEBUG_LOG) CCHECK_BOUNDS(val, min, max, __VA_ARGS__) +#define DCCHECK_NOTNULL(ptr, ...) if (ELPP_DEBUG_LOG) CCHECK_NOTNULL(ptr, __VA_ARGS__) +#define DCCHECK_STREQ(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STREQ(str1, str2, __VA_ARGS__) +#define DCCHECK_STRNE(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRNE(str1, str2, __VA_ARGS__) +#define DCCHECK_STRCASEEQ(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRCASEEQ(str1, str2, __VA_ARGS__) +#define DCCHECK_STRCASENE(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRCASENE(str1, str2, __VA_ARGS__) +#define DCPCHECK(condition, ...) if (ELPP_DEBUG_LOG) CPCHECK(condition, __VA_ARGS__) +#define DCHECK(condition) DCCHECK(condition, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_EQ(a, b) DCCHECK_EQ(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_NE(a, b) DCCHECK_NE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_LT(a, b) DCCHECK_LT(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_GT(a, b) DCCHECK_GT(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_LE(a, b) DCCHECK_LE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_GE(a, b) DCCHECK_GE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_BOUNDS(val, min, max) DCCHECK_BOUNDS(val, min, max, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_NOTNULL(ptr) DCCHECK_NOTNULL(ptr, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_STREQ(str1, str2) DCCHECK_STREQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_STRNE(str1, str2) DCCHECK_STRNE(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_STRCASEEQ(str1, str2) DCCHECK_STRCASEEQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_STRCASENE(str1, str2) DCCHECK_STRCASENE(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define DPCHECK(condition) DCPCHECK(condition, ELPP_CURR_FILE_LOGGER_ID) +#if defined(ELPP_DISABLE_DEFAULT_CRASH_HANDLING) +# define ELPP_USE_DEF_CRASH_HANDLER false +#else +# define ELPP_USE_DEF_CRASH_HANDLER true +#endif // defined(ELPP_DISABLE_DEFAULT_CRASH_HANDLING) +#define ELPP_CRASH_HANDLER_INIT +#define ELPP_INIT_EASYLOGGINGPP(val)\ + ELPP_INITI_BASIC_DECLR\ + namespace el {\ + namespace base {\ + el::base::type::StoragePointer elStorage(val);\ + }\ + el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\ + } + +#if ELPP_ASYNC_LOGGING +# define INITIALIZE_EASYLOGGINGPP\ + ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder()),\ + new el::base::AsyncDispatchWorker()))\ + +#else +# define INITIALIZE_EASYLOGGINGPP\ + ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder()))) +#endif // ELPP_ASYNC_LOGGING +#define INITIALIZE_NULL_EASYLOGGINGPP\ + ELPP_INITI_BASIC_DECLR\ + namespace el {\ + namespace base {\ + el::base::type::StoragePointer elStorage;\ + }\ + el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\ + } + // NOTE: no ELPP_INITI_BASIC_DECLR when sharing - causes double free corruption on external symbols +#define SHARE_EASYLOGGINGPP(initializedStorage)\ + namespace el {\ + namespace base {\ + el::base::type::StoragePointer elStorage(initializedStorage);\ + }\ + el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\ + } + +#if defined(ELPP_UNICODE) +# define START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv); std::locale::global(std::locale("")) +#else +# define START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv) +#endif // defined(ELPP_UNICODE) +#endif // EASYLOGGINGPP_H \ No newline at end of file diff --git a/extensions/common/glm/CMakeLists.txt b/extensions/common/glm/CMakeLists.txt new file mode 100644 index 0000000000..fe28b5d975 --- /dev/null +++ b/extensions/common/glm/CMakeLists.txt @@ -0,0 +1,43 @@ +set(NAME glm_dummy) + +file(GLOB ROOT_SOURCE *.cpp) +file(GLOB ROOT_INLINE *.inl) +file(GLOB ROOT_HEADER *.hpp) +file(GLOB ROOT_TEXT ../*.txt) +file(GLOB ROOT_NAT ../util/glm.natvis) + +file(GLOB_RECURSE CORE_SOURCE ./detail/*.cpp) +file(GLOB_RECURSE CORE_INLINE ./detail/*.inl) +file(GLOB_RECURSE CORE_HEADER ./detail/*.hpp) + +file(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp) +file(GLOB_RECURSE GTC_INLINE ./gtc/*.inl) +file(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp) + +file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp) +file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl) +file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp) + +source_group("Text Files" FILES ${ROOT_TEXT}) +source_group("Core Files" FILES ${CORE_SOURCE}) +source_group("Core Files" FILES ${CORE_INLINE}) +source_group("Core Files" FILES ${CORE_HEADER}) +source_group("GTC Files" FILES ${GTC_SOURCE}) +source_group("GTC Files" FILES ${GTC_INLINE}) +source_group("GTC Files" FILES ${GTC_HEADER}) +source_group("GTX Files" FILES ${GTX_SOURCE}) +source_group("GTX Files" FILES ${GTX_INLINE}) +source_group("GTX Files" FILES ${GTX_HEADER}) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) + +if(GLM_TEST_ENABLE) + add_executable(${NAME} ${ROOT_TEXT} ${ROOT_NAT} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER}) +endif(GLM_TEST_ENABLE) + +#add_library(glm STATIC glm.cpp) +#add_library(glm_shared SHARED glm.cpp) diff --git a/extensions/common/glm/common.hpp b/extensions/common/glm/common.hpp new file mode 100644 index 0000000000..57beb106a9 --- /dev/null +++ b/extensions/common/glm/common.hpp @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/common.hpp +/// @date 2013-12-24 / 2013-12-24 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "detail/func_common.hpp" diff --git a/extensions/common/glm/detail/_features.hpp b/extensions/common/glm/detail/_features.hpp new file mode 100644 index 0000000000..ce2a35d9c1 --- /dev/null +++ b/extensions/common/glm/detail/_features.hpp @@ -0,0 +1,428 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/detail/_features.hpp +/// @date 2013-02-20 / 2013-02-20 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +// #define GLM_CXX98_EXCEPTIONS +// #define GLM_CXX98_RTTI + +// #define GLM_CXX11_RVALUE_REFERENCES +// Rvalue references - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html + +// GLM_CXX11_TRAILING_RETURN +// Rvalue references for *this - GCC not supported +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm + +// GLM_CXX11_NONSTATIC_MEMBER_INIT +// Initialization of class objects by rvalues - GCC any +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html + +// GLM_CXX11_NONSTATIC_MEMBER_INIT +// Non-static data member initializers - GCC 4.7 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm + +// #define GLM_CXX11_VARIADIC_TEMPLATE +// Variadic templates - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf + +// +// Extending variadic template template parameters - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf + +// #define GLM_CXX11_GENERALIZED_INITIALIZERS +// Initializer lists - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm + +// #define GLM_CXX11_STATIC_ASSERT +// Static assertions - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html + +// #define GLM_CXX11_AUTO_TYPE +// auto-typed variables - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf + +// #define GLM_CXX11_AUTO_TYPE +// Multi-declarator auto - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1737.pdf + +// #define GLM_CXX11_AUTO_TYPE +// Removal of auto as a storage-class specifier - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm + +// #define GLM_CXX11_AUTO_TYPE +// New function declarator syntax - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm + +// #define GLM_CXX11_LAMBDAS +// New wording for C++0x lambdas - GCC 4.5 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf + +// #define GLM_CXX11_DECLTYPE +// Declared type of an expression - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf + +// +// Right angle brackets - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html + +// +// Default template arguments for function templates DR226 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226 + +// +// Solving the SFINAE problem for expressions DR339 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html + +// #define GLM_CXX11_ALIAS_TEMPLATE +// Template aliases N2258 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf + +// +// Extern templates N1987 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm + +// #define GLM_CXX11_NULLPTR +// Null pointer constant N2431 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf + +// #define GLM_CXX11_STRONG_ENUMS +// Strongly-typed enums N2347 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf + +// +// Forward declarations for enums N2764 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf + +// +// Generalized attributes N2761 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf + +// +// Generalized constant expressions N2235 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf + +// +// Alignment support N2341 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf + +// #define GLM_CXX11_DELEGATING_CONSTRUCTORS +// Delegating constructors N1986 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf + +// +// Inheriting constructors N2540 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm + +// #define GLM_CXX11_EXPLICIT_CONVERSIONS +// Explicit conversion operators N2437 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf + +// +// New character types N2249 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html + +// +// Unicode string literals N2442 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm + +// +// Raw string literals N2442 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm + +// +// Universal character name literals N2170 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html + +// #define GLM_CXX11_USER_LITERALS +// User-defined literals N2765 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf + +// +// Standard Layout Types N2342 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm + +// #define GLM_CXX11_DEFAULTED_FUNCTIONS +// #define GLM_CXX11_DELETED_FUNCTIONS +// Defaulted and deleted functions N2346 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm + +// +// Extended friend declarations N1791 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf + +// +// Extending sizeof N2253 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html + +// #define GLM_CXX11_INLINE_NAMESPACES +// Inline namespaces N2535 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm + +// #define GLM_CXX11_UNRESTRICTED_UNIONS +// Unrestricted unions N2544 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf + +// #define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS +// Local and unnamed types as template arguments N2657 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm + +// #define GLM_CXX11_RANGE_FOR +// Range-based for N2930 GCC 4.6 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html + +// #define GLM_CXX11_OVERRIDE_CONTROL +// Explicit virtual overrides N2928 N3206 N3272 GCC 4.7 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm + +// +// Minimal support for garbage collection and reachability-based leak detection N2670 No +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm + +// #define GLM_CXX11_NOEXCEPT +// Allowing move constructors to throw [noexcept] N3050 GCC 4.6 (core language only) +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html + +// +// Defining move special member functions N3053 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html + +// +// Sequence points N2239 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html + +// +// Atomic operations N2427 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html + +// +// Strong Compare and Exchange N2748 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html + +// +// Bidirectional Fences N2752 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm + +// +// Memory model N2429 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm + +// +// Data-dependency ordering: atomics and memory model N2664 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm + +// +// Propagating exceptions N2179 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html + +// +// Abandoning a process and at_quick_exit N2440 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm + +// +// Allow atomics use in signal handlers N2547 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm + +// +// Thread-local storage N2659 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm + +// +// Dynamic initialization and destruction with concurrency N2660 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm + +// +// __func__ predefined identifier N2340 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm + +// +// C99 preprocessor N1653 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm + +// +// long long N1811 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf + +// +// Extended integral types N1988 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf + +#if(GLM_COMPILER & GLM_COMPILER_GCC) + +# if(GLM_COMPILER >= GLM_COMPILER_GCC43) +# define GLM_CXX11_STATIC_ASSERT +# endif + +#elif(GLM_COMPILER & (GLM_COMPILER_APPLE_CLANG | GLM_COMPILER_LLVM)) +# if(__has_feature(cxx_exceptions)) +# define GLM_CXX98_EXCEPTIONS +# endif + +# if(__has_feature(cxx_rtti)) +# define GLM_CXX98_RTTI +# endif + +# if(__has_feature(cxx_access_control_sfinae)) +# define GLM_CXX11_ACCESS_CONTROL_SFINAE +# endif + +# if(__has_feature(cxx_alias_templates)) +# define GLM_CXX11_ALIAS_TEMPLATE +# endif + +# if(__has_feature(cxx_alignas)) +# define GLM_CXX11_ALIGNAS +# endif + +# if(__has_feature(cxx_attributes)) +# define GLM_CXX11_ATTRIBUTES +# endif + +# if(__has_feature(cxx_constexpr)) +# define GLM_CXX11_CONSTEXPR +# endif + +# if(__has_feature(cxx_decltype)) +# define GLM_CXX11_DECLTYPE +# endif + +# if(__has_feature(cxx_default_function_template_args)) +# define GLM_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS +# endif + +# if(__has_feature(cxx_defaulted_functions)) +# define GLM_CXX11_DEFAULTED_FUNCTIONS +# endif + +# if(__has_feature(cxx_delegating_constructors)) +# define GLM_CXX11_DELEGATING_CONSTRUCTORS +# endif + +# if(__has_feature(cxx_deleted_functions)) +# define GLM_CXX11_DELETED_FUNCTIONS +# endif + +# if(__has_feature(cxx_explicit_conversions)) +# define GLM_CXX11_EXPLICIT_CONVERSIONS +# endif + +# if(__has_feature(cxx_generalized_initializers)) +# define GLM_CXX11_GENERALIZED_INITIALIZERS +# endif + +# if(__has_feature(cxx_implicit_moves)) +# define GLM_CXX11_IMPLICIT_MOVES +# endif + +# if(__has_feature(cxx_inheriting_constructors)) +# define GLM_CXX11_INHERITING_CONSTRUCTORS +# endif + +# if(__has_feature(cxx_inline_namespaces)) +# define GLM_CXX11_INLINE_NAMESPACES +# endif + +# if(__has_feature(cxx_lambdas)) +# define GLM_CXX11_LAMBDAS +# endif + +# if(__has_feature(cxx_local_type_template_args)) +# define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS +# endif + +# if(__has_feature(cxx_noexcept)) +# define GLM_CXX11_NOEXCEPT +# endif + +# if(__has_feature(cxx_nonstatic_member_init)) +# define GLM_CXX11_NONSTATIC_MEMBER_INIT +# endif + +# if(__has_feature(cxx_nullptr)) +# define GLM_CXX11_NULLPTR +# endif + +# if(__has_feature(cxx_override_control)) +# define GLM_CXX11_OVERRIDE_CONTROL +# endif + +# if(__has_feature(cxx_reference_qualified_functions)) +# define GLM_CXX11_REFERENCE_QUALIFIED_FUNCTIONS +# endif + +# if(__has_feature(cxx_range_for)) +# define GLM_CXX11_RANGE_FOR +# endif + +# if(__has_feature(cxx_raw_string_literals)) +# define GLM_CXX11_RAW_STRING_LITERALS +# endif + +# if(__has_feature(cxx_rvalue_references)) +# define GLM_CXX11_RVALUE_REFERENCES +# endif + +# if(__has_feature(cxx_static_assert)) +# define GLM_CXX11_STATIC_ASSERT +# endif + +# if(__has_feature(cxx_auto_type)) +# define GLM_CXX11_AUTO_TYPE +# endif + +# if(__has_feature(cxx_strong_enums)) +# define GLM_CXX11_STRONG_ENUMS +# endif + +# if(__has_feature(cxx_trailing_return)) +# define GLM_CXX11_TRAILING_RETURN +# endif + +# if(__has_feature(cxx_unicode_literals)) +# define GLM_CXX11_UNICODE_LITERALS +# endif + +# if(__has_feature(cxx_unrestricted_unions)) +# define GLM_CXX11_UNRESTRICTED_UNIONS +# endif + +# if(__has_feature(cxx_user_literals)) +# define GLM_CXX11_USER_LITERALS +# endif + +# if(__has_feature(cxx_variadic_templates)) +# define GLM_CXX11_VARIADIC_TEMPLATES +# endif + +#endif//(GLM_COMPILER & (GLM_COMPILER_APPLE_CLANG | GLM_COMPILER_LLVM)) diff --git a/extensions/common/glm/detail/_fixes.hpp b/extensions/common/glm/detail/_fixes.hpp new file mode 100644 index 0000000000..9728cafb73 --- /dev/null +++ b/extensions/common/glm/detail/_fixes.hpp @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/detail/_fixes.hpp +/// @date 2011-02-21 / 2011-11-22 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#include + +//! Workaround for compatibility with other libraries +#ifdef max +#undef max +#endif + +//! Workaround for compatibility with other libraries +#ifdef min +#undef min +#endif + +//! Workaround for Android +#ifdef isnan +#undef isnan +#endif + +//! Workaround for Android +#ifdef isinf +#undef isinf +#endif + +//! Workaround for Chrone Native Client +#ifdef log2 +#undef log2 +#endif + diff --git a/extensions/common/glm/detail/_noise.hpp b/extensions/common/glm/detail/_noise.hpp new file mode 100644 index 0000000000..296709d4b9 --- /dev/null +++ b/extensions/common/glm/detail/_noise.hpp @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/detail/_noise.hpp +/// @date 2013-12-24 / 2013-12-24 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../common.hpp" + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_QUALIFIER T mod289(T const & x) + { + return x - floor(x * static_cast(1.0) / static_cast(289.0)) * static_cast(289.0); + } + + template + GLM_FUNC_QUALIFIER T permute(T const & x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER tvec2 permute(tvec2 const & x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER tvec3 permute(tvec3 const & x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER tvec4 permute(tvec4 const & x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } +/* + template class vecType> + GLM_FUNC_QUALIFIER vecType permute(vecType const & x) + { + return mod289(((x * T(34)) + T(1)) * x); + } +*/ + template + GLM_FUNC_QUALIFIER T taylorInvSqrt(T const & r) + { + return T(1.79284291400159) - T(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER tvec2 taylorInvSqrt(tvec2 const & r) + { + return T(1.79284291400159) - T(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER tvec3 taylorInvSqrt(tvec3 const & r) + { + return T(1.79284291400159) - T(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER tvec4 taylorInvSqrt(tvec4 const & r) + { + return T(1.79284291400159) - T(0.85373472095314) * r; + } +/* + template class vecType> + GLM_FUNC_QUALIFIER vecType taylorInvSqrt(vecType const & r) + { + return T(1.79284291400159) - T(0.85373472095314) * r; + } +*/ + + template + GLM_FUNC_QUALIFIER tvec2 fade(tvec2 const & t) + { + return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); + } + + template + GLM_FUNC_QUALIFIER tvec3 fade(tvec3 const & t) + { + return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); + } + + template + GLM_FUNC_QUALIFIER tvec4 fade(tvec4 const & t) + { + return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); + } +/* + template class vecType> + GLM_FUNC_QUALIFIER vecType fade(vecType const & t) + { + return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); + } +*/ +}//namespace detail +}//namespace glm + diff --git a/extensions/common/glm/detail/_swizzle.hpp b/extensions/common/glm/detail/_swizzle.hpp new file mode 100644 index 0000000000..04ea55bcf2 --- /dev/null +++ b/extensions/common/glm/detail/_swizzle.hpp @@ -0,0 +1,833 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/detail/_swizzle.hpp +/// @date 2006-04-20 / 2011-02-16 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +namespace glm{ +namespace detail +{ + // Internal class for implementing swizzle operators + template + struct _swizzle_base0 + { + typedef T value_type; + + protected: + GLM_FUNC_QUALIFIER value_type& elem (size_t i) { return (reinterpret_cast(_buffer))[i]; } + GLM_FUNC_QUALIFIER const value_type& elem (size_t i) const { return (reinterpret_cast(_buffer))[i]; } + + // Use an opaque buffer to *ensure* the compiler doesn't call a constructor. + // The size 1 buffer is assumed to aligned to the actual members so that the + // elem() + char _buffer[1]; + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER V operator ()() const { return V(this->elem(E0), this->elem(E1)); } + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER V operator ()() const { return V(this->elem(E0), this->elem(E1), this->elem(E2)); } + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER V operator ()() const { return V(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } + }; + + // Internal class for implementing swizzle operators + /* + Template parameters: + + ValueType = type of scalar values (e.g. float, double) + VecType = class the swizzle is applies to (e.g. tvec3) + N = number of components in the vector (e.g. 3) + E0...3 = what index the n-th element of this swizzle refers to in the unswizzled vec + + DUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used to specialize swizzles + containing duplicate elements so that they cannot be used as r-values). + */ + template + struct _swizzle_base2 : public _swizzle_base1 + { + typedef VecType vec_type; + typedef ValueType value_type; + + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const ValueType& t) + { + for (int i = 0; i < N; ++i) + (*this)[i] = t; + return *this; + } + + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e = t; } + }; + _apply_op(that, op()); + return *this; + } + + GLM_FUNC_QUALIFIER void operator -= (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e -= t; } + }; + _apply_op(that, op()); + } + + GLM_FUNC_QUALIFIER void operator += (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e += t; } + }; + _apply_op(that, op()); + } + + GLM_FUNC_QUALIFIER void operator *= (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e *= t; } + }; + _apply_op(that, op()); + } + + GLM_FUNC_QUALIFIER void operator /= (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e /= t; } + }; + _apply_op(that, op()); + } + + GLM_FUNC_QUALIFIER value_type& operator[] (size_t i) + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + GLM_FUNC_QUALIFIER value_type operator[] (size_t i) const + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + + protected: + template + GLM_FUNC_QUALIFIER void _apply_op(const VecType& that, T op) + { + // Make a copy of the data in this == &that. + // The copier should optimize out the copy in cases where the function is + // properly inlined and the copy is not necessary. + ValueType t[N]; + for (int i = 0; i < N; ++i) + t[i] = that[i]; + for (int i = 0; i < N; ++i) + op( (*this)[i], t[i] ); + } + }; + + // Specialization for swizzles containing duplicate elements. These cannot be modified. + template + struct _swizzle_base2 : public _swizzle_base1 + { + typedef VecType vec_type; + typedef ValueType value_type; + + struct Stub {}; + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (Stub const &) { return *this; } + + GLM_FUNC_QUALIFIER value_type operator[] (size_t i) const + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + }; + + template + struct _swizzle : public _swizzle_base2 + { + typedef _swizzle_base2 base_type; + + using base_type::operator=; + + GLM_FUNC_QUALIFIER operator VecType () const { return (*this)(); } + }; + +// +// To prevent the C++ syntax from getting entirely overwhelming, define some alias macros +// +#define _GLM_SWIZZLE_TEMPLATE1 template +#define _GLM_SWIZZLE_TEMPLATE2 template +#define _GLM_SWIZZLE_TYPE1 _swizzle +#define _GLM_SWIZZLE_TYPE2 _swizzle + +// +// Wrapper for a binary operator (e.g. u.yy + v.zy) +// +#define _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + _GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ + { \ + return a() OPERAND b(); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const V& b) \ + { \ + return a() OPERAND b; \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const V& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } + +// +// Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz) +// +#define _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const T& b) \ + { \ + return a() OPERAND b; \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const T& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } + +// +// Macro for wrapping a function taking one argument (e.g. abs()) +// +#define _GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION) \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a) \ + { \ + return FUNCTION(a()); \ + } + +// +// Macro for wrapping a function taking two vector arguments (e.g. dot()). +// +#define _GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION) \ + _GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename V& b) \ + { \ + return FUNCTION(a(), b); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a, b()); \ + } + +// +// Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g. mix()). +// +#define _GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION) \ + _GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b, const T& c) \ + { \ + return FUNCTION(a(), b(), c); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) \ + { \ + return FUNCTION(a(), b(), c); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b, const T& c)\ + { \ + return FUNCTION(a(), b, c); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) \ + { \ + return FUNCTION(a, b(), c); \ + } + +}//namespace detail +}//namespace glm + +namespace glm +{ + namespace detail + { + _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-) + _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*) + _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+) + _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-) + _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*) + _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/) + } + + // + // Swizzles are distinct types from the unswizzled type. The below macros will + // provide template specializations for the swizzle types for the given functions + // so that the compiler does not have any ambiguity to choosing how to handle + // the function. + // + // The alternative is to use the operator()() when calling the function in order + // to explicitly convert the swizzled type to the unswizzled type. + // + + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, abs); + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acos); + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acosh); + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, all); + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, any); + + //_GLM_SWIZZLE_FUNCTION_2_ARGS(value_type, dot); + //_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, cross); + //_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, step); + //_GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix); +} + +#define _GLM_SWIZZLE2_2_MEMBERS(T, P, V, E0,E1) \ + struct { detail::_swizzle<2, T, P, V, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2, T, P, V, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2, T, P, V, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2, T, P, V, 1,1,-1,-2> E1 ## E1; }; + +#define _GLM_SWIZZLE2_3_MEMBERS(T, P, V, E0,E1) \ + struct { detail::_swizzle<3,T, P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T, P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T, P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T, P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T, P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T, P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T, P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T, P, V, 1,1,1,-1> E1 ## E1 ## E1; }; + +#define _GLM_SWIZZLE2_4_MEMBERS(T, P, V, E0,E1) \ + struct { detail::_swizzle<4,T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; + +#define _GLM_SWIZZLE3_2_MEMBERS(T, P, V, E0,E1,E2) \ + struct { detail::_swizzle<2,T, P, V, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2,T, P, V, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2,T, P, V, 0,2,-1,-2> E0 ## E2; }; \ + struct { detail::_swizzle<2,T, P, V, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2,T, P, V, 1,1,-1,-2> E1 ## E1; }; \ + struct { detail::_swizzle<2,T, P, V, 1,2,-1,-2> E1 ## E2; }; \ + struct { detail::_swizzle<2,T, P, V, 2,0,-1,-2> E2 ## E0; }; \ + struct { detail::_swizzle<2,T, P, V, 2,1,-1,-2> E2 ## E1; }; \ + struct { detail::_swizzle<2,T, P, V, 2,2,-1,-2> E2 ## E2; }; + +#define _GLM_SWIZZLE3_3_MEMBERS(T, P, V ,E0,E1,E2) \ + struct { detail::_swizzle<3,T,P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 2,2,2,-1> E2 ## E2 ## E2; }; + +#define _GLM_SWIZZLE3_4_MEMBERS(T, P, V, E0,E1,E2) \ + struct { detail::_swizzle<4,T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, P, V, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; + +#define _GLM_SWIZZLE4_2_MEMBERS(T, P, V, E0,E1,E2,E3) \ + struct { detail::_swizzle<2,T, P, V, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2,T, P, V, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2,T, P, V, 0,2,-1,-2> E0 ## E2; }; \ + struct { detail::_swizzle<2,T, P, V, 0,3,-1,-2> E0 ## E3; }; \ + struct { detail::_swizzle<2,T, P, V, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2,T, P, V, 1,1,-1,-2> E1 ## E1; }; \ + struct { detail::_swizzle<2,T, P, V, 1,2,-1,-2> E1 ## E2; }; \ + struct { detail::_swizzle<2,T, P, V, 1,3,-1,-2> E1 ## E3; }; \ + struct { detail::_swizzle<2,T, P, V, 2,0,-1,-2> E2 ## E0; }; \ + struct { detail::_swizzle<2,T, P, V, 2,1,-1,-2> E2 ## E1; }; \ + struct { detail::_swizzle<2,T, P, V, 2,2,-1,-2> E2 ## E2; }; \ + struct { detail::_swizzle<2,T, P, V, 2,3,-1,-2> E2 ## E3; }; \ + struct { detail::_swizzle<2,T, P, V, 3,0,-1,-2> E3 ## E0; }; \ + struct { detail::_swizzle<2,T, P, V, 3,1,-1,-2> E3 ## E1; }; \ + struct { detail::_swizzle<2,T, P, V, 3,2,-1,-2> E3 ## E2; }; \ + struct { detail::_swizzle<2,T, P, V, 3,3,-1,-2> E3 ## E3; }; + +#define _GLM_SWIZZLE4_3_MEMBERS(T,P, V, E0,E1,E2,E3) \ + struct { detail::_swizzle<3,T,P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 0,0,3,-1> E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 0,1,3,-1> E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 0,2,3,-1> E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 0,3,0,-1> E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 0,3,1,-1> E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 0,3,2,-1> E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 0,3,3,-1> E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 1,0,3,-1> E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 1,1,3,-1> E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 1,2,3,-1> E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 1,3,0,-1> E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 1,3,1,-1> E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 1,3,2,-1> E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 1,3,3,-1> E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 2,0,3,-1> E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 2,1,3,-1> E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 2,2,2,-1> E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 2,2,3,-1> E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 2,3,0,-1> E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 2,3,1,-1> E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 2,3,2,-1> E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 2,3,3,-1> E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 3,0,0,-1> E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 3,0,1,-1> E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 3,0,2,-1> E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 3,0,3,-1> E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 3,1,0,-1> E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 3,1,1,-1> E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 3,1,2,-1> E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 3,1,3,-1> E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 3,2,0,-1> E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 3,2,1,-1> E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 3,2,2,-1> E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 3,2,3,-1> E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<3,T,P, V, 3,3,0,-1> E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<3,T,P, V, 3,3,1,-1> E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<3,T,P, V, 3,3,2,-1> E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<3,T,P, V, 3,3,3,-1> E3 ## E3 ## E3; }; + +#define _GLM_SWIZZLE4_4_MEMBERS(T, P, V, E0,E1,E2,E3) \ + struct { detail::_swizzle<4, T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,0,3> E0 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,1,3> E0 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,2,3> E0 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,3,0> E0 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,3,1> E0 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,3,2> E0 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,0,3,3> E0 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,0,3> E0 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,1,3> E0 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,2,3> E0 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,3,0> E0 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,3,1> E0 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,3,2> E0 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,1,3,3> E0 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,0,3> E0 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,1,3> E0 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,2,3> E0 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,3,0> E0 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,3,1> E0 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,3,2> E0 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,2,3,3> E0 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,0,0> E0 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,0,1> E0 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,0,2> E0 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,0,3> E0 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,1,0> E0 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,1,1> E0 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,1,2> E0 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,1,3> E0 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,2,0> E0 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,2,1> E0 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,2,2> E0 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,2,3> E0 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,3,0> E0 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,3,1> E0 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,3,2> E0 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 0,3,3,3> E0 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,0,3> E1 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,1,3> E1 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,2,3> E1 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,3,0> E1 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,3,1> E1 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,3,2> E1 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,0,3,3> E1 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,0,3> E1 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,1,3> E1 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,2,3> E1 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,3,0> E1 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,3,1> E1 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,3,2> E1 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,1,3,3> E1 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,0,3> E1 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,1,3> E1 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,2,3> E1 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,3,0> E1 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,3,1> E1 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,3,2> E1 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,2,3,3> E1 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,0,0> E1 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,0,1> E1 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,0,2> E1 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,0,3> E1 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,1,0> E1 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,1,1> E1 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,1,2> E1 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,1,3> E1 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,2,0> E1 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,2,1> E1 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,2,2> E1 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,2,3> E1 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,3,0> E1 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,3,1> E1 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,3,2> E1 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 1,3,3,3> E1 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,0,3> E2 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,1,3> E2 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,2,3> E2 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,3,0> E2 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,3,1> E2 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,3,2> E2 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,0,3,3> E2 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,0,3> E2 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,1,3> E2 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,2,3> E2 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,3,0> E2 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,3,1> E2 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,3,2> E2 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,1,3,3> E2 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,0,3> E2 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,1,3> E2 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,2,3> E2 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,3,0> E2 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,3,1> E2 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,3,2> E2 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,2,3,3> E2 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,0,0> E2 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,0,1> E2 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,0,2> E2 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,0,3> E2 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,1,0> E2 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,1,1> E2 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,1,2> E2 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,1,3> E2 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,2,0> E2 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,2,1> E2 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,2,2> E2 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,2,3> E2 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,3,0> E2 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,3,1> E2 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,3,2> E2 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 2,3,3,3> E2 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,0,0> E3 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,0,1> E3 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,0,2> E3 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,0,3> E3 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,1,0> E3 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,1,1> E3 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,1,2> E3 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,1,3> E3 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,2,0> E3 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,2,1> E3 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,2,2> E3 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,2,3> E3 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,3,0> E3 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,3,1> E3 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,3,2> E3 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,0,3,3> E3 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,0,0> E3 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,0,1> E3 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,0,2> E3 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,0,3> E3 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,1,0> E3 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,1,1> E3 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,1,2> E3 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,1,3> E3 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,2,0> E3 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,2,1> E3 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,2,2> E3 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,2,3> E3 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,3,0> E3 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,3,1> E3 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,3,2> E3 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,1,3,3> E3 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,0,0> E3 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,0,1> E3 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,0,2> E3 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,0,3> E3 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,1,0> E3 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,1,1> E3 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,1,2> E3 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,1,3> E3 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,2,0> E3 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,2,1> E3 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,2,2> E3 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,2,3> E3 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,3,0> E3 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,3,1> E3 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,3,2> E3 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,2,3,3> E3 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,0,0> E3 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,0,1> E3 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,0,2> E3 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,0,3> E3 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,1,0> E3 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,1,1> E3 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,1,2> E3 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,1,3> E3 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,2,0> E3 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,2,1> E3 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,2,2> E3 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,2,3> E3 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,3,0> E3 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,3,1> E3 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,3,2> E3 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, P, V, 3,3,3,3> E3 ## E3 ## E3 ## E3; }; diff --git a/extensions/common/glm/detail/_swizzle_func.hpp b/extensions/common/glm/detail/_swizzle_func.hpp new file mode 100644 index 0000000000..4dbb783c5b --- /dev/null +++ b/extensions/common/glm/detail/_swizzle_func.hpp @@ -0,0 +1,725 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/detail/_swizzle_func.hpp +/// @date 2011-10-16 / 2011-10-16 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ + SWIZZLED_TYPE A ## B() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ + SWIZZLED_TYPE A ## B ## C() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B, this->C); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ + SWIZZLED_TYPE A ## B ## C ## D() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B, this->C, this->D); \ + } + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ + template \ + SWIZZLED_TYPE CLASS_TYPE::A ## B() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ + template \ + SWIZZLED_TYPE CLASS_TYPE::A ## B ## C() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B, this->C); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ + template \ + SWIZZLED_TYPE CLASS_TYPE::A ## B ## C ## D() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B, this->C, this->D); \ + } + +#define GLM_MUTABLE + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, x, y) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, r, g) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, s, t) + +//GLM_SWIZZLE_GEN_REF_FROM_VEC2(valType, detail::vec2, detail::ref2) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, x, y, z) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, r, g, b) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, s, t, p) + +//GLM_SWIZZLE_GEN_REF_FROM_VEC3(valType, detail::vec3, detail::ref2, detail::ref3) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, C) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B) + +#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p, q) + +//GLM_SWIZZLE_GEN_REF_FROM_VEC4(valType, detail::vec4, detail::ref2, detail::ref3, detail::ref4) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t) + +//GLM_SWIZZLE_GEN_VEC_FROM_VEC2(valType, detail::vec2, detail::vec2, detail::vec3, detail::vec4) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p) + +//GLM_SWIZZLE_GEN_VEC_FROM_VEC3(valType, detail::vec3, detail::vec2, detail::vec3, detail::vec4) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p, q) + +//GLM_SWIZZLE_GEN_VEC_FROM_VEC4(valType, detail::vec4, detail::vec2, detail::vec3, detail::vec4) diff --git a/extensions/common/glm/detail/_vectorize.hpp b/extensions/common/glm/detail/_vectorize.hpp new file mode 100644 index 0000000000..1deff1e080 --- /dev/null +++ b/extensions/common/glm/detail/_vectorize.hpp @@ -0,0 +1,160 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/detail/_vectorize.hpp +/// @date 2011-10-14 / 2011-10-14 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "type_vec1.hpp" +#include "type_vec2.hpp" +#include "type_vec3.hpp" +#include "type_vec4.hpp" + +namespace glm{ +namespace detail +{ + template class vecType> + struct functor1{}; + + template + struct functor1 + { + GLM_FUNC_QUALIFIER static tvec1 call(R (*Func) (T x), tvec1 const & v) + { + return tvec1(Func(v.x)); + } + }; + + template + struct functor1 + { + GLM_FUNC_QUALIFIER static tvec2 call(R (*Func) (T x), tvec2 const & v) + { + return tvec2(Func(v.x), Func(v.y)); + } + }; + + template + struct functor1 + { + GLM_FUNC_QUALIFIER static tvec3 call(R (*Func) (T x), tvec3 const & v) + { + return tvec3(Func(v.x), Func(v.y), Func(v.z)); + } + }; + + template + struct functor1 + { + GLM_FUNC_QUALIFIER static tvec4 call(R (*Func) (T x), tvec4 const & v) + { + return tvec4(Func(v.x), Func(v.y), Func(v.z), Func(v.w)); + } + }; + + template class vecType> + struct functor2{}; + + template + struct functor2 + { + GLM_FUNC_QUALIFIER static tvec1 call(T (*Func) (T x, T y), tvec1 const & a, tvec1 const & b) + { + return tvec1(Func(a.x, b.x)); + } + }; + + template + struct functor2 + { + GLM_FUNC_QUALIFIER static tvec2 call(T (*Func) (T x, T y), tvec2 const & a, tvec2 const & b) + { + return tvec2(Func(a.x, b.x), Func(a.y, b.y)); + } + }; + + template + struct functor2 + { + GLM_FUNC_QUALIFIER static tvec3 call(T (*Func) (T x, T y), tvec3 const & a, tvec3 const & b) + { + return tvec3(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); + } + }; + + template + struct functor2 + { + GLM_FUNC_QUALIFIER static tvec4 call(T (*Func) (T x, T y), tvec4 const & a, tvec4 const & b) + { + return tvec4(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); + } + }; + + template class vecType> + struct functor2_vec_sca{}; + + template + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static tvec1 call(T (*Func) (T x, T y), tvec1 const & a, T b) + { + return tvec1(Func(a.x, b)); + } + }; + + template + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static tvec2 call(T (*Func) (T x, T y), tvec2 const & a, T b) + { + return tvec2(Func(a.x, b), Func(a.y, b)); + } + }; + + template + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static tvec3 call(T (*Func) (T x, T y), tvec3 const & a, T b) + { + return tvec3(Func(a.x, b), Func(a.y, b), Func(a.z, b)); + } + }; + + template + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static tvec4 call(T (*Func) (T x, T y), tvec4 const & a, T b) + { + return tvec4(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b)); + } + }; +}//namespace detail +}//namespace glm diff --git a/extensions/common/glm/detail/dummy.cpp b/extensions/common/glm/detail/dummy.cpp new file mode 100644 index 0000000000..88d8f3b807 --- /dev/null +++ b/extensions/common/glm/detail/dummy.cpp @@ -0,0 +1,232 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/core/dummy.cpp +/// @date 2011-01-19 / 2011-06-15 +/// @author Christophe Riccio +/// +/// GLM is a header only library. There is nothing to compile. +/// dummy.cpp exist only a wordaround for CMake file. +/////////////////////////////////////////////////////////////////////////////////// + +#define GLM_MESSAGES +#include +#include +#include + +struct material +{ + glm::vec4 emission; // Ecm + glm::vec4 ambient; // Acm + glm::vec4 diffuse; // Dcm + glm::vec4 specular; // Scm + float shininess; // Srm +}; + +struct light +{ + glm::vec4 ambient; // Acli + glm::vec4 diffuse; // Dcli + glm::vec4 specular; // Scli + glm::vec4 position; // Ppli + glm::vec4 halfVector; // Derived: Hi + glm::vec3 spotDirection; // Sdli + float spotExponent; // Srli + float spotCutoff; // Crli + // (range: [0.0,90.0], 180.0) + float spotCosCutoff; // Derived: cos(Crli) + // (range: [1.0,0.0],-1.0) + float constantAttenuation; // K0 + float linearAttenuation; // K1 + float quadraticAttenuation;// K2 +}; + + +// Sample 1 +#include // glm::vec3 +#include // glm::cross, glm::normalize + +glm::vec3 computeNormal +( + glm::vec3 const & a, + glm::vec3 const & b, + glm::vec3 const & c +) +{ + return glm::normalize(glm::cross(c - a, b - a)); +} + +typedef unsigned int GLuint; +#define GL_FALSE 0 +void glUniformMatrix4fv(GLuint, int, int, float*){} + +// Sample 2 +#include // glm::vec3 +#include // glm::vec4, glm::ivec4 +#include // glm::mat4 +#include // glm::translate, glm::rotate, glm::scale, glm::perspective +#include // glm::value_ptr +void func(GLuint LocationMVP, float Translate, glm::vec2 const & Rotate) +{ + glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); + glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate)); + glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f)); + glm::mat4 View = glm::rotate(ViewRotateX, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f)); + glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f)); + glm::mat4 MVP = Projection * View * Model; + glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP)); +} + +// Sample 3 +#include // glm::vec2 +#include // glm::packUnorm2x16 +#include // glm::uint +#include // glm::i8vec2, glm::i32vec2 +std::size_t const VertexCount = 4; +// Float quad geometry +std::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2); +glm::vec2 const PositionDataF32[VertexCount] = +{ + glm::vec2(-1.0f,-1.0f), + glm::vec2( 1.0f,-1.0f), + glm::vec2( 1.0f, 1.0f), + glm::vec2(-1.0f, 1.0f) + }; +// Half-float quad geometry +std::size_t const PositionSizeF16 = VertexCount * sizeof(glm::uint); +glm::uint const PositionDataF16[VertexCount] = +{ + glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, -1.0f))), + glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, -1.0f))), + glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, 1.0f))), + glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, 1.0f))) +}; +// 8 bits signed integer quad geometry +std::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2); +glm::i8vec2 const PositionDataI8[VertexCount] = +{ + glm::i8vec2(-1,-1), + glm::i8vec2( 1,-1), + glm::i8vec2( 1, 1), + glm::i8vec2(-1, 1) +}; +// 32 bits signed integer quad geometry +std::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2); +glm::i32vec2 const PositionDataI32[VertexCount] = +{ + glm::i32vec2 (-1,-1), + glm::i32vec2 ( 1,-1), + glm::i32vec2 ( 1, 1), + glm::i32vec2 (-1, 1) +}; + +struct intersection +{ + glm::vec4 position; + glm::vec3 normal; +}; + +/* +// Sample 4 +#include // glm::vec3 +#include // glm::normalize, glm::dot, glm::reflect +#include // glm::pow +#include // glm::vecRand3 +glm::vec3 lighting +( + intersection const & Intersection, + material const & Material, + light const & Light, + glm::vec3 const & View +) +{ + glm::vec3 Color(0.0f); + glm::vec3 LightVertor(glm::normalize( + Light.position - Intersection.position + + glm::vecRand3(0.0f, Light.inaccuracy)); + + if(!shadow(Intersection.position, Light.position, LightVertor)) + { + float Diffuse = glm::dot(Intersection.normal, LightVector); + if(Diffuse <= 0.0f) + return Color; + if(Material.isDiffuse()) + Color += Light.color() * Material.diffuse * Diffuse; + if(Material.isSpecular()) + { + glm::vec3 Reflect(glm::reflect( + glm::normalize(-LightVector), + glm::normalize(Intersection.normal))); + float Dot = glm::dot(Reflect, View); + float Base = Dot > 0.0f ? Dot : 0.0f; + float Specular = glm::pow(Base, Material.exponent); + Color += Material.specular * Specular; + } + } + return Color; +} +*/ + + +template class vecType> +T normalizeDotA(vecType const & x, vecType const & y) +{ + return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); +} + +#define GLM_TEMPLATE_GENTYPE typename T, glm::precision P, template class + +template +T normalizeDotB(vecType const & x, vecType const & y) +{ + return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); +} + +template +typename vecType::value_type normalizeDotC(vecType const & a, vecType const & b) +{ + return glm::dot(a, b) * glm::inversesqrt(glm::dot(a, a) * glm::dot(b, b)); +} + +int main() +{ + glm::vec1 o(1); + glm::vec2 a(1); + glm::vec3 b(1); + glm::vec4 c(1); + + glm::quat q; + glm::dualquat p; + + glm::mat4 m(1); + + float a0 = normalizeDotA(a, a); + float b0 = normalizeDotB(b, b); + float c0 = normalizeDotC(c, c); + + return 0; +} diff --git a/extensions/common/glm/detail/func_common.hpp b/extensions/common/glm/detail/func_common.hpp new file mode 100644 index 0000000000..da28007b05 --- /dev/null +++ b/extensions/common/glm/detail/func_common.hpp @@ -0,0 +1,456 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @ref core +/// @file glm/detail/func_common.hpp +/// @date 2008-03-08 / 2010-01-26 +/// @author Christophe Riccio +/// +/// @see
GLSL 4.20.8 specification, section 8.3 Common Functions +/// +/// @defgroup core_func_common Common functions +/// @ingroup core +/// +/// These all operate component-wise. The description is per component. +/////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "setup.hpp" +#include "precision.hpp" +#include "type_int.hpp" +#include "_fixes.hpp" + +namespace glm +{ + /// @addtogroup core_func_common + /// @{ + + /// Returns x if x >= 0; otherwise, it returns -x. + /// + /// @tparam genType floating-point or signed integer; scalar or vector types. + /// + /// @see GLSL abs man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType abs(genType x); + + template class vecType> + GLM_FUNC_DECL vecType abs(vecType const & x); + + /// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. + /// + /// @tparam genType Floating-point or signed integer; scalar or vector types. + /// + /// @see GLSL sign man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template class vecType> + GLM_FUNC_DECL vecType sign(vecType const & x); + + /// Returns a value equal to the nearest integer that is less then or equal to x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL floor man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template class vecType> + GLM_FUNC_DECL vecType floor(vecType const & x); + + /// Returns a value equal to the nearest integer to x + /// whose absolute value is not larger than the absolute value of x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL trunc man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template class vecType> + GLM_FUNC_DECL vecType trunc(vecType const & x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// This includes the possibility that round(x) returns the + /// same value as roundEven(x) for all values of x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL round man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template class vecType> + GLM_FUNC_DECL vecType round(vecType const & x); + + /// Returns a value equal to the nearest integer to x. + /// A fractional part of 0.5 will round toward the nearest even + /// integer. (Both 3.5 and 4.5 for x will return 4.0.) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL roundEven man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + /// @see New round to even technique + template class vecType> + GLM_FUNC_DECL vecType roundEven(vecType const & x); + + /// Returns a value equal to the nearest integer + /// that is greater than or equal to x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL ceil man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template class vecType> + GLM_FUNC_DECL vecType ceil(vecType const & x); + + /// Return x - floor(x). + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL fract man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType fract(genType x); + + template class vecType> + GLM_FUNC_DECL vecType fract(vecType const & x); + + /// Modulus. Returns x - y * floor(x / y) + /// for each component in x using the floating point value y. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL mod man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType mod(genType x, genType y); + + template class vecType> + GLM_FUNC_DECL vecType mod(vecType const & x, T y); + + template class vecType> + GLM_FUNC_DECL vecType mod(vecType const & x, vecType const & y); + + /// Returns the fractional part of x and sets i to the integer + /// part (as a whole number floating point value). Both the + /// return value and the output parameter will have the same + /// sign as x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL modf man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType modf(genType x, genType & i); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL min man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType min(genType x, genType y); + + template class vecType> + GLM_FUNC_DECL vecType min(vecType const & x, T y); + + template class vecType> + GLM_FUNC_DECL vecType min(vecType const & x, vecType const & y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL max man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType max(genType x, genType y); + + template class vecType> + GLM_FUNC_DECL vecType max(vecType const & x, T y); + + template class vecType> + GLM_FUNC_DECL vecType max(vecType const & x, vecType const & y); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL clamp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType clamp(genType x, genType minVal, genType maxVal); + + template class vecType> + GLM_FUNC_DECL vecType clamp(vecType const & x, T minVal, T maxVal); + + template class vecType> + GLM_FUNC_DECL vecType clamp(vecType const & x, vecType const & minVal, vecType const & maxVal); + + /// If genTypeU is a floating scalar or vector: + /// Returns x * (1.0 - a) + y * a, i.e., the linear blend of + /// x and y using the floating-point value a. + /// The value for a is not restricted to the range [0, 1]. + /// + /// If genTypeU is a boolean scalar or vector: + /// Selects which vector each returned component comes + /// from. For a component of that is false, the + /// corresponding component of x is returned. For a + /// component of a that is true, the corresponding + /// component of y is returned. Components of x and y that + /// are not selected are allowed to be invalid floating point + /// values and will have no effect on the results. Thus, this + /// provides different functionality than + /// genType mix(genType x, genType y, genType(a)) + /// where a is a Boolean vector. + /// + /// @see GLSL mix man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + /// + /// @param[in] x Value to interpolate. + /// @param[in] y Value to interpolate. + /// @param[in] a Interpolant. + /// + /// @tparam genTypeT Floating point scalar or vector. + /// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT. + /// + /// @code + /// #include + /// ... + /// float a; + /// bool b; + /// glm::dvec3 e; + /// glm::dvec3 f; + /// glm::vec4 g; + /// glm::vec4 h; + /// ... + /// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar two vectors. + /// glm::vec4 s = glm::mix(g, h, b); // Teturns g or h; + /// glm::dvec3 t = glm::mix(e, f, a); // Types of the third parameter is not required to match with the first and the second. + /// glm::vec4 u = glm::mix(g, h, r); // Interpolations can be perform per component with a vector for the last parameter. + /// @endcode + template class vecType> + GLM_FUNC_DECL vecType mix(vecType const & x, vecType const & y, vecType const & a); + + template class vecType> + GLM_FUNC_DECL vecType mix(vecType const & x, vecType const & y, U a); + + template + GLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a genType. + /// + /// @see GLSL step man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType step(genType edge, genType x); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0. + /// + /// @see GLSL step man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template