• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Jasshelper 2011-12-19

Status
Not open for further replies.
Level 6
Joined
Jun 16, 2007
Messages
235
I have a question, what are hooks? XD

Hooks are one of those arcane jasshelper features used by 0.0001% of mapmakers.
They replace standard wc3 functions with your own wrapper function.
In this they are similar to blizzard's BJ functions, but are worse because it is not obvious in other triggers code that something has changed.

Imho when you need to replace a default wc3 function with your own you should do it manually.

You can easily find all instances of a certain function by searching through your input .j script.
It is located in:
jassnewgenpack5d\logs\input_war3map.j - my jasshelper mod
jassnewgenpack5d\logs\inputwar3map.j - original jasshelper
 
It isn't for personal mapping so much as it is for systems. Hooking is rarely used because it is slow and very limited--we tend to avoid it even if it is a viable option either because: (A) it is slow or (B) we can't do what we actually want to 100%.

There are certain systems such as IDDS (just giving an example) which could benefit off this, as it makes the implementation/use much easier; especially if you already have code in your map.

At the moment hooks are weak and don't have many uses, but with a hook rewrite option people may be a bit more creative with their systems. For example, one could hook-rewrite certain registered player events and make them so they apply only for players actively playing to reduce handle count. Of course, that sort of thing isn't necessary, but it can give people more creativity in system design and will make implementation of certain systems far easier. (especially for GUI users)
 
Level 10
Joined
May 27, 2009
Messages
494
arrays have infinite value..

but it should be <= 8192.. and that should be the recommended value..

(dunno why blizzard made it infinite)

-------------

hmm.. will there be any update like optimizing some sort of BJ funcs?? like converting them to its native equivalent.. lol (even though optimizer does this.. most of the time..)
 
Uhm, I was asking because the documentation says that you can bypass the 8191 limit by using SIZED ARRAYS...

Jasshelper manual said:
Sized arrays

Global arrays might sometimes require more index space, jasshelper introduces syntax for sized arrays, it serves two purposes: It will allow you to request more space, and it also allows you to place a .size field on global arrays.
JASS:
globals
    integer array myArray [500]
endglobals

function test takes nothing returns nothing
 local integer i=0

    call BJDebugMsg(I2S(myArray.size)) //prints 500

    loop
        exitwhen i>=myArray.size
        set myArray[i]=i
        set i=i+1
    endloop
endfunction
Of course, you can bypass the 8191 array size limit:

JASS:
globals
    integer array myArray [9000]
endglobals
You can use a constant as well:
JASS:
globals
    constant integer Q= 60000
    integer array myArray [Q]
endglobals
You can use this on struct static member arrays. (static integer A[10000])

I believe this wasn't present on the original manual of JH and was just added recently...
 
Level 17
Joined
Apr 27, 2008
Messages
2,455
Well, Cohadar updated JassHelper (using its code) which is probably why he kept the name.

And elaborate on what views he has that differ from Vexorian's. But regardless, they are not just the views of Cohadar, but the views of the community. He asked us what we wanted, I don't find that particularly bad. :)

Cohadar consider many vJass features as useless, such as hooks, some OOP parts like interfaces and such, ...
And well, i could be wrong but i think it's the same for Vexorian, he made them just because he could and experiments.
I quite agree with Cohadar, even if hooks would be useful at least for debug stuff if we had more controls.

But anyway he will keep them, no matter he like it or not, even if it's not likely he will improve them.
Else nobody will support his jasshelper, including me.
 
Level 40
Joined
Dec 14, 2005
Messages
10,532
Well, Cohadar updated JassHelper (using its code) which is probably why he kept the name.

And elaborate on what views he has that differ from Vexorian's. But regardless, they are not just the views of Cohadar, but the views of the community. He asked us what we wanted, I don't find that particularly bad. :)
Adding tons of fluff like while is the main one.
 
Level 17
Joined
Apr 27, 2008
Messages
2,455
I wouldn't say "tons", seriously.
Now, sure the usefulness of these adds is debatable, but well i use it because :

- the vJass init order madness is fixed
- it compiles faster
- i don't believe that anyone else is willing to improve jasshelper
- i like the first of group loop

Now, the cons are that new keywords are reserved while vJass is already "old" :

- to
- in
- while
- whileend
- for
- enfor

But i can't imagine where you would use these words for variable and function name, and even if you have the need the fix is easy, just change the names.
Now, nothing force you to use jasshelper Cohadar, but i don't like when people is bitching about this or that and completly ignore the improvements.

I don't get where it's really different from Vexorian's point of view, vJass has already ton of (half-implanted) fluff, as you know it.
 
Level 16
Joined
Aug 7, 2009
Messages
1,403
When I tested it (it was young for sure), it was not only slower, but one of the resources I've been using used "for" as a variable name too, so I just ignored it. I know that the compile speed issue has been fixed but I just never moved to this one, because I'm using another compiler, since JASSHelper had that weird error when it said it had run out of memory (don't know what it said exactly).

So I'm wondering, does this compiler have the same issue?
Plus, how did the init order change? Would I have to rewrite all those custom module-initializer based things to work with this compiler?
 
Level 17
Joined
Apr 27, 2008
Messages
2,455
At least for me it's way faster, but i don't care that much about it, even if it was slower, it's just a pro.

Jasshelper != japi, you can use an other jass "parser", but it has nothing to do with jasshelper.

No, you don't have to edit your code, you just don't have to use module initializer anymore just to ensure that library requirements will be considered.
 
Level 40
Joined
Dec 14, 2005
Messages
10,532
I don't get where it's really different from Vexorian's point of view, vJass has already ton of (half-implanted) fluff, as you know it.
Complicated fluff, sure, but at least it was in situations where it was sort of useful as opposed to just a roundabout way of saving quite literally 7 characters in some specific situations. In addition, fluff doesn't justify even more fluff.

Anyhow, I don't object to people using such a compiler if they appreciate the fluff, it just isn't JassHelper.
 
Level 17
Joined
Apr 27, 2008
Messages
2,455
Just to be clear, by "half-implanted" i meant it doesn't work as intended, it's not related at all about simplicity or complexity.
Like optional methods with interfaces.
But i get your point, vJass was never to cut off the verbosity (if we forget textmacros and modules).
As said, the usefulness of the adds are debatable, i still like the firstofgroup loop because it cuts off the verbosity and is less error prone.

You still have not answered why it's "really different from Vexorian's point of view"

So, just because it's not the author he should choice an other name, while it's based on jasshelper, and because it has some more fluff and fix than the original one ?!

Anyway you don't have to use the new loops by Cohadar if you don't like them, simple as that.

What i'm trying to say is that these adds don't make so much difference, i mean because it's minor it doesn't break the vJass "philosophy".
I consider the vJass initializer fix is worth using it by alone.
 
Last edited:
Considering how opposed Vex was to stuff like while it really is against the intended direction of the language.

I suppose in that sense it would seem inappropriate to keep the name, but that is just one small aspect of the new jasshelper. If cohadar changed his intent in favor of creating a new language, then I'd probably agree with a name change, but the features and code of the new jasshelper are still primarily those of the old jasshelper, so I think that it makes more sense for it to remain being called jasshelper. :)
 
Level 31
Joined
Jul 10, 2007
Messages
6,306
Stack Overflow
JASS:
set s = chars[4096] + chars[4095] + chars[4094] + chars[4093] + chars[4092] + chars[4091] + chars[4090] + chars[4089] + chars[4088] + chars[4087] + chars[4086] + chars[4085] + chars[4084] + chars[4083] + chars[4082] + chars[4081] + chars[4080] + chars[4079] + chars[4078] + chars[4077] + chars[4076] + chars[4075] + chars[4074] + chars[4073] + chars[4072] + chars[4071] + chars[4070] + chars[4069] + chars[4068] + chars[4067] + chars[4066] + chars[4065] + chars[4064] + chars[4063] + chars[4062] + chars[4061] + chars[4060] + chars[4059] + chars[4058] + chars[4057] + chars[4056] + chars[4055] + chars[4054] + chars[4053] + chars[4052] + chars[4051] + chars[4050] + chars[4049] + chars[4048] + chars[4047] + chars[4046] + chars[4045] + chars[4044] + chars[4043] + chars[4042] + chars[4041] + chars[4040] + chars[4039] + chars[4038] + chars[4037] + chars[4036] + chars[4035] + chars[4034] + chars[4033] + chars[4032] + chars[4031] + chars[4030] + chars[4029] + chars[4028] + chars[4027] + chars[4026] + chars[4025] + chars[4024] + chars[4023] + chars[4022] + chars[4021] + chars[4020] + chars[4019] + chars[4018] + chars[4017] + chars[4016] + chars[4015] + chars[4014] + chars[4013] + chars[4012] + chars[4011] + chars[4010] + chars[4009] + chars[4008] + chars[4007] + chars[4006] + chars[4005] + chars[4004] + chars[4003] + chars[4002] + chars[4001] + chars[4000] + /*
*/chars[3999] + chars[3998] + chars[3997] + chars[3996] + chars[3995] + chars[3994] + chars[3993] + chars[3992] + chars[3991] + chars[3990] + chars[3989] + chars[3988] + chars[3987] + chars[3986] + chars[3985] + chars[3984] + chars[3983] + chars[3982] + chars[3981] + chars[3980] + chars[3979] + chars[3978] + chars[3977] + chars[3976] + chars[3975] + chars[3974] + chars[3973] + chars[3972] + chars[3971] + chars[3970] + chars[3969] + chars[3968] + chars[3967] + chars[3966] + chars[3965] + chars[3964] + chars[3963] + chars[3962] + chars[3961] + chars[3960] + chars[3959] + chars[3958] + chars[3957] + chars[3956] + chars[3955] + chars[3954] + chars[3953] + chars[3952] + chars[3951] + chars[3950] + chars[3949] + chars[3948] + chars[3947] + chars[3946] + chars[3945] + chars[3944] + chars[3943] + chars[3942] + chars[3941] + chars[3940] + chars[3939] + chars[3938] + chars[3937] + chars[3936] + chars[3935] + chars[3934] + chars[3933] + chars[3932] + chars[3931] + chars[3930] + chars[3929] + chars[3928] + chars[3927] + chars[3926] + chars[3925] + chars[3924] + chars[3923] + chars[3922] + chars[3921] + chars[3920] + chars[3919] + chars[3918] + chars[3917] + chars[3916] + chars[3915] + chars[3914] + chars[3913] + chars[3912] + chars[3911] + chars[3910] + chars[3909] + chars[3908] + chars[3907] + chars[3906] + chars[3905] + chars[3904] + chars[3903] + chars[3902] + chars[3901] + chars[3900] + /*
*/chars[3899] + chars[3898] + chars[3897] + chars[3896] + chars[3895] + chars[3894] + chars[3893] + chars[3892] + chars[3891] + chars[3890] + chars[3889] + chars[3888] + chars[3887] + chars[3886] + chars[3885] + chars[3884] + chars[3883] + chars[3882] + chars[3881] + chars[3880] + chars[3879] + chars[3878] + chars[3877] + chars[3876] + chars[3875] + chars[3874] + chars[3873] + chars[3872] + chars[3871] + chars[3870] + chars[3869] + chars[3868] + chars[3867] + chars[3866] + chars[3865] + chars[3864] + chars[3863] + chars[3862] + chars[3861] + chars[3860] + chars[3859] + chars[3858] + chars[3857] + chars[3856] + chars[3855] + chars[3854] + chars[3853] + chars[3852] + chars[3851] + chars[3850] + chars[3849] + chars[3848] + chars[3847] + chars[3846] + chars[3845] + chars[3844] + chars[3843] + chars[3842] + chars[3841] + chars[3840] + chars[3839] + chars[3838] + chars[3837] + chars[3836] + chars[3835] + chars[3834] + chars[3833] + chars[3832] + chars[3831] + chars[3830] + chars[3829] + chars[3828] + chars[3827] + chars[3826] + chars[3825] + chars[3824] + chars[3823] + chars[3822] + chars[3821] + chars[3820] + chars[3819] + chars[3818] + chars[3817] + chars[3816] + chars[3815] + chars[3814] + chars[3813] + chars[3812] + chars[3811] + chars[3810] + chars[3809] + chars[3808] + chars[3807] + chars[3806] + chars[3805] + chars[3804] + chars[3803] + chars[3802] + chars[3801] + chars[3800] + /*
*/chars[3799] + chars[3798] + chars[3797] + chars[3796] + chars[3795] + chars[3794] + chars[3793] + chars[3792] + chars[3791] + chars[3790] + chars[3789] + chars[3788] + chars[3787] + chars[3786] + chars[3785] + chars[3784] + chars[3783] + chars[3782] + chars[3781] + chars[3780] + chars[3779] + chars[3778] + chars[3777] + chars[3776] + chars[3775] + chars[3774] + chars[3773] + chars[3772] + chars[3771] + chars[3770] + chars[3769] + chars[3768] + chars[3767] + chars[3766] + chars[3765] + chars[3764] + chars[3763] + chars[3762] + chars[3761] + chars[3760] + chars[3759] + chars[3758] + chars[3757] + chars[3756] + chars[3755] + chars[3754] + chars[3753] + chars[3752] + chars[3751] + chars[3750] + chars[3749] + chars[3748] + chars[3747] + chars[3746] + chars[3745] + chars[3744] + chars[3743] + chars[3742] + chars[3741] + chars[3740] + chars[3739] + chars[3738] + chars[3737] + chars[3736] + chars[3735] + chars[3734] + chars[3733] + chars[3732] + chars[3731] + chars[3730] + chars[3729] + chars[3728] + chars[3727] + chars[3726] + chars[3725] + chars[3724] + chars[3723] + chars[3722] + chars[3721] + chars[3720] + chars[3719] + chars[3718] + chars[3717] + chars[3716] + chars[3715] + chars[3714] + chars[3713] + chars[3712] + chars[3711] + chars[3710] + chars[3709] + chars[3708] + chars[3707] + chars[3706] + chars[3705] + chars[3704] + chars[3703] + chars[3702] + chars[3701] + chars[3700] + /*
*/chars[3699] + chars[3698] + chars[3697] + chars[3696] + chars[3695] + chars[3694] + chars[3693] + chars[3692] + chars[3691] + chars[3690] + chars[3689] + chars[3688] + chars[3687] + chars[3686] + chars[3685] + chars[3684] + chars[3683] + chars[3682] + chars[3681] + chars[3680] + chars[3679] + chars[3678] + chars[3677] + chars[3676] + chars[3675] + chars[3674] + chars[3673] + chars[3672] + chars[3671] + chars[3670] + chars[3669] + chars[3668] + chars[3667] + chars[3666] + chars[3665] + chars[3664] + chars[3663] + chars[3662] + chars[3661] + chars[3660] + chars[3659] + chars[3658] + chars[3657] + chars[3656] + chars[3655] + chars[3654] + chars[3653] + chars[3652] + chars[3651] + chars[3650] + chars[3649] + chars[3648] + chars[3647] + chars[3646] + chars[3645] + chars[3644] + chars[3643] + chars[3642] + chars[3641] + chars[3640] + chars[3639] + chars[3638] + chars[3637] + chars[3636] + chars[3635] + chars[3634] + chars[3633] + chars[3632] + chars[3631] + chars[3630] + chars[3629] + chars[3628] + chars[3627] + chars[3626] + chars[3625] + chars[3624] + chars[3623] + chars[3622] + chars[3621] + chars[3620] + chars[3619] + chars[3618] + chars[3617] + chars[3616] + chars[3615] + chars[3614] + chars[3613] + chars[3612] + chars[3611] + chars[3610] + chars[3609] + chars[3608] + chars[3607] + chars[3606] + chars[3605] + chars[3604] + chars[3603] + chars[3602] + chars[3601] + chars[3600] + /*
*/chars[3599] + chars[3598] + chars[3597] + chars[3596] + chars[3595] + chars[3594] + chars[3593] + chars[3592] + chars[3591] + chars[3590] + chars[3589] + chars[3588] + chars[3587] + chars[3586] + chars[3585] + chars[3584] + chars[3583] + chars[3582] + chars[3581] + chars[3580] + chars[3579] + chars[3578] + chars[3577] + chars[3576] + chars[3575] + chars[3574] + chars[3573] + chars[3572] + chars[3571] + chars[3570] + chars[3569] + chars[3568] + chars[3567] + chars[3566] + chars[3565] + chars[3564] + chars[3563] + chars[3562] + chars[3561] + chars[3560] + chars[3559] + chars[3558] + chars[3557] + chars[3556] + chars[3555] + chars[3554] + chars[3553] + chars[3552] + chars[3551] + chars[3550] + chars[3549] + chars[3548] + chars[3547] + chars[3546] + chars[3545] + chars[3544] + chars[3543] + chars[3542] + chars[3541] + chars[3540] + chars[3539] + chars[3538] + chars[3537] + chars[3536] + chars[3535] + chars[3534] + chars[3533] + chars[3532] + chars[3531] + chars[3530] + chars[3529] + chars[3528] + chars[3527] + chars[3526] + chars[3525] + chars[3524] + chars[3523] + chars[3522] + chars[3521] + chars[3520] + chars[3519] + chars[3518] + chars[3517] + chars[3516] + chars[3515] + chars[3514] + chars[3513] + chars[3512] + chars[3511] + chars[3510] + chars[3509] + chars[3508] + chars[3507] + chars[3506] + chars[3505] + chars[3504] + chars[3503] + chars[3502] + chars[3501] + chars[3500] + /*
*/chars[3499] + chars[3498] + chars[3497] + chars[3496] + chars[3495] + chars[3494] + chars[3493] + chars[3492] + chars[3491] + chars[3490] + chars[3489] + chars[3488] + chars[3487] + chars[3486] + chars[3485] + chars[3484] + chars[3483] + chars[3482] + chars[3481] + chars[3480] + chars[3479] + chars[3478] + chars[3477] + chars[3476] + chars[3475] + chars[3474] + chars[3473] + chars[3472] + chars[3471] + chars[3470] + chars[3469] + chars[3468] + chars[3467] + chars[3466] + chars[3465] + chars[3464] + chars[3463] + chars[3462] + chars[3461] + chars[3460] + chars[3459] + chars[3458] + chars[3457] + chars[3456] + chars[3455] + chars[3454] + chars[3453] + chars[3452] + chars[3451] + chars[3450] + chars[3449] + chars[3448] + chars[3447] + chars[3446] + chars[3445] + chars[3444] + chars[3443] + chars[3442] + chars[3441] + chars[3440] + chars[3439] + chars[3438] + chars[3437] + chars[3436] + chars[3435] + chars[3434] + chars[3433] + chars[3432] + chars[3431] + chars[3430] + chars[3429] + chars[3428] + chars[3427] + chars[3426] + chars[3425] + chars[3424] + chars[3423] + chars[3422] + chars[3421] + chars[3420] + chars[3419] + chars[3418] + chars[3417] + chars[3416] + chars[3415] + chars[3414] + chars[3413] + chars[3412] + chars[3411] + chars[3410] + chars[3409] + chars[3408] + chars[3407] + chars[3406] + chars[3405] + chars[3404] + chars[3403] + chars[3402] + chars[3401] + chars[3400] + /*
*/chars[3399] + chars[3398] + chars[3397] + chars[3396] + chars[3395] + chars[3394] + chars[3393] + chars[3392] + chars[3391] + chars[3390] + chars[3389] + chars[3388] + chars[3387] + chars[3386] + chars[3385] + chars[3384] + chars[3383] + chars[3382] + chars[3381] + chars[3380] + chars[3379] + chars[3378] + chars[3377] + chars[3376] + chars[3375] + chars[3374] + chars[3373] + chars[3372] + chars[3371] + chars[3370] + chars[3369] + chars[3368] + chars[3367] + chars[3366] + chars[3365] + chars[3364] + chars[3363] + chars[3362] + chars[3361] + chars[3360] + chars[3359] + chars[3358] + chars[3357] + chars[3356] + chars[3355] + chars[3354] + chars[3353] + chars[3352] + chars[3351] + chars[3350] + chars[3349] + chars[3348] + chars[3347] + chars[3346] + chars[3345] + chars[3344] + chars[3343] + chars[3342] + chars[3341] + chars[3340] + chars[3339] + chars[3338] + chars[3337] + chars[3336] + chars[3335] + chars[3334] + chars[3333] + chars[3332] + chars[3331] + chars[3330] + chars[3329] + chars[3328] + chars[3327] + chars[3326] + chars[3325] + chars[3324] + chars[3323] + chars[3322] + chars[3321] + chars[3320] + chars[3319] + chars[3318] + chars[3317] + chars[3316] + chars[3315] + chars[3314] + chars[3313] + chars[3312] + chars[3311] + chars[3310] + chars[3309] + chars[3308] + chars[3307] + chars[3306] + chars[3305] + chars[3304] + chars[3303] + chars[3302] + chars[3301] + chars[3300] + /*
*/chars[3299] + chars[3298] + chars[3297] + chars[3296] + chars[3295] + chars[3294] + chars[3293] + chars[3292] + chars[3291] + chars[3290] + chars[3289] + chars[3288] + chars[3287] + chars[3286] + chars[3285] + chars[3284] + chars[3283] + chars[3282] + chars[3281] + chars[3280] + chars[3279] + chars[3278] + chars[3277] + chars[3276] + chars[3275] + chars[3274] + chars[3273] + chars[3272] + chars[3271] + chars[3270] + chars[3269] + chars[3268] + chars[3267] + chars[3266] + chars[3265] + chars[3264] + chars[3263] + chars[3262] + chars[3261] + chars[3260] + chars[3259] + chars[3258] + chars[3257] + chars[3256] + chars[3255] + chars[3254] + chars[3253] + chars[3252] + chars[3251] + chars[3250] + chars[3249] + chars[3248] + chars[3247] + chars[3246] + chars[3245] + chars[3244] + chars[3243] + chars[3242] + chars[3241] + chars[3240] + chars[3239] + chars[3238] + chars[3237] + chars[3236] + chars[3235] + chars[3234] + chars[3233] + chars[3232] + chars[3231] + chars[3230] + chars[3229] + chars[3228] + chars[3227] + chars[3226] + chars[3225] + chars[3224] + chars[3223] + chars[3222] + chars[3221] + chars[3220] + chars[3219] + chars[3218] + chars[3217] + chars[3216] + chars[3215] + chars[3214] + chars[3213] + chars[3212] + chars[3211] + chars[3210] + chars[3209] + chars[3208] + chars[3207] + chars[3206] + chars[3205] + chars[3204] + chars[3203] + chars[3202] + chars[3201] + chars[3200] + /*
*/chars[3199] + chars[3198] + chars[3197] + chars[3196] + chars[3195] + chars[3194] + chars[3193] + chars[3192] + chars[3191] + chars[3190] + chars[3189] + chars[3188] + chars[3187] + chars[3186] + chars[3185] + chars[3184] + chars[3183] + chars[3182] + chars[3181] + chars[3180] + chars[3179] + chars[3178] + chars[3177] + chars[3176] + chars[3175] + chars[3174] + chars[3173] + chars[3172] + chars[3171] + chars[3170] + chars[3169] + chars[3168] + chars[3167] + chars[3166] + chars[3165] + chars[3164] + chars[3163] + chars[3162] + chars[3161] + chars[3160] + chars[3159] + chars[3158] + chars[3157] + chars[3156] + chars[3155] + chars[3154] + chars[3153] + chars[3152] + chars[3151] + chars[3150] + chars[3149] + chars[3148] + chars[3147] + chars[3146] + chars[3145] + chars[3144] + chars[3143] + chars[3142] + chars[3141] + chars[3140] + chars[3139] + chars[3138] + chars[3137] + chars[3136] + chars[3135] + chars[3134] + chars[3133] + chars[3132] + chars[3131] + chars[3130] + chars[3129] + chars[3128] + chars[3127] + chars[3126] + chars[3125] + chars[3124] + chars[3123] + chars[3122] + chars[3121] + chars[3120] + chars[3119] + chars[3118] + chars[3117] + chars[3116] + chars[3115] + chars[3114] + chars[3113] + chars[3112] + chars[3111] + chars[3110] + chars[3109] + chars[3108] + chars[3107] + chars[3106] + chars[3105] + chars[3104] + chars[3103] + chars[3102] + chars[3101] + chars[3100] + /*
*/chars[3099] + chars[3098] + chars[3097] + chars[3096] + chars[3095] + chars[3094] + chars[3093] + chars[3092] + chars[3091] + chars[3090] + chars[3089] + chars[3088] + chars[3087] + chars[3086] + chars[3085] + chars[3084] + chars[3083] + chars[3082] + chars[3081] + chars[3080] + chars[3079] + chars[3078] + chars[3077] + chars[3076] + chars[3075] + chars[3074] + chars[3073] + chars[3072] + chars[3071] + chars[3070] + chars[3069] + chars[3068] + chars[3067] + chars[3066] + chars[3065] + chars[3064] + chars[3063] + chars[3062] + chars[3061] + chars[3060] + chars[3059] + chars[3058] + chars[3057] + chars[3056] + chars[3055] + chars[3054] + chars[3053] + chars[3052] + chars[3051] + chars[3050] + chars[3049] + chars[3048] + chars[3047] + chars[3046] + chars[3045] + chars[3044] + chars[3043] + chars[3042] + chars[3041] + chars[3040] + chars[3039] + chars[3038] + chars[3037] + chars[3036] + chars[3035] + chars[3034] + chars[3033] + chars[3032] + chars[3031] + chars[3030] + chars[3029] + chars[3028] + chars[3027] + chars[3026] + chars[3025] + chars[3024] + chars[3023] + chars[3022] + chars[3021] + chars[3020] + chars[3019] + chars[3018] + chars[3017] + chars[3016] + chars[3015] + chars[3014] + chars[3013] + chars[3012] + chars[3011] + chars[3010] + chars[3009] + chars[3008] + chars[3007] + chars[3006] + chars[3005] + chars[3004] + chars[3003] + chars[3002] + chars[3001] + chars[3000] + /*
*/chars[2999] + chars[2998] + chars[2997] + chars[2996] + chars[2995] + chars[2994] + chars[2993] + chars[2992] + chars[2991] + chars[2990] + chars[2989] + chars[2988] + chars[2987] + chars[2986] + chars[2985] + chars[2984] + chars[2983] + chars[2982] + chars[2981] + chars[2980] + chars[2979] + chars[2978] + chars[2977] + chars[2976] + chars[2975] + chars[2974] + chars[2973] + chars[2972] + chars[2971] + chars[2970] + chars[2969] + chars[2968] + chars[2967] + chars[2966] + chars[2965] + chars[2964] + chars[2963] + chars[2962] + chars[2961] + chars[2960] + chars[2959] + chars[2958] + chars[2957] + chars[2956] + chars[2955] + chars[2954] + chars[2953] + chars[2952] + chars[2951] + chars[2950] + chars[2949] + chars[2948] + chars[2947] + chars[2946] + chars[2945] + chars[2944] + chars[2943] + chars[2942] + chars[2941] + chars[2940] + chars[2939] + chars[2938] + chars[2937] + chars[2936] + chars[2935] + chars[2934] + chars[2933] + chars[2932] + chars[2931] + chars[2930] + chars[2929] + chars[2928] + chars[2927] + chars[2926] + chars[2925] + chars[2924] + chars[2923] + chars[2922] + chars[2921] + chars[2920] + chars[2919] + chars[2918] + chars[2917] + chars[2916] + chars[2915] + chars[2914] + chars[2913] + chars[2912] + chars[2911] + chars[2910] + chars[2909] + chars[2908] + chars[2907] + chars[2906] + chars[2905] + chars[2904] + chars[2903] + chars[2902] + chars[2901] + chars[2900] + /*
*/chars[2899] + chars[2898] + chars[2897] + chars[2896] + chars[2895] + chars[2894] + chars[2893] + chars[2892] + chars[2891] + chars[2890] + chars[2889] + chars[2888] + chars[2887] + chars[2886] + chars[2885] + chars[2884] + chars[2883] + chars[2882] + chars[2881] + chars[2880] + chars[2879] + chars[2878] + chars[2877] + chars[2876] + chars[2875] + chars[2874] + chars[2873] + chars[2872] + chars[2871] + chars[2870] + chars[2869] + chars[2868] + chars[2867] + chars[2866] + chars[2865] + chars[2864] + chars[2863] + chars[2862] + chars[2861] + chars[2860] + chars[2859] + chars[2858] + chars[2857] + chars[2856] + chars[2855] + chars[2854] + chars[2853] + chars[2852] + chars[2851] + chars[2850] + chars[2849] + chars[2848] + chars[2847] + chars[2846] + chars[2845] + chars[2844] + chars[2843] + chars[2842] + chars[2841] + chars[2840] + chars[2839] + chars[2838] + chars[2837] + chars[2836] + chars[2835] + chars[2834] + chars[2833] + chars[2832] + chars[2831] + chars[2830] + chars[2829] + chars[2828] + chars[2827] + chars[2826] + chars[2825] + chars[2824] + chars[2823] + chars[2822] + chars[2821] + chars[2820] + chars[2819] + chars[2818] + chars[2817] + chars[2816] + chars[2815] + chars[2814] + chars[2813] + chars[2812] + chars[2811] + chars[2810] + chars[2809] + chars[2808] + chars[2807] + chars[2806] + chars[2805] + chars[2804] + chars[2803] + chars[2802] + chars[2801] + chars[2800] + /*
*/chars[2799] + chars[2798] + chars[2797] + chars[2796] + chars[2795] + chars[2794] + chars[2793] + chars[2792] + chars[2791] + chars[2790] + chars[2789] + chars[2788] + chars[2787] + chars[2786] + chars[2785] + chars[2784] + chars[2783] + chars[2782] + chars[2781] + chars[2780] + chars[2779] + chars[2778] + chars[2777] + chars[2776] + chars[2775] + chars[2774] + chars[2773] + chars[2772] + chars[2771] + chars[2770] + chars[2769] + chars[2768] + chars[2767] + chars[2766] + chars[2765] + chars[2764] + chars[2763] + chars[2762] + chars[2761] + chars[2760] + chars[2759] + chars[2758] + chars[2757] + chars[2756] + chars[2755] + chars[2754] + chars[2753] + chars[2752] + chars[2751] + chars[2750] + chars[2749] + chars[2748] + chars[2747] + chars[2746] + chars[2745] + chars[2744] + chars[2743] + chars[2742] + chars[2741] + chars[2740] + chars[2739] + chars[2738] + chars[2737] + chars[2736] + chars[2735] + chars[2734] + chars[2733] + chars[2732] + chars[2731] + chars[2730] + chars[2729] + chars[2728] + chars[2727] + chars[2726] + chars[2725] + chars[2724] + chars[2723] + chars[2722] + chars[2721] + chars[2720] + chars[2719] + chars[2718] + chars[2717] + chars[2716] + chars[2715] + chars[2714] + chars[2713] + chars[2712] + chars[2711] + chars[2710] + chars[2709] + chars[2708] + chars[2707] + chars[2706] + chars[2705] + chars[2704] + chars[2703] + chars[2702] + chars[2701] + chars[2700] + /*
*/chars[2699] + chars[2698] + chars[2697] + chars[2696] + chars[2695] + chars[2694] + chars[2693] + chars[2692] + chars[2691] + chars[2690] + chars[2689] + chars[2688] + chars[2687] + chars[2686] + chars[2685] + chars[2684] + chars[2683] + chars[2682] + chars[2681] + chars[2680] + chars[2679] + chars[2678] + chars[2677] + chars[2676] + chars[2675] + chars[2674] + chars[2673] + chars[2672] + chars[2671] + chars[2670] + chars[2669] + chars[2668] + chars[2667] + chars[2666] + chars[2665] + chars[2664] + chars[2663] + chars[2662] + chars[2661] + chars[2660] + chars[2659] + chars[2658] + chars[2657] + chars[2656] + chars[2655] + chars[2654] + chars[2653] + chars[2652] + chars[2651] + chars[2650] + chars[2649] + chars[2648] + chars[2647] + chars[2646] + chars[2645] + chars[2644] + chars[2643] + chars[2642] + chars[2641] + chars[2640] + chars[2639] + chars[2638] + chars[2637] + chars[2636] + chars[2635] + chars[2634] + chars[2633] + chars[2632] + chars[2631] + chars[2630] + chars[2629] + chars[2628] + chars[2627] + chars[2626] + chars[2625] + chars[2624] + chars[2623] + chars[2622] + chars[2621] + chars[2620] + chars[2619] + chars[2618] + chars[2617] + chars[2616] + chars[2615] + chars[2614] + chars[2613] + chars[2612] + chars[2611] + chars[2610] + chars[2609] + chars[2608] + chars[2607] + chars[2606] + chars[2605] + chars[2604] + chars[2603] + chars[2602] + chars[2601] + chars[2600] + /*
*/chars[2599] + chars[2598] + chars[2597] + chars[2596] + chars[2595] + chars[2594] + chars[2593] + chars[2592] + chars[2591] + chars[2590] + chars[2589] + chars[2588] + chars[2587] + chars[2586] + chars[2585] + chars[2584] + chars[2583] + chars[2582] + chars[2581] + chars[2580] + chars[2579] + chars[2578] + chars[2577] + chars[2576] + chars[2575] + chars[2574] + chars[2573] + chars[2572] + chars[2571] + chars[2570] + chars[2569] + chars[2568] + chars[2567] + chars[2566] + chars[2565] + chars[2564] + chars[2563] + chars[2562] + chars[2561] + chars[2560] + chars[2559] + chars[2558] + chars[2557] + chars[2556] + chars[2555] + chars[2554] + chars[2553] + chars[2552] + chars[2551] + chars[2550] + chars[2549] + chars[2548] + chars[2547] + chars[2546] + chars[2545] + chars[2544] + chars[2543] + chars[2542] + chars[2541] + chars[2540] + chars[2539] + chars[2538] + chars[2537] + chars[2536] + chars[2535] + chars[2534] + chars[2533] + chars[2532] + chars[2531] + chars[2530] + chars[2529] + chars[2528] + chars[2527] + chars[2526] + chars[2525] + chars[2524] + chars[2523] + chars[2522] + chars[2521] + chars[2520] + chars[2519] + chars[2518] + chars[2517] + chars[2516] + chars[2515] + chars[2514] + chars[2513] + chars[2512] + chars[2511] + chars[2510] + chars[2509] + chars[2508] + chars[2507] + chars[2506] + chars[2505] + chars[2504] + chars[2503] + chars[2502] + chars[2501] + chars[2500] + /*
*/chars[2499] + chars[2498] + chars[2497] + chars[2496] + chars[2495] + chars[2494] + chars[2493] + chars[2492] + chars[2491] + chars[2490] + chars[2489] + chars[2488] + chars[2487] + chars[2486] + chars[2485] + chars[2484] + chars[2483] + chars[2482] + chars[2481] + chars[2480] + chars[2479] + chars[2478] + chars[2477] + chars[2476] + chars[2475] + chars[2474] + chars[2473] + chars[2472] + chars[2471] + chars[2470] + chars[2469] + chars[2468] + chars[2467] + chars[2466] + chars[2465] + chars[2464] + chars[2463] + chars[2462] + chars[2461] + chars[2460] + chars[2459] + chars[2458] + chars[2457] + chars[2456] + chars[2455] + chars[2454] + chars[2453] + chars[2452] + chars[2451] + chars[2450] + chars[2449] + chars[2448] + chars[2447] + chars[2446] + chars[2445] + chars[2444] + chars[2443] + chars[2442] + chars[2441] + chars[2440] + chars[2439] + chars[2438] + chars[2437] + chars[2436] + chars[2435] + chars[2434] + chars[2433] + chars[2432] + chars[2431] + chars[2430] + chars[2429] + chars[2428] + chars[2427] + chars[2426] + chars[2425] + chars[2424] + chars[2423] + chars[2422] + chars[2421] + chars[2420] + chars[2419] + chars[2418] + chars[2417] + chars[2416] + chars[2415] + chars[2414] + chars[2413] + chars[2412] + chars[2411] + chars[2410] + chars[2409] + chars[2408] + chars[2407] + chars[2406] + chars[2405] + chars[2404] + chars[2403] + chars[2402] + chars[2401] + chars[2400] + /*
*/chars[2399] + chars[2398] + chars[2397] + chars[2396] + chars[2395] + chars[2394] + chars[2393] + chars[2392] + chars[2391] + chars[2390] + chars[2389] + chars[2388] + chars[2387] + chars[2386] + chars[2385] + chars[2384] + chars[2383] + chars[2382] + chars[2381] + chars[2380] + chars[2379] + chars[2378] + chars[2377] + chars[2376] + chars[2375] + chars[2374] + chars[2373] + chars[2372] + chars[2371] + chars[2370] + chars[2369] + chars[2368] + chars[2367] + chars[2366] + chars[2365] + chars[2364] + chars[2363] + chars[2362] + chars[2361] + chars[2360] + chars[2359] + chars[2358] + chars[2357] + chars[2356] + chars[2355] + chars[2354] + chars[2353] + chars[2352] + chars[2351] + chars[2350] + chars[2349] + chars[2348] + chars[2347] + chars[2346] + chars[2345] + chars[2344] + chars[2343] + chars[2342] + chars[2341] + chars[2340] + chars[2339] + chars[2338] + chars[2337] + chars[2336] + chars[2335] + chars[2334] + chars[2333] + chars[2332] + chars[2331] + chars[2330] + chars[2329] + chars[2328] + chars[2327] + chars[2326] + chars[2325] + chars[2324] + chars[2323] + chars[2322] + chars[2321] + chars[2320] + chars[2319] + chars[2318] + chars[2317] + chars[2316] + chars[2315] + chars[2314] + chars[2313] + chars[2312] + chars[2311] + chars[2310] + chars[2309] + chars[2308] + chars[2307] + chars[2306] + chars[2305] + chars[2304] + chars[2303] + chars[2302] + chars[2301] + chars[2300] + /*
*/chars[2299] + chars[2298] + chars[2297] + chars[2296] + chars[2295] + chars[2294] + chars[2293] + chars[2292] + chars[2291] + chars[2290] + chars[2289] + chars[2288] + chars[2287] + chars[2286] + chars[2285] + chars[2284] + chars[2283] + chars[2282] + chars[2281] + chars[2280] + chars[2279] + chars[2278] + chars[2277] + chars[2276] + chars[2275] + chars[2274] + chars[2273] + chars[2272] + chars[2271] + chars[2270] + chars[2269] + chars[2268] + chars[2267] + chars[2266] + chars[2265] + chars[2264] + chars[2263] + chars[2262] + chars[2261] + chars[2260] + chars[2259] + chars[2258] + chars[2257] + chars[2256] + chars[2255] + chars[2254] + chars[2253] + chars[2252] + chars[2251] + chars[2250] + chars[2249] + chars[2248] + chars[2247] + chars[2246] + chars[2245] + chars[2244] + chars[2243] + chars[2242] + chars[2241] + chars[2240] + chars[2239] + chars[2238] + chars[2237] + chars[2236] + chars[2235] + chars[2234] + chars[2233] + chars[2232] + chars[2231] + chars[2230] + chars[2229] + chars[2228] + chars[2227] + chars[2226] + chars[2225] + chars[2224] + chars[2223] + chars[2222] + chars[2221] + chars[2220] + chars[2219] + chars[2218] + chars[2217] + chars[2216] + chars[2215] + chars[2214] + chars[2213] + chars[2212] + chars[2211] + chars[2210] + chars[2209] + chars[2208] + chars[2207] + chars[2206] + chars[2205] + chars[2204] + chars[2203] + chars[2202] + chars[2201] + chars[2200] + /*
*/chars[2199] + chars[2198] + chars[2197] + chars[2196] + chars[2195] + chars[2194] + chars[2193] + chars[2192] + chars[2191] + chars[2190] + chars[2189] + chars[2188] + chars[2187] + chars[2186] + chars[2185] + chars[2184] + chars[2183] + chars[2182] + chars[2181] + chars[2180] + chars[2179] + chars[2178] + chars[2177] + chars[2176] + chars[2175] + chars[2174] + chars[2173] + chars[2172] + chars[2171] + chars[2170] + chars[2169] + chars[2168] + chars[2167] + chars[2166] + chars[2165] + chars[2164] + chars[2163] + chars[2162] + chars[2161] + chars[2160] + chars[2159] + chars[2158] + chars[2157] + chars[2156] + chars[2155] + chars[2154] + chars[2153] + chars[2152] + chars[2151] + chars[2150] + chars[2149] + chars[2148] + chars[2147] + chars[2146] + chars[2145] + chars[2144] + chars[2143] + chars[2142] + chars[2141] + chars[2140] + chars[2139] + chars[2138] + chars[2137] + chars[2136] + chars[2135] + chars[2134] + chars[2133] + chars[2132] + chars[2131] + chars[2130] + chars[2129] + chars[2128] + chars[2127] + chars[2126] + chars[2125] + chars[2124] + chars[2123] + chars[2122] + chars[2121] + chars[2120] + chars[2119] + chars[2118] + chars[2117] + chars[2116] + chars[2115] + chars[2114] + chars[2113] + chars[2112] + chars[2111] + chars[2110] + chars[2109] + chars[2108] + chars[2107] + chars[2106] + chars[2105] + chars[2104] + chars[2103] + chars[2102] + chars[2101] + chars[2100] + /*
*/chars[2099] + chars[2098] + chars[2097] + chars[2096] + chars[2095] + chars[2094] + chars[2093] + chars[2092] + chars[2091] + chars[2090] + chars[2089] + chars[2088] + chars[2087] + chars[2086] + chars[2085] + chars[2084] + chars[2083] + chars[2082] + chars[2081] + chars[2080] + chars[2079] + chars[2078] + chars[2077] + chars[2076] + chars[2075] + chars[2074] + chars[2073] + chars[2072] + chars[2071] + chars[2070] + chars[2069] + chars[2068] + chars[2067] + chars[2066] + chars[2065] + chars[2064] + chars[2063] + chars[2062] + chars[2061] + chars[2060] + chars[2059] + chars[2058] + chars[2057] + chars[2056] + chars[2055] + chars[2054] + chars[2053] + chars[2052] + chars[2051] + chars[2050] + chars[2049] + chars[2048] + chars[2047] + chars[2046] + chars[2045] + chars[2044] + chars[2043] + chars[2042] + chars[2041] + chars[2040] + chars[2039] + chars[2038] + chars[2037] + chars[2036] + chars[2035] + chars[2034] + chars[2033] + chars[2032] + chars[2031] + chars[2030] + chars[2029] + chars[2028] + chars[2027] + chars[2026] + chars[2025] + chars[2024] + chars[2023] + chars[2022] + chars[2021] + chars[2020] + chars[2019] + chars[2018] + chars[2017] + chars[2016] + chars[2015] + chars[2014] + chars[2013] + chars[2012] + chars[2011] + chars[2010] + chars[2009] + chars[2008] + chars[2007] + chars[2006] + chars[2005] + chars[2004] + chars[2003] + chars[2002] + chars[2001] + chars[2000] + /*
*/chars[1999] + chars[1998] + chars[1997] + chars[1996] + chars[1995] + chars[1994] + chars[1993] + chars[1992] + chars[1991] + chars[1990] + chars[1989] + chars[1988] + chars[1987] + chars[1986] + chars[1985] + chars[1984] + chars[1983] + chars[1982] + chars[1981] + chars[1980] + chars[1979] + chars[1978] + chars[1977] + chars[1976] + chars[1975] + chars[1974] + chars[1973] + chars[1972] + chars[1971] + chars[1970] + chars[1969] + chars[1968] + chars[1967] + chars[1966] + chars[1965] + chars[1964] + chars[1963] + chars[1962] + chars[1961] + chars[1960] + chars[1959] + chars[1958] + chars[1957] + chars[1956] + chars[1955] + chars[1954] + chars[1953] + chars[1952] + chars[1951] + chars[1950] + chars[1949] + chars[1948] + chars[1947] + chars[1946] + chars[1945] + chars[1944] + chars[1943] + chars[1942] + chars[1941] + chars[1940] + chars[1939] + chars[1938] + chars[1937] + chars[1936] + chars[1935] + chars[1934] + chars[1933] + chars[1932] + chars[1931] + chars[1930] + chars[1929] + chars[1928] + chars[1927] + chars[1926] + chars[1925] + chars[1924] + chars[1923] + chars[1922] + chars[1921] + chars[1920] + chars[1919] + chars[1918] + chars[1917] + chars[1916] + chars[1915] + chars[1914] + chars[1913] + chars[1912] + chars[1911] + chars[1910] + chars[1909] + chars[1908] + chars[1907] + chars[1906] + chars[1905] + chars[1904] + chars[1903] + chars[1902] + chars[1901] + chars[1900] + /*
*/chars[1899] + chars[1898] + chars[1897] + chars[1896] + chars[1895] + chars[1894] + chars[1893] + chars[1892] + chars[1891] + chars[1890] + chars[1889] + chars[1888] + chars[1887] + chars[1886] + chars[1885] + chars[1884] + chars[1883] + chars[1882] + chars[1881] + chars[1880] + chars[1879] + chars[1878] + chars[1877] + chars[1876] + chars[1875] + chars[1874] + chars[1873] + chars[1872] + chars[1871] + chars[1870] + chars[1869] + chars[1868] + chars[1867] + chars[1866] + chars[1865] + chars[1864] + chars[1863] + chars[1862] + chars[1861] + chars[1860] + chars[1859] + chars[1858] + chars[1857] + chars[1856] + chars[1855] + chars[1854] + chars[1853] + chars[1852] + chars[1851] + chars[1850] + chars[1849] + chars[1848] + chars[1847] + chars[1846] + chars[1845] + chars[1844] + chars[1843] + chars[1842] + chars[1841] + chars[1840] + chars[1839] + chars[1838] + chars[1837] + chars[1836] + chars[1835] + chars[1834] + chars[1833] + chars[1832] + chars[1831] + chars[1830] + chars[1829] + chars[1828] + chars[1827] + chars[1826] + chars[1825] + chars[1824] + chars[1823] + chars[1822] + chars[1821] + chars[1820] + chars[1819] + chars[1818] + chars[1817] + chars[1816] + chars[1815] + chars[1814] + chars[1813] + chars[1812] + chars[1811] + chars[1810] + chars[1809] + chars[1808] + chars[1807] + chars[1806] + chars[1805] + chars[1804] + chars[1803] + chars[1802] + chars[1801] + chars[1800] + /*
*/chars[1799] + chars[1798] + chars[1797] + chars[1796] + chars[1795] + chars[1794] + chars[1793] + chars[1792] + chars[1791] + chars[1790] + chars[1789] + chars[1788] + chars[1787] + chars[1786] + chars[1785] + chars[1784] + chars[1783] + chars[1782] + chars[1781] + chars[1780] + chars[1779] + chars[1778] + chars[1777] + chars[1776] + chars[1775] + chars[1774] + chars[1773] + chars[1772] + chars[1771] + chars[1770] + chars[1769] + chars[1768] + chars[1767] + chars[1766] + chars[1765] + chars[1764] + chars[1763] + chars[1762] + chars[1761] + chars[1760] + chars[1759] + chars[1758] + chars[1757] + chars[1756] + chars[1755] + chars[1754] + chars[1753] + chars[1752] + chars[1751] + chars[1750] + chars[1749] + chars[1748] + chars[1747] + chars[1746] + chars[1745] + chars[1744] + chars[1743] + chars[1742] + chars[1741] + chars[1740] + chars[1739] + chars[1738] + chars[1737] + chars[1736] + chars[1735] + chars[1734] + chars[1733] + chars[1732] + chars[1731] + chars[1730] + chars[1729] + chars[1728] + chars[1727] + chars[1726] + chars[1725] + chars[1724] + chars[1723] + chars[1722] + chars[1721] + chars[1720] + chars[1719] + chars[1718] + chars[1717] + chars[1716] + chars[1715] + chars[1714] + chars[1713] + chars[1712] + chars[1711] + chars[1710] + chars[1709] + chars[1708] + chars[1707] + chars[1706] + chars[1705] + chars[1704] + chars[1703] + chars[1702] + chars[1701] + chars[1700] + /*
*/chars[1699] + chars[1698] + chars[1697] + chars[1696] + chars[1695] + chars[1694] + chars[1693] + chars[1692] + chars[1691] + chars[1690] + chars[1689] + chars[1688] + chars[1687] + chars[1686] + chars[1685] + chars[1684] + chars[1683] + chars[1682] + chars[1681] + chars[1680] + chars[1679] + chars[1678] + chars[1677] + chars[1676] + chars[1675] + chars[1674] + chars[1673] + chars[1672] + chars[1671] + chars[1670] + chars[1669] + chars[1668] + chars[1667] + chars[1666] + chars[1665] + chars[1664] + chars[1663] + chars[1662] + chars[1661] + chars[1660] + chars[1659] + chars[1658] + chars[1657] + chars[1656] + chars[1655] + chars[1654] + chars[1653] + chars[1652] + chars[1651] + chars[1650] + chars[1649] + chars[1648] + chars[1647] + chars[1646] + chars[1645] + chars[1644] + chars[1643] + chars[1642] + chars[1641] + chars[1640] + chars[1639] + chars[1638] + chars[1637] + chars[1636] + chars[1635] + chars[1634] + chars[1633] + chars[1632] + chars[1631] + chars[1630] + chars[1629] + chars[1628] + chars[1627] + chars[1626] + chars[1625] + chars[1624] + chars[1623] + chars[1622] + chars[1621] + chars[1620] + chars[1619] + chars[1618] + chars[1617] + chars[1616] + chars[1615] + chars[1614] + chars[1613] + chars[1612] + chars[1611] + chars[1610] + chars[1609] + chars[1608] + chars[1607] + chars[1606] + chars[1605] + chars[1604] + chars[1603] + chars[1602] + chars[1601] + chars[1600] + /*
*/chars[1599] + chars[1598] + chars[1597] + chars[1596] + chars[1595] + chars[1594] + chars[1593] + chars[1592] + chars[1591] + chars[1590] + chars[1589] + chars[1588] + chars[1587] + chars[1586] + chars[1585] + chars[1584] + chars[1583] + chars[1582] + chars[1581] + chars[1580] + chars[1579] + chars[1578] + chars[1577] + chars[1576] + chars[1575] + chars[1574] + chars[1573] + chars[1572] + chars[1571] + chars[1570] + chars[1569] + chars[1568] + chars[1567] + chars[1566] + chars[1565] + chars[1564] + chars[1563] + chars[1562] + chars[1561] + chars[1560] + chars[1559] + chars[1558] + chars[1557] + chars[1556] + chars[1555] + chars[1554] + chars[1553] + chars[1552] + chars[1551] + chars[1550] + chars[1549] + chars[1548] + chars[1547] + chars[1546] + chars[1545] + chars[1544] + chars[1543] + chars[1542] + chars[1541] + chars[1540] + chars[1539] + chars[1538] + chars[1537] + chars[1536] + chars[1535] + chars[1534] + chars[1533] + chars[1532] + chars[1531] + chars[1530] + chars[1529] + chars[1528] + chars[1527] + chars[1526] + chars[1525] + chars[1524] + chars[1523] + chars[1522] + chars[1521] + chars[1520] + chars[1519] + chars[1518] + chars[1517] + chars[1516] + chars[1515] + chars[1514] + chars[1513] + chars[1512] + chars[1511] + chars[1510] + chars[1509] + chars[1508] + chars[1507] + chars[1506] + chars[1505] + chars[1504] + chars[1503] + chars[1502] + chars[1501] + chars[1500] + /*
*/chars[1499] + chars[1498] + chars[1497] + chars[1496] + chars[1495] + chars[1494] + chars[1493] + chars[1492] + chars[1491] + chars[1490] + chars[1489] + chars[1488] + chars[1487] + chars[1486] + chars[1485] + chars[1484] + chars[1483] + chars[1482] + chars[1481] + chars[1480] + chars[1479] + chars[1478] + chars[1477] + chars[1476] + chars[1475] + chars[1474] + chars[1473] + chars[1472] + chars[1471] + chars[1470] + chars[1469] + chars[1468] + chars[1467] + chars[1466] + chars[1465] + chars[1464] + chars[1463] + chars[1462] + chars[1461] + chars[1460] + chars[1459] + chars[1458] + chars[1457] + chars[1456] + chars[1455] + chars[1454] + chars[1453] + chars[1452] + chars[1451] + chars[1450] + chars[1449] + chars[1448] + chars[1447] + chars[1446] + chars[1445] + chars[1444] + chars[1443] + chars[1442] + chars[1441] + chars[1440] + chars[1439] + chars[1438] + chars[1437] + chars[1436] + chars[1435] + chars[1434] + chars[1433] + chars[1432] + chars[1431] + chars[1430] + chars[1429] + chars[1428] + chars[1427] + chars[1426] + chars[1425] + chars[1424] + chars[1423] + chars[1422] + chars[1421] + chars[1420] + chars[1419] + chars[1418] + chars[1417] + chars[1416] + chars[1415] + chars[1414] + chars[1413] + chars[1412] + chars[1411] + chars[1410] + chars[1409] + chars[1408] + chars[1407] + chars[1406] + chars[1405] + chars[1404] + chars[1403] + chars[1402] + chars[1401] + chars[1400] + /*
*/chars[1399] + chars[1398] + chars[1397] + chars[1396] + chars[1395] + chars[1394] + chars[1393] + chars[1392] + chars[1391] + chars[1390] + chars[1389] + chars[1388] + chars[1387] + chars[1386] + chars[1385] + chars[1384] + chars[1383] + chars[1382] + chars[1381] + chars[1380] + chars[1379] + chars[1378] + chars[1377] + chars[1376] + chars[1375] + chars[1374] + chars[1373] + chars[1372] + chars[1371] + chars[1370] + chars[1369] + chars[1368] + chars[1367] + chars[1366] + chars[1365] + chars[1364] + chars[1363] + chars[1362] + chars[1361] + chars[1360] + chars[1359] + chars[1358] + chars[1357] + chars[1356] + chars[1355] + chars[1354] + chars[1353] + chars[1352] + chars[1351] + chars[1350] + chars[1349] + chars[1348] + chars[1347] + chars[1346] + chars[1345] + chars[1344] + chars[1343] + chars[1342] + chars[1341] + chars[1340] + chars[1339] + chars[1338] + chars[1337] + chars[1336] + chars[1335] + chars[1334] + chars[1333] + chars[1332] + chars[1331] + chars[1330] + chars[1329] + chars[1328] + chars[1327] + chars[1326] + chars[1325] + chars[1324] + chars[1323] + chars[1322] + chars[1321] + chars[1320] + chars[1319] + chars[1318] + chars[1317] + chars[1316] + chars[1315] + chars[1314] + chars[1313] + chars[1312] + chars[1311] + chars[1310] + chars[1309] + chars[1308] + chars[1307] + chars[1306] + chars[1305] + chars[1304] + chars[1303] + chars[1302] + chars[1301] + chars[1300] + /*
*/chars[1299] + chars[1298] + chars[1297] + chars[1296] + chars[1295] + chars[1294] + chars[1293] + chars[1292] + chars[1291] + chars[1290] + chars[1289] + chars[1288] + chars[1287] + chars[1286] + chars[1285] + chars[1284] + chars[1283] + chars[1282] + chars[1281] + chars[1280] + chars[1279] + chars[1278] + chars[1277] + chars[1276] + chars[1275] + chars[1274] + chars[1273] + chars[1272] + chars[1271] + chars[1270] + chars[1269] + chars[1268] + chars[1267] + chars[1266] + chars[1265] + chars[1264] + chars[1263] + chars[1262] + chars[1261] + chars[1260] + chars[1259] + chars[1258] + chars[1257] + chars[1256] + chars[1255] + chars[1254] + chars[1253] + chars[1252] + chars[1251] + chars[1250] + chars[1249] + chars[1248] + chars[1247] + chars[1246] + chars[1245] + chars[1244] + chars[1243] + chars[1242] + chars[1241] + chars[1240] + chars[1239] + chars[1238] + chars[1237] + chars[1236] + chars[1235] + chars[1234] + chars[1233] + chars[1232] + chars[1231] + chars[1230] + chars[1229] + chars[1228] + chars[1227] + chars[1226] + chars[1225] + chars[1224] + chars[1223] + chars[1222] + chars[1221] + chars[1220] + chars[1219] + chars[1218] + chars[1217] + chars[1216] + chars[1215] + chars[1214] + chars[1213] + chars[1212] + chars[1211] + chars[1210] + chars[1209] + chars[1208] + chars[1207] + chars[1206] + chars[1205] + chars[1204] + chars[1203] + chars[1202] + chars[1201] + chars[1200] + /*
*/chars[1199] + chars[1198] + chars[1197] + chars[1196] + chars[1195] + chars[1194] + chars[1193] + chars[1192] + chars[1191] + chars[1190] + chars[1189] + chars[1188] + chars[1187] + chars[1186] + chars[1185] + chars[1184] + chars[1183] + chars[1182] + chars[1181] + chars[1180] + chars[1179] + chars[1178] + chars[1177] + chars[1176] + chars[1175] + chars[1174] + chars[1173] + chars[1172] + chars[1171] + chars[1170] + chars[1169] + chars[1168] + chars[1167] + chars[1166] + chars[1165] + chars[1164] + chars[1163] + chars[1162] + chars[1161] + chars[1160] + chars[1159] + chars[1158] + chars[1157] + chars[1156] + chars[1155] + chars[1154] + chars[1153] + chars[1152] + chars[1151] + chars[1150] + chars[1149] + chars[1148] + chars[1147] + chars[1146] + chars[1145] + chars[1144] + chars[1143] + chars[1142] + chars[1141] + chars[1140] + chars[1139] + chars[1138] + chars[1137] + chars[1136] + chars[1135] + chars[1134] + chars[1133] + chars[1132] + chars[1131] + chars[1130] + chars[1129] + chars[1128] + chars[1127] + chars[1126] + chars[1125] + chars[1124] + chars[1123] + chars[1122] + chars[1121] + chars[1120] + chars[1119] + chars[1118] + chars[1117] + chars[1116] + chars[1115] + chars[1114] + chars[1113] + chars[1112] + chars[1111] + chars[1110] + chars[1109] + chars[1108] + chars[1107] + chars[1106] + chars[1105] + chars[1104] + chars[1103] + chars[1102] + chars[1101] + chars[1100] + /*
*/chars[1099] + chars[1098] + chars[1097] + chars[1096] + chars[1095] + chars[1094] + chars[1093] + chars[1092] + chars[1091] + chars[1090] + chars[1089] + chars[1088] + chars[1087] + chars[1086] + chars[1085] + chars[1084] + chars[1083] + chars[1082] + chars[1081] + chars[1080] + chars[1079] + chars[1078] + chars[1077] + chars[1076] + chars[1075] + chars[1074] + chars[1073] + chars[1072] + chars[1071] + chars[1070] + chars[1069] + chars[1068] + chars[1067] + chars[1066] + chars[1065] + chars[1064] + chars[1063] + chars[1062] + chars[1061] + chars[1060] + chars[1059] + chars[1058] + chars[1057] + chars[1056] + chars[1055] + chars[1054] + chars[1053] + chars[1052] + chars[1051] + chars[1050] + chars[1049] + chars[1048] + chars[1047] + chars[1046] + chars[1045] + chars[1044] + chars[1043] + chars[1042] + chars[1041] + chars[1040] + chars[1039] + chars[1038] + chars[1037] + chars[1036] + chars[1035] + chars[1034] + chars[1033] + chars[1032] + chars[1031] + chars[1030] + chars[1029] + chars[1028] + chars[1027] + chars[1026] + chars[1025] + chars[1024] + chars[1023] + chars[1022] + chars[1021] + chars[1020] + chars[1019] + chars[1018] + chars[1017] + chars[1016] + chars[1015] + chars[1014] + chars[1013] + chars[1012] + chars[1011] + chars[1010] + chars[1009] + chars[1008] + chars[1007] + chars[1006] + chars[1005] + chars[1004] + chars[1003] + chars[1002] + chars[1001] + chars[1000] + /*
*/chars[999] + chars[998] + chars[997] + chars[996] + chars[995] + chars[994] + chars[993] + chars[992] + chars[991] + chars[990] + chars[989] + chars[988] + chars[987] + chars[986] + chars[985] + chars[984] + chars[983] + chars[982] + chars[981] + chars[980] + chars[979] + chars[978] + chars[977] + chars[976] + chars[975] + chars[974] + chars[973] + chars[972] + chars[971] + chars[970] + chars[969] + chars[968] + chars[967] + chars[966] + chars[965] + chars[964] + chars[963] + chars[962] + chars[961] + chars[960] + chars[959] + chars[958] + chars[957] + chars[956] + chars[955] + chars[954] + chars[953] + chars[952] + chars[951] + chars[950] + chars[949] + chars[948] + chars[947] + chars[946] + chars[945] + chars[944] + chars[943] + chars[942] + chars[941] + chars[940] + chars[939] + chars[938] + chars[937] + chars[936] + chars[935] + chars[934] + chars[933] + chars[932] + chars[931] + chars[930] + chars[929] + chars[928] + chars[927] + chars[926] + chars[925] + chars[924] + chars[923] + chars[922] + chars[921] + chars[920] + chars[919] + chars[918] + chars[917] + chars[916] + chars[915] + chars[914] + chars[913] + chars[912] + chars[911] + chars[910] + chars[909] + chars[908] + chars[907] + chars[906] + chars[905] + chars[904] + chars[903] + chars[902] + chars[901] + chars[900] + /*
*/chars[899] + chars[898] + chars[897] + chars[896] + chars[895] + chars[894] + chars[893] + chars[892] + chars[891] + chars[890] + chars[889] + chars[888] + chars[887] + chars[886] + chars[885] + chars[884] + chars[883] + chars[882] + chars[881] + chars[880] + chars[879] + chars[878] + chars[877] + chars[876] + chars[875] + chars[874] + chars[873] + chars[872] + chars[871] + chars[870] + chars[869] + chars[868] + chars[867] + chars[866] + chars[865] + chars[864] + chars[863] + chars[862] + chars[861] + chars[860] + chars[859] + chars[858] + chars[857] + chars[856] + chars[855] + chars[854] + chars[853] + chars[852] + chars[851] + chars[850] + chars[849] + chars[848] + chars[847] + chars[846] + chars[845] + chars[844] + chars[843] + chars[842] + chars[841] + chars[840] + chars[839] + chars[838] + chars[837] + chars[836] + chars[835] + chars[834] + chars[833] + chars[832] + chars[831] + chars[830] + chars[829] + chars[828] + chars[827] + chars[826] + chars[825] + chars[824] + chars[823] + chars[822] + chars[821] + chars[820] + chars[819] + chars[818] + chars[817] + chars[816] + chars[815] + chars[814] + chars[813] + chars[812] + chars[811] + chars[810] + chars[809] + chars[808] + chars[807] + chars[806] + chars[805] + chars[804] + chars[803] + chars[802] + chars[801] + chars[800] + /*
*/chars[799] + chars[798] + chars[797] + chars[796] + chars[795] + chars[794] + chars[793] + chars[792] + chars[791] + chars[790] + chars[789] + chars[788] + chars[787] + chars[786] + chars[785] + chars[784] + chars[783] + chars[782] + chars[781] + chars[780] + chars[779] + chars[778] + chars[777] + chars[776] + chars[775] + chars[774] + chars[773] + chars[772] + chars[771] + chars[770] + chars[769] + chars[768] + chars[767] + chars[766] + chars[765] + chars[764] + chars[763] + chars[762] + chars[761] + chars[760] + chars[759] + chars[758] + chars[757] + chars[756] + chars[755] + chars[754] + chars[753] + chars[752] + chars[751] + chars[750] + chars[749] + chars[748] + chars[747] + chars[746] + chars[745] + chars[744] + chars[743] + chars[742] + chars[741] + chars[740] + chars[739] + chars[738] + chars[737] + chars[736] + chars[735] + chars[734] + chars[733] + chars[732] + chars[731] + chars[730] + chars[729] + chars[728] + chars[727] + chars[726] + chars[725] + chars[724] + chars[723] + chars[722] + chars[721] + chars[720] + chars[719] + chars[718] + chars[717] + chars[716] + chars[715] + chars[714] + chars[713] + chars[712] + chars[711] + chars[710] + chars[709] + chars[708] + chars[707] + chars[706] + chars[705] + chars[704] + chars[703] + chars[702] + chars[701] + chars[700] + /*
*/chars[699] + chars[698] + chars[697] + chars[696] + chars[695] + chars[694] + chars[693] + chars[692] + chars[691] + chars[690] + chars[689] + chars[688] + chars[687] + chars[686] + chars[685] + chars[684] + chars[683] + chars[682] + chars[681] + chars[680] + chars[679] + chars[678] + chars[677] + chars[676] + chars[675] + chars[674] + chars[673] + chars[672] + chars[671] + chars[670] + chars[669] + chars[668] + chars[667] + chars[666] + chars[665] + chars[664] + chars[663] + chars[662] + chars[661] + chars[660] + chars[659] + chars[658] + chars[657] + chars[656] + chars[655] + chars[654] + chars[653] + chars[652] + chars[651] + chars[650] + chars[649] + chars[648] + chars[647] + chars[646] + chars[645] + chars[644] + chars[643] + chars[642] + chars[641] + chars[640] + chars[639] + chars[638] + chars[637] + chars[636] + chars[635] + chars[634] + chars[633] + chars[632] + chars[631] + chars[630] + chars[629] + chars[628] + chars[627] + chars[626] + chars[625] + chars[624] + chars[623] + chars[622] + chars[621] + chars[620] + chars[619] + chars[618] + chars[617] + chars[616] + chars[615] + chars[614] + chars[613] + chars[612] + chars[611] + chars[610] + chars[609] + chars[608] + chars[607] + chars[606] + chars[605] + chars[604] + chars[603] + chars[602] + chars[601] + chars[600] + /*
*/chars[599] + chars[598] + chars[597] + chars[596] + chars[595] + chars[594] + chars[593] + chars[592] + chars[591] + chars[590] + chars[589] + chars[588] + chars[587] + chars[586] + chars[585] + chars[584] + chars[583] + chars[582] + chars[581] + chars[580] + chars[579] + chars[578] + chars[577] + chars[576] + chars[575] + chars[574] + chars[573] + chars[572] + chars[571] + chars[570] + chars[569] + chars[568] + chars[567] + chars[566] + chars[565] + chars[564] + chars[563] + chars[562] + chars[561] + chars[560] + chars[559] + chars[558] + chars[557] + chars[556] + chars[555] + chars[554] + chars[553] + chars[552] + chars[551] + chars[550] + chars[549] + chars[548] + chars[547] + chars[546] + chars[545] + chars[544] + chars[543] + chars[542] + chars[541] + chars[540] + chars[539] + chars[538] + chars[537] + chars[536] + chars[535] + chars[534] + chars[533] + chars[532] + chars[531] + chars[530] + chars[529] + chars[528] + chars[527] + chars[526] + chars[525] + chars[524] + chars[523] + chars[522] + chars[521] + chars[520] + chars[519] + chars[518] + chars[517] + chars[516] + chars[515] + chars[514] + chars[513] + chars[512] + chars[511] + chars[510] + chars[509] + chars[508] + chars[507] + chars[506] + chars[505] + chars[504] + chars[503] + chars[502] + chars[501] + chars[500] + /*
*/chars[499] + chars[498] + chars[497] + chars[496] + chars[495] + chars[494] + chars[493] + chars[492] + chars[491] + chars[490] + chars[489] + chars[488] + chars[487] + chars[486] + chars[485] + chars[484] + chars[483] + chars[482] + chars[481] + chars[480] + chars[479] + chars[478] + chars[477] + chars[476] + chars[475] + chars[474] + chars[473] + chars[472] + chars[471] + chars[470] + chars[469] + chars[468] + chars[467] + chars[466] + chars[465] + chars[464] + chars[463] + chars[462] + chars[461] + chars[460] + chars[459] + chars[458] + chars[457] + chars[456] + chars[455] + chars[454] + chars[453] + chars[452] + chars[451] + chars[450] + chars[449] + chars[448] + chars[447] + chars[446] + chars[445] + chars[444] + chars[443] + chars[442] + chars[441] + chars[440] + chars[439] + chars[438] + chars[437] + chars[436] + chars[435] + chars[434] + chars[433] + chars[432] + chars[431] + chars[430] + chars[429] + chars[428] + chars[427] + chars[426] + chars[425] + chars[424] + chars[423] + chars[422] + chars[421] + chars[420] + chars[419] + chars[418] + chars[417] + chars[416] + chars[415] + chars[414] + chars[413] + chars[412] + chars[411] + chars[410] + chars[409] + chars[408] + chars[407] + chars[406] + chars[405] + chars[404] + chars[403] + chars[402] + chars[401] + chars[400] + /*
*/chars[399] + chars[398] + chars[397] + chars[396] + chars[395] + chars[394] + chars[393] + chars[392] + chars[391] + chars[390] + chars[389] + chars[388] + chars[387] + chars[386] + chars[385] + chars[384] + chars[383] + chars[382] + chars[381] + chars[380] + chars[379] + chars[378] + chars[377] + chars[376] + chars[375] + chars[374] + chars[373] + chars[372] + chars[371] + chars[370] + chars[369] + chars[368] + chars[367] + chars[366] + chars[365] + chars[364] + chars[363] + chars[362] + chars[361] + chars[360] + chars[359] + chars[358] + chars[357] + chars[356] + chars[355] + chars[354] + chars[353] + chars[352] + chars[351] + chars[350] + chars[349] + chars[348] + chars[347] + chars[346] + chars[345] + chars[344] + chars[343] + chars[342] + chars[341] + chars[340] + chars[339] + chars[338] + chars[337] + chars[336] + chars[335] + chars[334] + chars[333] + chars[332] + chars[331] + chars[330] + chars[329] + chars[328] + chars[327] + chars[326] + chars[325] + chars[324] + chars[323] + chars[322] + chars[321] + chars[320] + chars[319] + chars[318] + chars[317] + chars[316] + chars[315] + chars[314] + chars[313] + chars[312] + chars[311] + chars[310] + chars[309] + chars[308] + chars[307] + chars[306] + chars[305] + chars[304] + chars[303] + chars[302] + chars[301] + chars[300] + /*
*/chars[299] + chars[298] + chars[297] + chars[296] + chars[295] + chars[294] + chars[293] + chars[292] + chars[291] + chars[290] + chars[289] + chars[288] + chars[287] + chars[286] + chars[285] + chars[284] + chars[283] + chars[282] + chars[281] + chars[280] + chars[279] + chars[278] + chars[277] + chars[276] + chars[275] + chars[274] + chars[273] + chars[272] + chars[271] + chars[270] + chars[269] + chars[268] + chars[267] + chars[266] + chars[265] + chars[264] + chars[263] + chars[262] + chars[261] + chars[260] + chars[259] + chars[258] + chars[257] + chars[256] + chars[255] + chars[254] + chars[253] + chars[252] + chars[251] + chars[250] + chars[249] + chars[248] + chars[247] + chars[246] + chars[245] + chars[244] + chars[243] + chars[242] + chars[241] + chars[240] + chars[239] + chars[238] + chars[237] + chars[236] + chars[235] + chars[234] + chars[233] + chars[232] + chars[231] + chars[230] + chars[229] + chars[228] + chars[227] + chars[226] + chars[225] + chars[224] + chars[223] + chars[222] + chars[221] + chars[220] + chars[219] + chars[218] + chars[217] + chars[216] + chars[215] + chars[214] + chars[213] + chars[212] + chars[211] + chars[210] + chars[209] + chars[208] + chars[207] + chars[206] + chars[205] + chars[204] + chars[203] + chars[202] + chars[201] + chars[200] + /*
*/chars[199] + chars[198] + chars[197] + chars[196] + chars[195] + chars[194] + chars[193] + chars[192] + chars[191] + chars[190] + chars[189] + chars[188] + chars[187] + chars[186] + chars[185] + chars[184] + chars[183] + chars[182] + chars[181] + chars[180] + chars[179] + chars[178] + chars[177] + chars[176] + chars[175] + chars[174] + chars[173] + chars[172] + chars[171] + chars[170] + chars[169] + chars[168] + chars[167] + chars[166] + chars[165] + chars[164] + chars[163] + chars[162] + chars[161] + chars[160] + chars[159] + chars[158] + chars[157] + chars[156] + chars[155] + chars[154] + chars[153] + chars[152] + chars[151] + chars[150] + chars[149] + chars[148] + chars[147] + chars[146] + chars[145] + chars[144] + chars[143] + chars[142] + chars[141] + chars[140] + chars[139] + chars[138] + chars[137] + chars[136] + chars[135] + chars[134] + chars[133] + chars[132] + chars[131] + chars[130] + chars[129] + chars[128] + chars[127] + chars[126] + chars[125] + chars[124] + chars[123] + chars[122] + chars[121] + chars[120] + chars[119] + chars[118] + chars[117] + chars[116] + chars[115] + chars[114] + chars[113] + chars[112] + chars[111] + chars[110] + chars[109] + chars[108] + chars[107] + chars[106] + chars[105] + chars[104] + chars[103] + chars[102] + chars[101] + chars[100] + /*
*/chars[99] + chars[98] + chars[97] + chars[96] + chars[95] + chars[94] + chars[93] + chars[92] + chars[91] + chars[90] + chars[89] + chars[88] + chars[87] + chars[86] + chars[85] + chars[84] + chars[83] + chars[82] + chars[81] + chars[80] + chars[79] + chars[78] + chars[77] + chars[76] + chars[75] + chars[74] + chars[73] + chars[72] + chars[71] + chars[70] + chars[69] + chars[68] + chars[67] + chars[66] + chars[65] + chars[64] + chars[63] + chars[62] + chars[61] + chars[60] + chars[59] + chars[58] + chars[57] + chars[56] + chars[55] + chars[54] + chars[53] + chars[52] + chars[51] + chars[50] + chars[49] + chars[48] + chars[47] + chars[46] + chars[45] + chars[44] + chars[43] + chars[42] + chars[41] + chars[40] + chars[39] + chars[38] + chars[37] + chars[36] + chars[35] + chars[34] + chars[33] + chars[32] + chars[31] + chars[30] + chars[29] + chars[28] + chars[27] + chars[26] + chars[25] + chars[24] + chars[23] + chars[22] + chars[21] + chars[20] + chars[19] + chars[18] + chars[17] + chars[16] + chars[15] + chars[14] + chars[13] + chars[12] + chars[11] + chars[10] + chars[9] + chars[8] + chars[7] + chars[6] + chars[5] + chars[4] + chars[3] + chars[2] + chars[1] + chars[0]

Above code generated with c++
 
Last edited by a moderator:
Level 26
Joined
Aug 18, 2009
Messages
4,097
Can you change
JASS:
//! import
the way that when using relative paths, it primarily appends the given argument to the location of the current .j file (the one this import line is written in)?

Example:

  • abc (folder)
    • index.j --> import "localscript.j"
    • localscript.j
  • def (folder)
    • index.j --> import "localscript.j"
    • localscript.j
  • root.j --> import "abc/index.j"; import "def/index.j"

root.j loads the index.j files of different folders, which is possible because the folders are stated in the import directives. Also, in abc/index.j for example, you can just write "localscript.j" since the previously imported abc/index.j now serves as a new lookup folder. However, when def/index.j tries to apply its very own localscript, jasshelper thinks that this file was already imported due to the same argument. It does not recognize the different origin.

I want to be able to nest my code externally without getting into name conflicts and without stating redundantly long paths.
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
What doesn't work about it!? More clarity is something you need here!

One thing this reminds me of is that whether you write "public scope" within a library or simply "scope", it is treated as "public scope" (meaning, compiled with the library prefix). It makes more sense to compile it with the library prefix if the user explicity writes "public scope" and without the prefix if he writes "scope".

Also, while on the subject of prefixes, I don't know how much complexity this would add, but "keywords" aught to run before textmacros. Then you could have textmacros which are prefixed privately to the library where the textmacro was implemented, thereby being able to protect those contents from the user.
 
Level 31
Joined
Jul 10, 2007
Messages
6,306
This tool is unsafe to use. The following code crashes jasshelper. Vexorian's jasshelper handles this code perfectly without crashing.

Commenting out some of the module implementations makes cohador's jasswhelper go into some sort of infinite loop.
JASS:
library TimerTools
    private module Alloc
        private static integer array recycler
        private static integer instanceCount = 0
        debug private static boolean enabled = true
        
        static method allocate takes nothing returns thistype
            local thistype this = recycler[0]
            
            debug if (not enabled) then
                debug return 1/0
            debug endif
            
            if (this == 0) then
                debug if (instanceCount == 8191) then
                    debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"ALLOC OVERFLOW") 
                    debug set enabled = false
                    debug set this = 1/0
                debug endif
                
                set this = instanceCount + 1
                set instanceCount = this
            else
                set recycler[0] = recycler[this]
            endif
            
            debug set recycler[this] = -1
            
            return this
        endmethod
        
        method deallocate takes nothing returns nothing
            debug if (not enabled) then
                debug set this = 1/0
            debug endif
            
            debug if (recycler[this] != -1 or this == 0) then
                debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"ATTEMPT TO DEALLOCATE NULL STRUCT INSTANCE")
                debug set this = 1/0
                debug set enabled = false
            debug endif
            
            set recycler[this] = recycler[0]
            set recycler[0] = this
        endmethod
    endmodule
    
    private module Queue
        thistype next
        thistype last
        
        method queueEnqueue takes thistype node returns nothing
            set last.next = node
            set last = node
            set node.next = 0
        endmethod
        
        method queueClear takes nothing returns nothing
            set last = this
            set next = 0
        endmethod
    endmodule
    
    private module SingleStack
        thistype next
            
        static method operator stackFirst takes nothing returns thistype
            return thistype(0).next
        endmethod
        
        static method stackPush takes thistype this returns nothing
            set next = thistype(0).next
            set thistype(0).next = this
        endmethod
        
        static method stackClear takes nothing returns nothing
            set thistype(0).next = 0
        endmethod
    endmodule
    
    private module CircularList
        thistype next
        thistype prev
    
        method listAdd takes thistype node returns nothing
            debug if (0 != next) then
                debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"T CIRCULAR LIST ERROR: ATTEMPT TO ADD ALREADY ADDED NODE TO LIST")
                debug set node = 1/0
            debug endif
            
            set node.next = this
            set node.prev = prev
            set prev.next = node
            set prev = node
        endmethod
        
        method listRemove takes nothing returns nothing
            debug if (0 == next) then
                debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"T CIRCULAR LIST ERROR: ATTEMPT TO REMOVE ALREADY REMOVE NODE FROM LIST")
                debug set this = 1/0
            debug endif
            
            set prev.next = next
            set next.prev = prev
            
            set next = 0
        endmethod
    endmodule
    
    //hiveworkshop.com/forums/jass-functions-413/snippet-natural-logarithm-108059/
    //credits to BlinkBoy
    private function Ln takes real a returns real
        local real s = 0
        
        loop
            exitwhen a < 2.71828
            
            set a = a/2.71828
            set s = s + 1
        endloop
        
        return s + (a - 1)*(1 + 8/(1 + a) + 1/a)/6
    endfunction
    
    /*
    *   This stores timers that are to be added to a sublist of a timer group after
    *   that sublist expires.
    *
    *   This is iterated over after a sublist expires
    */
    private struct TimerAddQueue extends array
        implement Queue
    endstruct
    
    /*
    *   This stores timers to be destroyed. This is iterated over after any sublist expires.
    */
    private struct TimerDestructionStack extends array
        implement SingleStack
    endstruct
    
    /*
    *   A sublist is a list of actual timer nodes that expire at the same time
    */
    private struct TimerSubGroup extends array
        implement CircularList
        implement Alloc
        
        //nodes for a specific trigger for a specific timer
    endstruct
    
    /*
    *   Actual nodes that contain data and are pushed into stacks and queues
    */
    private struct TimerNode extends array
        implement Alloc
    endstruct
    
    /*
    *   This stores a list of sublists that have the same timeouts
    */
    private struct TimerGroup extends array
        implement CircularList
        implement Alloc
        
        static method create takes nothing returns thistype
            local thistype this = allocate()
            
            set next = this
            set prev = this
            
            return this
            
            return 0
        endmethod
    endstruct
    
    /*
    *   Relates methods to timer groups
    */
    private struct CodeGroup extends array
        private static hashtable table = InitHashtable()
    
        static method operator [] takes boolexpr c returns TimerGroup
            local integer handleId = GetHandleId(c)
            local TimerGroup this = LoadInteger(table, handleId, 0)
            
            if (0 == this) then
                set this = TimerGroup.allocate()
                
                call SaveInteger(table, handleId, 0, this)
            endif
            
            return this
        endmethod
    endstruct
endlibrary

It does appear that cohador is now inactive, so we likely need to move back to vexorian's.

I was recoding Timer Tools for my vjass tut stuff ^)^. I only have a few lessons to do in it before I move to the c++ tuts, so I wanted the last few lessons to be awesome : D.

Luckily I don't need to worry about initialization order to finish the tutorial series, so I can just stick with vex's and add a note to my tuts not to get cohador's jasshelper for now =).
 
Level 31
Joined
Jul 10, 2007
Messages
6,306
Requiring people to constantly switch around compilers is pretty annoying. It's been working fine for me but here you are pushing the envelope.

The differences in code between the two are pretty small. Someone should just use a version checker and find the culprit.

cjass was thrown out for a couple of errors, I don't see why you are giving cohador's jasshelper special treatment. It made it in as a tool and it still had bugs in it. Tools with bugs have traditionally not been allowed to be used. I don't know of any scripts that are using cohador's for loops, so I don't even see the problem here. The only thing that needs to be resolved is initialization in scripts (things moving back to module initializers). It may be an annoyance, but it's not the end of the world. It's not like when I had to completely recode 30+ scripts in cjass back to vjass when I ran into critical cjass errors.


Now, I can understand if new features for cohador's jasshelper didn't work, but code that runs perfectly fine in vexorian's completely crashes cohador's jasshelper, and that is not acceptable.


Scripts, like before, should require module initializers for proper initialization. Vexorian's should be the standard. I'm not going to trust cohador's again until it has been tested very thoroughly in a new version.


The other thing we could try doing is a language that works absolutely perfectly and has lots of support for stuff -> http://www.hiveworkshop.com/forums/warcraft-editing-tools-277/jass-infinity-220098/, but I frankly don't really want to work on it anymore. If someone wants the source code for the Lua stuff and the parsing, I'll give it. Bison is frankly a pain and the latest versions are really built for GNU, so I'm not going to deal with Cohador's.

Believe me, the Lua c++ stuff is super easy. The annoying thing is the parsing. I looked at the language specifications for parsing c# and c++ and they were completely different and way better than the start of what I was doing with JASS Infinity, so you'd really have to study up on parsing to do it well. My focus isn't in lexical analysis, which is the primary reason why I don't want to do it. Frankly, it would be a waste of my time as it would not go towards anything I need for the future :\. I'm not going to need lexical analysis for the stuff I'm doing, so there is no reason for me to learn it. It's just like I'm not going to need to do graphics programming, which is why I won't learn DirectX or OpenGL stuff ;p.


Anyways, those are my thoughts. If Cohador comes back and fixes it and some serious testing is done, that's fine. If not, either a new language needs to be made, someone else has to go into cohador's src and fix it (and it's Bison, which is a pain), or the community is stuck with Vexorian's. Those are the options.
 
Level 15
Joined
Feb 15, 2006
Messages
851
Moyack uploaded a JNGP on blizzmodding.info with an edited wehack.lua to allow you to switch compilers easily in the toolbar. So if anything, that will probably be the best.

http://blizzardmodding.info/4263/jass-newgen-pack-jngp/msg38360/

It requires registration to download though. I might upload a mirror eventually though.
Ok, fixed the link, now you can download without register. Download here: http://wc3modding.info/4263/the-jass-newgen-pack-jngp-1-5e/

And for any support, use the same link. Or give me a big hello:grin:

cjass was thrown out for a couple of errors, I don't see why you are giving cohador's jasshelper special treatment. It made it in as a tool and it still had bugs in it. Tools with bugs have traditionally not been allowed to be used. I don't know of any scripts that are using cohador's for loops, so I don't even see the problem here. The only thing that needs to be resolved is initialization in scripts (things moving back to module initializers). It may be an annoyance, but it's not the end of the world. It's not like when I had to completely recode 30+ scripts in cjass back to vjass when I ran into critical cjass errors.
Because Cohadar's version not only did a keyword addition but made compiling faster. And that's the reason you can change to Vexorian version when you want.


Now, I can understand if new features for cohador's jasshelper didn't work, but code that runs perfectly fine in vexorian's completely crashes cohador's jasshelper, and that is not acceptable.
Actually is very rare see this situation, I can count them 3 or 4 cases, so that's not a big deal.


Scripts, like before, should require module initializers for proper initialization. Vexorian's should be the standard. I'm not going to trust cohador's again until it has been tested very thoroughly in a new version.
As I said, blizzmod JNGP let you set by default the compiler of your like.


The other thing we could try doing is a language that works absolutely perfectly and has lots of support for stuff -> http://www.hiveworkshop.com/forums/warcraft-editing-tools-277/jass-infinity-220098/, but I frankly don't really want to work on it anymore. If someone wants the source code for the Lua stuff and the parsing, I'll give it. Bison is frankly a pain and the latest versions are really built for GNU, so I'm not going to deal with Cohador's.
Hmm, we can work on that, the idea is not to restrict the development, and this proposal expands the usability for mapping.
Code:
#awesome = Unit.create('hpea')
#awesome.name = "awesome"
#awesome.goldCost = 60
local integer goldCost = $awesome.goldCost //awesome?
Does this script support access to object data?? If so it's definitely a wonderful option!!

Anyways, those are my thoughts. If Cohador comes back and fixes it and some serious testing is done, that's fine. If not, either a new language needs to be made, someone else has to go into cohador's src and fix it (and it's Bison, which is a pain), or the community is stuck with Vexorian's. Those are the options.
I'm not an expert in programming but if I can get the source, I could check what was done and try to fix it. That's the way I learn things.

One of the things I've learned in this activity is that sticking to things is a bad idea, we should be flexibles and avoid standards as much as possible, we're not here to impose ways to do stuff (as wc3c does with their scripts), just by the experience and the proof of efficiency we advance.

I'm checking Barade's wc3lib to see if we can add new tools to this pack, like... model editing?? well,it's just an idea, but if I can achieve it Damn!!!
 
Last edited:
Level 15
Joined
Feb 15, 2006
Messages
851
HELLO moyackx! thanks for that but I like the white background when you type codes, any help how to get it done?...
Sure just copy this text into Styles.ini file:

Code:
[Block]
Foreground=0x000000
Background=default
Bold=1
Italic=0
Underline=0
[Keyword]
Foreground=default
Background=default
Bold=1
Italic=0
Underline=0
[Value]
Foreground=0x0000AA
Background=default
Bold=0
Italic=0
Underline=0
[Type]
Foreground=0x0055AA
Background=default
Bold=1
Italic=0
Underline=0
[Native]
Foreground=0x800080
Background=default
Bold=0
Italic=0
Underline=0
[BJ]
Foreground=0xFF0000
Background=default
Bold=0
Italic=0
Underline=0
[Constant]
Foreground=0x0000AA
Background=default
Bold=0
Italic=0
Underline=0
[Comment]
Foreground=0x008800
Background=default
Bold=0
Italic=1
Underline=0
[Preprocessor Comment]
Foreground=0x777777
Background=default
Bold=0
Italic=0
Underline=0
[String]
Foreground=0x0000AA
Background=default
Bold=0
Italic=1
Underline=0
[Number]
Foreground=0x0000AA
Background=default
Bold=0
Italic=0
Underline=0
[Raw Code]
Foreground=default
Background=default
Bold=1
Italic=1
Underline=1
[OK Braces]
Foreground=default
Background=default
Bold=1
Italic=0
Underline=0
[Bad Braces]
Foreground=0xFF0000
Background=default
Bold=1
Italic=0
Underline=0
[Background]
Color=system(5)
[Fold]
Color 1=system(15)
Color 2=system(15)
[FoldMarkers]
Foreground=0x0000FF
Background=0x00FFFF
[Selection]
Foreground=system(14)
Background=system(13)
Alpha=256
[WhiteSpace]
Foreground=0xFFFF00
Background=default
[Caret]
Foreground=0x000000
Background=0xFFFF00
Alpha=60
Visible=1
[Line Numbers]
Background=system(15)

And this text in TESH.ini:
Code:
[Placement]
FLLeft=376
FLTop=308
FLWidth=528
FLHeight=408
FLListSize=150
BottomPanelHeight=100
RightPanelWidth=100
[Other]
ShowWarning=0
ListOnTop=1
ACCaseInsensitive=0
DoNotSaveScrollDef=0
[Editor]
DoFold=1
LineNum=1
AutoComplete=1
FuncList=1
OnlyFoldFunc=0
[LineNumFont]
Name=Courier New
Size=10
Color=0
Style=0
[EditorFont]
Name=Courier New
Size=10
Color=0
Style=0

Both files are in the TESH folder.

Quote from Cohador after telling him that his tool is broken



Tool is never going to be fixed unless someone else fixes it.
Where is the source code?? we can just check and see if it works.
 
Status
Not open for further replies.
Top