From 3fcc36d0b0677a0eb437d5ac941ea9e70a33b71f Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 8 Feb 2009 14:56:43 +0000 Subject: [PATCH 01/63] 2.5: RNA auto pointer type detection didn't find right types. If two RNA structs have the same DNA structs it should use the first defined one, could be smarter but for now this makes it work again. --- source/blender/makesrna/intern/makesrna.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 84f4462dabe..800ee1f5ca1 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -1411,8 +1411,8 @@ static int rna_preprocess(char *outfile) } } - rna_sort(brna); rna_auto_types(); + rna_sort(brna); status= (DefRNA.error != 0); From eb929804d20341b22c4217ec436ebcf4b2192c9d Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sun, 8 Feb 2009 19:15:59 +0000 Subject: [PATCH 02/63] 2.5 Added CTRL+W save Blender file. It's the first user of the uiPupMenuSaveOver() function, which I've recoded to accept an operator pointer. This is required because the operator property 'filename' has to be set to work. Other 'save over' users will require running operators too I guess. --- source/blender/editors/include/UI_interface.h | 3 +- .../editors/interface/interface_handlers.c | 2 + .../editors/interface/interface_intern.h | 1 + .../editors/interface/interface_regions.c | 62 +++++++++++++------ .../windowmanager/intern/wm_operators.c | 32 +++++++++- 5 files changed, 78 insertions(+), 22 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 575654f49b1..6fc392b0968 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -238,9 +238,8 @@ void uiMenuSeparator(uiMenuItem *head); uiMenuItem *uiPupMenuBegin(const char *title, int icon); void uiPupMenuEnd(struct bContext *C, struct uiMenuItem *head); -void uiPupMenu(struct bContext *C, int maxrow, uiMenuHandleFunc func, void *arg, char *str, ...); void uiPupMenuOkee(struct bContext *C, char *opname, char *str, ...); -void uiPupMenuSaveOver(struct bContext *C, char *opname, char *filename, ...); +void uiPupMenuSaveOver(struct bContext *C, struct wmOperator *op, char *filename); void uiPupMenuNotice(struct bContext *C, char *str, ...); void uiPupMenuError(struct bContext *C, char *str, ...); void uiPupMenuReports(struct bContext *C, struct ReportList *reports); diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index c23124de586..c98d5fdf4a1 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -3753,6 +3753,8 @@ static int ui_handler_popup(bContext *C, wmEvent *event, void *userdata) if(temp.opname) WM_operator_name_call(C, temp.opname, temp.opcontext, NULL); } + else if(temp.cancel_func) + temp.cancel_func(temp.popup_arg); } else { /* re-enable tooltips */ diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 4f3b211c9de..7f35189788f 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -279,6 +279,7 @@ struct uiPopupBlockHandle { int popup; void (*popup_func)(struct bContext *C, void *arg, int event); + void (*cancel_func)(void *arg); void *popup_arg; /* for operator popups */ diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 4dd5dd76637..71eb9782e52 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -2203,8 +2203,10 @@ void uiPupMenuEnd(bContext *C, uiMenuItem *head) MEM_freeN(head); } -/* this one only to be called with operatortype name option */ -void uiPupMenu(bContext *C, int maxrow, uiMenuHandleFunc func, void *arg, char *str, ...) +/* ************** standard pupmenus *************** */ + +/* this one can called with operatortype name and operators */ +static uiPopupBlockHandle *ui_pup_menu(bContext *C, int maxrow, uiMenuHandleFunc func, void *arg, char *str, ...) { wmWindow *window= CTX_wm_window(C); uiPupMenuInfo info; @@ -2224,11 +2226,12 @@ void uiPupMenu(bContext *C, int maxrow, uiMenuHandleFunc func, void *arg, char * menu->popup_func= func; menu->popup_arg= arg; + + return menu; } -/* standard pupmenus */ -static void operator_cb(bContext *C, void *arg, int retval) +static void operator_name_cb(bContext *C, void *arg, int retval) { const char *opname= arg; @@ -2236,7 +2239,7 @@ static void operator_cb(bContext *C, void *arg, int retval) WM_operator_name_call(C, opname, WM_OP_EXEC_DEFAULT, NULL); } -static void vconfirm(bContext *C, char *opname, char *title, char *itemfmt, va_list ap) +static void vconfirm_opname(bContext *C, char *opname, char *title, char *itemfmt, va_list ap) { char *s, buf[512]; @@ -2244,18 +2247,37 @@ static void vconfirm(bContext *C, char *opname, char *title, char *itemfmt, va_l if (title) s+= sprintf(s, "%s%%t|", title); vsprintf(s, itemfmt, ap); - uiPupMenu(C, 0, operator_cb, opname, buf); + ui_pup_menu(C, 0, operator_name_cb, opname, buf); } -static void confirm(bContext *C, char *opname, char *title, char *itemfmt, ...) +static void operator_cb(bContext *C, void *arg, int retval) { - va_list ap; - - va_start(ap, itemfmt); - vconfirm(C, opname, title, itemfmt, ap); - va_end(ap); + wmOperator *op= arg; + + if(op && retval > 0) + WM_operator_call(C, op); + else + WM_operator_free(op); } +static void confirm_cancel_operator(void *opv) +{ + WM_operator_free(opv); +} + +static void confirm_operator(bContext *C, wmOperator *op, char *title, char *item) +{ + uiPopupBlockHandle *handle; + char *s, buf[512]; + + s= buf; + if (title) s+= sprintf(s, "%s%%t|%s", title, item); + + handle= ui_pup_menu(C, 0, operator_cb, op, buf); + handle->cancel_func= confirm_cancel_operator; +} + + void uiPupMenuOkee(bContext *C, char *opname, char *str, ...) { va_list ap; @@ -2264,11 +2286,12 @@ void uiPupMenuOkee(bContext *C, char *opname, char *str, ...) sprintf(titlestr, "OK? %%i%d", ICON_HELP); va_start(ap, str); - vconfirm(C, opname, titlestr, str, ap); + vconfirm_opname(C, opname, titlestr, str, ap); va_end(ap); } -void uiPupMenuSaveOver(bContext *C, char *opname, char *filename, ...) + +void uiPupMenuSaveOver(bContext *C, wmOperator *op, char *filename) { size_t len= strlen(filename); @@ -2276,14 +2299,15 @@ void uiPupMenuSaveOver(bContext *C, char *opname, char *filename, ...) return; if(BLI_exists(filename)==0) - operator_cb(C, opname, 1); + operator_cb(C, op, 1); if(filename[len-1]=='/' || filename[len-1]=='\\') { uiPupMenuError(C, "Cannot overwrite a directory"); + WM_operator_free(op); return; } - confirm(C, opname, "Save over", filename); + confirm_operator(C, op, "Save over", filename); } void uiPupMenuNotice(bContext *C, char *str, ...) @@ -2291,7 +2315,7 @@ void uiPupMenuNotice(bContext *C, char *str, ...) va_list ap; va_start(ap, str); - vconfirm(C, NULL, NULL, str, ap); + vconfirm_opname(C, NULL, NULL, str, ap); va_end(ap); } @@ -2306,7 +2330,7 @@ void uiPupMenuError(bContext *C, char *str, ...) sprintf(nfmt, "%s", str); va_start(ap, str); - vconfirm(C, NULL, titlestr, nfmt, ap); + vconfirm_opname(C, NULL, titlestr, nfmt, ap); va_end(ap); } @@ -2331,7 +2355,7 @@ void uiPupMenuReports(bContext *C, ReportList *reports) } str= BLI_dynstr_get_cstring(ds); - uiPupMenu(C, 0, NULL, NULL, str); + ui_pup_menu(C, 0, NULL, NULL, str); MEM_freeN(str); BLI_dynstr_free(ds); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index c54d738822f..5ebca6842b1 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -417,6 +417,7 @@ static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *even return OPERATOR_RUNNING_MODAL; } +/* function used for WM_OT_save_mainfile too */ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; @@ -431,7 +432,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) static void WM_OT_save_as_mainfile(wmOperatorType *ot) { - ot->name= "Open Blender File"; + ot->name= "Save As Blender File"; ot->idname= "WM_OT_save_as_mainfile"; ot->invoke= wm_save_as_mainfile_invoke; @@ -444,6 +445,33 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot) } +/* *************** Save file directly ******** */ + +static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + + RNA_string_set(op->ptr, "filename", G.sce); + uiPupMenuSaveOver(C, op, G.sce); + + return OPERATOR_RUNNING_MODAL; +} + +static void WM_OT_save_mainfile(wmOperatorType *ot) +{ + ot->name= "Save Blender File"; + ot->idname= "WM_OT_save_mainfile"; + + ot->invoke= wm_save_mainfile_invoke; + ot->exec= wm_save_as_mainfile_exec; + ot->poll= WM_operator_winactive; + + ot->flag= 0; + + RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); + +} + + /* *********************** */ static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot) @@ -1192,6 +1220,7 @@ void wm_operatortype_init(void) WM_operatortype_append(WM_OT_open_mainfile); WM_operatortype_append(WM_OT_jobs_timer); WM_operatortype_append(WM_OT_save_as_mainfile); + WM_operatortype_append(WM_OT_save_mainfile); } /* default keymap for windows and screens, only call once per WM */ @@ -1208,6 +1237,7 @@ void wm_window_keymap(wmWindowManager *wm) WM_keymap_verify_item(keymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_verify_item(keymap, "WM_OT_open_recentfile", OKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_verify_item(keymap, "WM_OT_open_mainfile", F1KEY, KM_PRESS, 0, 0); + WM_keymap_verify_item(keymap, "WM_OT_save_mainfile", WKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_verify_item(keymap, "WM_OT_save_as_mainfile", F2KEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", F11KEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0); From 7d6e7914de9b4ff3c846adb2a3304d2f818500e2 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sun, 8 Feb 2009 23:41:21 +0000 Subject: [PATCH 03/63] Armature Tools - Ported Switch Direction (Alt-F) This is one of the few armature tools where it is currently not that easy/desireable to port to use context-loops exclusively, since they depend on working with 'chains' of bones from the tips to the roots, which cannot be easily done using EditBones. --- .../editors/armature/armature_intern.h | 2 + .../blender/editors/armature/armature_ops.c | 2 + .../blender/editors/armature/editarmature.c | 41 ++++++++++++++----- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index fd91b70dcdd..dc13e2475ee 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -36,6 +36,8 @@ void armature_bone_rename(Object *ob, char *oldnamep, char *newnamep); void ARMATURE_OT_align_bones(struct wmOperatorType *ot); void ARMATURE_OT_calculate_roll(struct wmOperatorType *ot); +void ARMATURE_OT_switch_direction(struct wmOperatorType *ot); + void POSE_OT_hide(struct wmOperatorType *ot); void POSE_OT_reveil(struct wmOperatorType *ot); diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index 6736561e36c..d2749128004 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -109,6 +109,7 @@ void ED_operatortypes_armature(void) { WM_operatortype_append(ARMATURE_OT_align_bones); WM_operatortype_append(ARMATURE_OT_calculate_roll); + WM_operatortype_append(ARMATURE_OT_switch_direction); WM_operatortype_append(POSE_OT_hide); WM_operatortype_append(POSE_OT_reveil); @@ -131,6 +132,7 @@ void ED_keymap_armature(wmWindowManager *wm) // WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_align_bones", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_calculate_roll", NKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_switch_direction", FKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_test", TKEY, KM_PRESS, 0, 0); // XXX temp test for context iterators... to be removed diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 1d3d1f9b567..943d7f324ab 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3294,18 +3294,22 @@ void subdivide_armature(Scene *scene, int numcuts) else BIF_undo_push("Subdivide multi"); } -/* switch direction of bone chains */ -void switch_direction_armature (Scene *scene) +/* ----------- */ + +/* Switch Direction operator: + * Currently, this does not use context loops, as context loops do not make it + * easy to retrieve any hierarchial/chain relationships which are necessary for + * this to be done easily. + */ + +static int armature_switch_direction_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX get from context - bArmature *arm= (obedit) ? obedit->data : NULL; + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_edit_object(C); + bArmature *arm= (bArmature *)ob->data; ListBase chains = {NULL, NULL}; LinkData *chain; - /* error checking paranoia */ - if (arm == NULL) - return; - /* get chains of bones (ends on chains) */ chains_find_tips(arm->edbo, &chains); if (chains.first == NULL) return; @@ -3363,9 +3367,26 @@ void switch_direction_armature (Scene *scene) } /* free chains */ - BLI_freelistN(&chains); + BLI_freelistN(&chains); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); - BIF_undo_push("Switch Direction"); + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_switch_direction(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Switch Direction"; + ot->idname= "ARMATURE_OT_switch_direction"; + + /* api callbacks */ + ot->exec = armature_switch_direction_exec; + ot->poll = ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } /* ***************** EditBone Alignment ********************* */ From 5e0c553b153e2b9358f335ea06db9db4fd564ea9 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 01:27:44 +0000 Subject: [PATCH 04/63] Armature Editing: Subdivide Operators * Added back the Subdivide tools. Use the Alt-S hotkey (for now) to get a menu with the subdivision options. There are also two standalone operators which are not used yet. * Fixed the PoseMode checking callback to make sure that it doesn't override any tools in EditMode. * Fixed an old comment in transform code, and a few warnings in editarmature.c --- .../editors/armature/armature_intern.h | 3 + .../blender/editors/armature/armature_ops.c | 7 + .../blender/editors/armature/editarmature.c | 230 ++++++++++++------ source/blender/editors/screen/screen_ops.c | 5 +- source/blender/editors/transform/transform.c | 2 +- 5 files changed, 174 insertions(+), 73 deletions(-) diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index dc13e2475ee..af9082730e3 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -37,6 +37,9 @@ void armature_bone_rename(Object *ob, char *oldnamep, char *newnamep); void ARMATURE_OT_align_bones(struct wmOperatorType *ot); void ARMATURE_OT_calculate_roll(struct wmOperatorType *ot); void ARMATURE_OT_switch_direction(struct wmOperatorType *ot); +void ARMATURE_OT_subdivs(struct wmOperatorType *ot); +void ARMATURE_OT_subdivide_simple(struct wmOperatorType *ot); +void ARMATURE_OT_subdivide_multi(struct wmOperatorType *ot); void POSE_OT_hide(struct wmOperatorType *ot); diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index d2749128004..7bdc4973f30 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -110,6 +110,9 @@ void ED_operatortypes_armature(void) WM_operatortype_append(ARMATURE_OT_align_bones); WM_operatortype_append(ARMATURE_OT_calculate_roll); WM_operatortype_append(ARMATURE_OT_switch_direction); + WM_operatortype_append(ARMATURE_OT_subdivs); + WM_operatortype_append(ARMATURE_OT_subdivide_simple); + WM_operatortype_append(ARMATURE_OT_subdivide_multi); WM_operatortype_append(POSE_OT_hide); WM_operatortype_append(POSE_OT_reveil); @@ -132,8 +135,12 @@ void ED_keymap_armature(wmWindowManager *wm) // WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_align_bones", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_calculate_roll", NKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_switch_direction", FKEY, KM_PRESS, KM_ALT, 0); + /* only menu is registered in keymaps for now */ + WM_keymap_add_item(keymap, "ARMATURE_OT_subdivs", SKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_test", TKEY, KM_PRESS, 0, 0); // XXX temp test for context iterators... to be removed /* Pose ------------------------ */ diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 943d7f324ab..9ae7b8c8198 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -88,6 +88,8 @@ #include "ED_util.h" #include "ED_view3d.h" +#include "UI_interface.h" + #include "armature_intern.h" #include "meshlaplacian.h" @@ -3218,80 +3220,167 @@ void extrude_armature(Scene *scene, int forked) } -/* context; editmode armature */ -void subdivide_armature(Scene *scene, int numcuts) -{ - Object *obedit= scene->obedit; // XXX get from context - bArmature *arm= obedit->data; - EditBone *ebone, *newbone, *tbone, *mbone; - int a, i; - - if (numcuts < 1) return; +/* ----------- */ - for (mbone = arm->edbo->last; mbone; mbone= mbone->prev) { - if (EBONE_VISIBLE(arm, mbone)) { - if (mbone->flag & BONE_SELECTED) { - for (i=numcuts+1; i>1; i--) { - /* compute cut ratio first */ - float cutratio= 1/(float)i; - float cutratioI= 1-cutratio; - - /* take care of mirrored stuff */ - for (a=0; a<2; a++) { - float val1[3]; - float val2[3]; - float val3[3]; - - /* try to find mirrored bone on a != 0 */ - if (a) { - if (arm->flag & ARM_MIRROR_EDIT) - ebone= ED_armature_bone_get_mirrored(arm->edbo, mbone); - else - ebone= NULL; - } - else - ebone= mbone; - - if (ebone) { - newbone= MEM_mallocN(sizeof(EditBone), "ebone subdiv"); - *newbone = *ebone; - BLI_addtail(arm->edbo, newbone); - - /* calculate location of newbone->head */ - VECCOPY(val1, ebone->head); - VECCOPY(val2, ebone->tail); - VECCOPY(val3, newbone->head); - - val3[0]= val1[0]*cutratio+val2[0]*cutratioI; - val3[1]= val1[1]*cutratio+val2[1]*cutratioI; - val3[2]= val1[2]*cutratio+val2[2]*cutratioI; - - VECCOPY(newbone->head, val3); - VECCOPY(newbone->tail, ebone->tail); - VECCOPY(ebone->tail, newbone->head); - - newbone->rad_head= 0.5*(ebone->rad_head+ebone->rad_tail); - ebone->rad_tail= newbone->rad_head; - - newbone->flag |= BONE_CONNECTED; - - unique_editbone_name (arm->edbo, newbone->name); - - /* correct parent bones */ - for (tbone = arm->edbo->first; tbone; tbone=tbone->next) { - if (tbone->parent==ebone) - tbone->parent= newbone; - } - newbone->parent= ebone; - } - } - } +/* Subdivide Operators: + * This group of operators all use the same 'exec' callback, but they are called + * through several different operators - a combined menu (which just calls the exec in the + * appropriate ways), and two separate ones. + */ + +/* context; editmode armature */ +static int armature_subdivide_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + bArmature *arm= obedit->data; + EditBone *newbone, *tbone; + int numcuts, i; + + /* there may not be a number_cuts property defined (for 'simple' subdivide) */ + if (RNA_property_is_set(op->ptr, "number_cuts")) + numcuts= RNA_int_get(op->ptr, "number_cuts"); + else + numcuts= 1; + + /* loop over all editable bones */ + // XXX the old code did this in reverse order though! + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) + { + for (i=numcuts+1; i>1; i--) { + /* compute cut ratio first */ + float cutratio= 1.0f / (float)i; + float cutratioI= 1.0f - cutratio; + + float val1[3]; + float val2[3]; + float val3[3]; + + newbone= MEM_mallocN(sizeof(EditBone), "ebone subdiv"); + *newbone = *ebone; + BLI_addtail(arm->edbo, newbone); + + /* calculate location of newbone->head */ + VECCOPY(val1, ebone->head); + VECCOPY(val2, ebone->tail); + VECCOPY(val3, newbone->head); + + val3[0]= val1[0]*cutratio + val2[0]*cutratioI; + val3[1]= val1[1]*cutratio + val2[1]*cutratioI; + val3[2]= val1[2]*cutratio + val2[2]*cutratioI; + + VECCOPY(newbone->head, val3); + VECCOPY(newbone->tail, ebone->tail); + VECCOPY(ebone->tail, newbone->head); + + newbone->rad_head= 0.5f * (ebone->rad_head + ebone->rad_tail); + ebone->rad_tail= newbone->rad_head; + + newbone->flag |= BONE_CONNECTED; + + unique_editbone_name(arm->edbo, newbone->name); + + /* correct parent bones */ + for (tbone = arm->edbo->first; tbone; tbone=tbone->next) { + if (tbone->parent==ebone) + tbone->parent= newbone; } + newbone->parent= ebone; } } + CTX_DATA_END; - if (numcuts==1) BIF_undo_push("Subdivide"); - else BIF_undo_push("Subdivide multi"); + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, obedit); + + return OPERATOR_FINISHED; +} + + +void ARMATURE_OT_subdivide_simple(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Subdivide Simple"; + ot->idname= "ARMATURE_OT_subdivide_simple"; + + /* api callbacks */ + ot->exec = armature_subdivide_exec; + ot->poll = ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +void ARMATURE_OT_subdivide_multi(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Subdivide Multi"; + ot->idname= "ARMATURE_OT_subdivide_multi"; + + /* api callbacks */ + ot->exec = armature_subdivide_exec; + ot->poll = ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* Properties */ + RNA_def_int(ot->srna, "number_cuts", 2, 1, 100, "Number of Cuts", "", 1, INT_MAX); +} + + + +static int armature_subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + uiMenuItem *head; + + head= uiPupMenuBegin("Subdivision Type", 0); + uiMenuItemsEnumO(head, "ARMATURE_OT_subdivs", "type"); + uiPupMenuEnd(C, head); + + return OPERATOR_CANCELLED; +} + +static int armature_subdivs_exec(bContext *C, wmOperator *op) +{ + switch (RNA_int_get(op->ptr, "type")) + { + case 0: /* simple */ + RNA_int_set(op->ptr, "number_cuts", 1); + armature_subdivide_exec(C, op); + break; + case 1: /* multi */ + armature_subdivide_exec(C, op); + break; + } + + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_subdivs(wmOperatorType *ot) +{ + static EnumPropertyItem type_items[]= { + {0, "SIMPLE", "Simple", ""}, + {1, "MULTI", "Multi", ""}, + {0, NULL, NULL}}; + + /* identifiers */ + ot->name= "subdivs"; + ot->idname= "ARMATURE_OT_subdivs"; + + /* api callbacks */ + ot->invoke= armature_subdivs_invoke; + ot->exec= armature_subdivs_exec; + + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_enum(ot->srna, "type", type_items, 0, "Type", ""); + + /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/ + RNA_def_int(ot->srna, "number_cuts", 2, 1, 100, "Number of Cuts", "", 1, INT_MAX); } /* ----------- */ @@ -3304,7 +3393,6 @@ void subdivide_armature(Scene *scene, int numcuts) static int armature_switch_direction_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_edit_object(C); bArmature *arm= (bArmature *)ob->data; ListBase chains = {NULL, NULL}; @@ -3312,7 +3400,7 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *op) /* get chains of bones (ends on chains) */ chains_find_tips(arm->edbo, &chains); - if (chains.first == NULL) return; + if (chains.first == NULL) return OPERATOR_CANCELLED; /* loop over chains, only considering selected and visible bones */ for (chain= chains.first; chain; chain= chain->next) { diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 160d5ccd9d8..6f064b3db86 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -190,8 +190,11 @@ int ED_operator_editarmature(bContext *C) int ED_operator_posemode(bContext *C) { Object *obact= CTX_data_active_object(C); - if(obact && obact->type==OB_ARMATURE) + Object *obedit= CTX_data_edit_object(C); + + if ((obact != obedit) && (obact) && (obact->type==OB_ARMATURE)) return (obact->flag & OB_POSEMODE)!=0; + return 0; } diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 76c4721003b..37781f68179 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1162,7 +1162,7 @@ int transformEnd(bContext *C, TransInfo *t) /* free data */ postTrans(t); - /* aftertrans does insert ipos and action channels, and clears base flags, doesnt read transdata */ + /* aftertrans does insert keyframes, and clears base flags, doesnt read transdata */ special_aftertrans_update(t); /* send events out for redraws */ From 0139d9d121c5c44f8ccc0d36c11f11f3f7d674ae Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 01:33:50 +0000 Subject: [PATCH 05/63] 2.5 Fixed memory leaks when closing Blender without exiting Armature EditMode first. Ton/Brecht - mesh editmode (and a few others I think) are still leaking in this case. --- source/blender/blenkernel/intern/armature.c | 8 ++++++++ source/blender/editors/armature/editarmature.c | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 841759ef153..69fb50bcf2b 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -132,6 +132,14 @@ void free_armature(bArmature *arm) if (arm) { /* unlink_armature(arm);*/ free_bones(arm); + + /* free editmode data */ + if (arm->edbo) { + BLI_freelistN(arm->edbo); + + MEM_freeN(arm->edbo); + arm->edbo= NULL; + } } } diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 9ae7b8c8198..b82c0d2a6c8 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3228,7 +3228,6 @@ void extrude_armature(Scene *scene, int forked) * appropriate ways), and two separate ones. */ -/* context; editmode armature */ static int armature_subdivide_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); From 85231e5fd44ee67469eedcbdc9d1a0dc64ff822f Mon Sep 17 00:00:00 2001 From: Matt Ebb Date: Mon, 9 Feb 2009 02:54:40 +0000 Subject: [PATCH 06/63] * Some more 2.5 theme updates --- source/blender/editors/include/UI_interface.h | 1 + .../editors/interface/interface_draw.c | 7 +++- .../editors/interface/interface_regions.c | 1 + source/blender/editors/interface/resources.c | 32 +++++++++---------- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 6fc392b0968..f516d953bc5 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -84,6 +84,7 @@ typedef struct uiPopupBlockHandle uiPopupBlockHandle; #define UI_BLOCK_NO_HILITE 64 /* XXX 2.5 not implemented */ #define UI_BLOCK_MOVEMOUSE_QUIT 128 #define UI_BLOCK_KEEP_OPEN 256 +#define UI_BLOCK_POPUP 512 /* uiPopupBlockHandle->menuretval */ #define UI_RETURN_CANCEL 1 /* cancel all menus cascading */ diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index db9f621c1fd..26a15bc05c9 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -2163,7 +2163,12 @@ void uiDrawMenuBox(float minx, float miny, float maxx, float maxy, short flag, s UI_GetThemeColor4ubv(TH_MENU_BACK, col); if (rounded) { - if (direction == UI_DOWN) { + if (flag & UI_BLOCK_POPUP) { + uiSetRoundBox(15); + miny -= 4.0; + maxy += 4.0; + } + else if (direction == UI_DOWN) { uiSetRoundBox(12); miny -= 4.0; } else if (direction == UI_TOP) { diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 71eb9782e52..f5f5a98129d 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -682,6 +682,7 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut saferct= MEM_callocN(sizeof(uiSafetyRct), "uiSafetyRct"); saferct->safety= block->safety; BLI_addhead(&block->saferct, saferct); + block->flag |= UI_BLOCK_POPUP; } /* the block and buttons were positioned in window space as in 2.4x, now diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 8b320de8257..33e738cfc68 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -439,19 +439,19 @@ void ui_theme_init_userdef(void) SETCOL(btheme->tipo.back, 120, 120, 120, 255); SETCOL(btheme->tipo.header, 195, 195, 195, 255); SETCOL(btheme->tipo.panel, 255, 255, 255, 150); - SETCOL(btheme->tipo.shade1, 172, 172, 172, 100); - SETCOL(btheme->tipo.shade2, 0x70, 0x70, 0x70, 100); - SETCOL(btheme->tipo.vertex, 0xff, 0x70, 0xff, 255); - SETCOL(btheme->tipo.vertex_select, 0xff, 0xff, 0x70, 255); + SETCOL(btheme->tipo.shade1, 172, 172, 172, 100); + SETCOL(btheme->tipo.shade2, 0x70, 0x70, 0x70, 100); + SETCOL(btheme->tipo.vertex, 0, 0, 0, 255); + SETCOL(btheme->tipo.vertex_select, 255, 133, 0, 255); SETCOL(btheme->tipo.hilite, 0x60, 0xc0, 0x40, 255); btheme->tipo.vertex_size= 3; - SETCOL(btheme->tipo.handle_vertex, 0xff, 0x70, 0xff, 255); - SETCOL(btheme->tipo.handle_vertex_select, 0xff, 0xff, 0x70, 255); + SETCOL(btheme->tipo.handle_vertex, 0, 0, 0, 255); + SETCOL(btheme->tipo.handle_vertex_select, 255, 133, 0, 255); btheme->tipo.handle_vertex_size= 3; - SETCOL(btheme->tipo.ds_channel, 0x36, 0x13, 0xca, 255); - SETCOL(btheme->tipo.ds_subchannel, 0x60, 0x43, 0xd2, 255); + SETCOL(btheme->tipo.ds_channel, 82, 96, 110, 255); + SETCOL(btheme->tipo.ds_subchannel, 124, 137, 150, 255); /* space file */ /* to have something initialized */ @@ -478,8 +478,8 @@ void ui_theme_init_userdef(void) SETCOL(btheme->tact.strip, 78, 78, 78, 255); SETCOL(btheme->tact.group, 22, 112, 0, 255); SETCOL(btheme->tact.group_active, 125, 233, 96, 255); - SETCOL(btheme->tact.ds_channel, 0x36, 0x13, 0xca, 255); - SETCOL(btheme->tact.ds_subchannel, 0x60, 0x43, 0xd2, 255); + SETCOL(btheme->tact.ds_channel, 82, 96, 110, 255); + SETCOL(btheme->tact.ds_subchannel, 124, 137, 150, 255); /* space nla */ @@ -511,12 +511,12 @@ void ui_theme_init_userdef(void) /* space image */ btheme->tima= btheme->tv3d; SETCOL(btheme->tima.back, 53, 53, 53, 255); - SETCOL(btheme->tima.vertex, 0xff, 0x70, 0xff, 255); - SETCOL(btheme->tima.vertex_select, 0xff, 0xff, 0x70, 255); - btheme->tima.vertex_size= 2; - btheme->tima.facedot_size= 2; - SETCOL(btheme->tima.face, 0, 50, 150, 40); - SETCOL(btheme->tima.face_select, 200, 100, 200, 80); + SETCOL(btheme->tima.vertex, 0, 0, 0, 255); + SETCOL(btheme->tima.vertex_select, 255, 133, 0, 255); + btheme->tima.vertex_size= 3; + btheme->tima.facedot_size= 3; + SETCOL(btheme->tima.face, 255, 255, 255, 10); + SETCOL(btheme->tima.face_select, 255, 133, 0, 60); SETCOL(btheme->tima.editmesh_active, 255, 255, 255, 128); /* space imageselect */ From 52e1121669cdf4a0b23bbc41eb8d1d342c19ba87 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 03:06:52 +0000 Subject: [PATCH 07/63] 2.5 - Animation UI tweaks * Frame-change (scrubbing) now works when using LMB select. It now uses ACTIONMOUSE, so it doesn't conflict with selection. However, the check for exiting the modal op currently needs to check for LEFTMOUSE and/or RIGHTMOUSE instead of ACTIONMOUSE otherwise errors occur. * Renamed the 'DopeSheet Editor' entry to simply 'DopeSheet' --- source/blender/editors/animation/anim_ops.c | 19 ++++++++++++++----- source/blender/editors/screen/area.c | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c index 80b9ba9801e..5aa0d50bdbf 100644 --- a/source/blender/editors/animation/anim_ops.c +++ b/source/blender/editors/animation/anim_ops.c @@ -172,12 +172,20 @@ static int change_frame_modal(bContext *C, wmOperator *op, wmEvent *event) { /* execute the events */ switch (event->type) { + case ESCKEY: + change_frame_exit(C, op); + return OPERATOR_FINISHED; + case MOUSEMOVE: RNA_int_set(op->ptr, "frame", frame_from_event(C, event)); change_frame_apply(C, op); break; - - case LEFTMOUSE: + + case LEFTMOUSE: + case RIGHTMOUSE: + /* we check for either mouse-button to end, as checking for ACTIONMOUSE (which is used to init + * the modal op) doesn't work for some reason + */ if (event->val==0) { change_frame_exit(C, op); return OPERATOR_FINISHED; @@ -378,11 +386,12 @@ void ED_keymap_anim(wmWindowManager *wm) { ListBase *keymap= WM_keymap_listbase(wm, "Animation", 0, 0); - /* frame management */ - WM_keymap_verify_item(keymap, "ANIM_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0); + /* frame management */ + /* NOTE: 'ACTIONMOUSE' not 'LEFTMOUSE', as user may have swapped mouse-buttons */ + WM_keymap_verify_item(keymap, "ANIM_OT_change_frame", ACTIONMOUSE, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "ANIM_OT_time_toggle", TKEY, KM_PRESS, KM_CTRL, 0); - /* preview range */ + /* preview range */ WM_keymap_verify_item(keymap, "ANIM_OT_previewrange_define", PKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_verify_item(keymap, "ANIM_OT_previewrange_clear", PKEY, KM_PRESS, KM_ALT, 0); } diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index bc90728f23e..c22be24fd0b 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -771,7 +771,7 @@ static char *windowtype_pup(void) "|%l" // 33 "|Graph Editor %x2" //54 - "|DopeSheet Editor %x12" //73 + "|DopeSheet %x12" //73 "|NLA Editor %x13" //94 "|%l" //97 From eb848445fb44808aed86bc4238ab02c497c1eb2f Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 04:39:25 +0000 Subject: [PATCH 08/63] 2.5 - Assorted View2D-Related Cleanups * Removed Sequencer's own 'border zoom' tool. There is a generic one in View2D that should be used instead. * Changed the hotkey for View2D's version of borderzoom to Shift-B * Fixed a few hotkey mentions entries in old menus * Added set start/end frame operators for TimeLine. (SKEY and EKEY) * Fixed various issues in Graph Editor - channels area is now drawn wide enough to show the 'protect' toggles without needing to scroll - new Graph Editors have 'auto-snap' enabled by default --- source/blender/editors/interface/view2d.c | 14 +-- source/blender/editors/interface/view2d_ops.c | 2 +- .../editors/space_action/space_action.c | 3 +- .../blender/editors/space_graph/space_graph.c | 5 +- .../editors/space_sequencer/sequencer_edit.c | 66 +------------- .../space_sequencer/sequencer_header.c | 10 +-- .../space_sequencer/sequencer_intern.h | 1 - .../editors/space_sequencer/sequencer_ops.c | 2 - .../blender/editors/space_time/space_time.c | 2 +- .../blender/editors/space_time/time_header.c | 4 +- source/blender/editors/space_time/time_ops.c | 85 ++++++++++++++++++- 11 files changed, 106 insertions(+), 88 deletions(-) diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 73fa62ba33e..9e91abf14c5 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -69,7 +69,7 @@ static int view2d_scroll_mapped(int scroll) } /* called each time cur changes, to dynamically update masks */ -static void view2_masks(View2D *v2d) +static void view2d_masks(View2D *v2d) { int scroll; @@ -93,9 +93,9 @@ static void view2_masks(View2D *v2d) scroll= view2d_scroll_mapped(v2d->scroll); /* scrollers shrink mask area, but should be based off regionsize - * - they can only be on one to two edges of the region they define - * - if they overlap, they must not occupy the corners (which are reserved for other widgets) - */ + * - they can only be on one to two edges of the region they define + * - if they overlap, they must not occupy the corners (which are reserved for other widgets) + */ if (scroll) { /* vertical scroller */ if (scroll & V2D_SCROLL_LEFT) { @@ -107,7 +107,7 @@ static void view2_masks(View2D *v2d) else if (scroll & V2D_SCROLL_RIGHT) { /* on right-hand edge of region */ v2d->vert= v2d->mask; - v2d->vert.xmax++; /* one pixel extra... was having leaving a minor gap... */ + v2d->vert.xmax++; /* one pixel extra... was leaving a minor gap... */ v2d->vert.xmin= v2d->vert.xmax - V2D_SCROLL_WIDTH; v2d->mask.xmax= v2d->vert.xmin - 1; } @@ -243,7 +243,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) v2d->winy= winy; /* set masks */ - view2_masks(v2d); + view2d_masks(v2d); /* set 'tot' rect before setting cur? */ if (tot_changed) @@ -586,7 +586,7 @@ void UI_view2d_curRect_validate(View2D *v2d) } /* set masks */ - view2_masks(v2d); + view2d_masks(v2d); } /* ------------------ */ diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index cd89c520092..a83592df886 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1295,7 +1295,7 @@ void UI_view2d_keymap(wmWindowManager *wm) WM_keymap_add_item(keymap, "View2D_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0); /* borderzoom - drag */ - WM_keymap_add_item(keymap, "View2D_OT_view_borderzoom", ZKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "View2D_OT_view_borderzoom", BKEY, KM_PRESS, KM_SHIFT, 0); /* scrollers */ WM_keymap_add_item(keymap, "View2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index 0678acc6769..fea9214d081 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -74,8 +74,9 @@ static SpaceLink *action_new(const bContext *C) saction= MEM_callocN(sizeof(SpaceAction), "initaction"); saction->spacetype= SPACE_ACTION; - saction->autosnap = SACTSNAP_FRAME; + saction->autosnap = SACTSNAP_FRAME; + saction->mode= SACTCONT_DOPESHEET; /* header */ ar= MEM_callocN(sizeof(ARegion), "header for action"); diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index 4162b81974d..3644406c12f 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -68,9 +68,12 @@ static SpaceLink *graph_new(const bContext *C) ARegion *ar; SpaceIpo *sipo; + /* Graph Editor - general stuff */ sipo= MEM_callocN(sizeof(SpaceIpo), "init graphedit"); sipo->spacetype= SPACE_IPO; + sipo->autosnap= SACTSNAP_FRAME; + /* allocate DopeSheet data for Graph Editor */ sipo->ads= MEM_callocN(sizeof(bDopeSheet), "GraphEdit DopeSheet"); @@ -404,7 +407,7 @@ void ED_spacetype_ipo(void) /* regions: channels */ art= MEM_callocN(sizeof(ARegionType), "spacetype graphedit region"); art->regionid = RGN_TYPE_CHANNELS; - art->minsizex= 200; + art->minsizex= 214; /* 200 is the 'standard', but due to scrollers, we want a bit more to fit the lock icons in */ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES; art->listener= graph_region_listener; art->init= graph_channel_area_init; diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 8c70e1d9b2d..ea1b36af137 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -590,8 +590,8 @@ static void reload_sound_strip(Scene *scene, char *name) static void reload_image_strip(Scene *scene, char *name) { Editing *ed= seq_give_editing(scene, FALSE); - Sequence *seq, *seqact; - SpaceFile *sfile; + Sequence *seq=NULL, *seqact; + SpaceFile *sfile=NULL; Sequence *last_seq= get_last_seq(scene); @@ -2392,65 +2392,3 @@ void SEQUENCER_OT_view_selected(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER; } - - - - -/* borderselect operator */ -static int sequencer_view_zoom_exec(bContext *C, wmOperator *op) -{ - bScreen *sc= CTX_wm_screen(C); - ScrArea *area= CTX_wm_area(C); - View2D *v2d= UI_view2d_fromcontext(C); - rcti rect; - rctf rectf; - - int val; - short mval[2]; - - val= RNA_int_get(op->ptr, "event_type"); - rect.xmin= RNA_int_get(op->ptr, "xmin"); - rect.ymin= RNA_int_get(op->ptr, "ymin"); - rect.xmax= RNA_int_get(op->ptr, "xmax"); - rect.ymax= RNA_int_get(op->ptr, "ymax"); - - mval[0]= rect.xmin; - mval[1]= rect.ymin; - UI_view2d_region_to_view(v2d, mval[0], mval[1], &rectf.xmin, &rectf.ymin); - mval[0]= rect.xmax; - mval[1]= rect.ymax; - UI_view2d_region_to_view(v2d, mval[0], mval[1], &rectf.xmax, &rectf.ymax); - - v2d->cur= rectf; - UI_view2d_curRect_validate(v2d); - UI_view2d_sync(sc, area, v2d, V2D_LOCK_COPY); - - return OPERATOR_FINISHED; -} - - -/* ****** Border Select ****** */ -void SEQUENCER_OT_view_zoom(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "View Zoom"; - ot->idname= "SEQUENCER_OT_view_zoom"; - - /* api callbacks */ - ot->invoke= WM_border_select_invoke; - ot->exec= sequencer_view_zoom_exec; - ot->modal= WM_border_select_modal; - - ot->poll= ED_operator_sequencer_active; - - /* flags */ - ot->flag= OPTYPE_REGISTER; - - /* rna */ - RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX); - RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX); - RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX); - RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX); - RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX); -} - diff --git a/source/blender/editors/space_sequencer/sequencer_header.c b/source/blender/editors/space_sequencer/sequencer_header.c index 416fda02041..c543c13bbf5 100644 --- a/source/blender/editors/space_sequencer/sequencer_header.c +++ b/source/blender/editors/space_sequencer/sequencer_header.c @@ -113,9 +113,7 @@ static uiBlock *seq_viewmenu(bContext *C, ARegion *ar, void *arg_unused) uiDefMenuSep(block); /* Lock Time */ -#define V2D_VIEWLOCK 0 // XXX add back - - uiDefIconTextBut(block, BUTM, 1, (v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT, + uiDefIconTextBut(block, BUTM, 1, (v2d->flag & V2D_VIEWSYNC_SCREEN_TIME)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT, "Lock Time to Other Windows|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); @@ -123,9 +121,9 @@ static uiBlock *seq_viewmenu(bContext *C, ARegion *ar, void *arg_unused) uiDefMenuSep(block); if(sseq->flag & SEQ_DRAWFRAMES) - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); else - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); if(!sa->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,0, ""); @@ -501,7 +499,7 @@ void sequencer_header_buttons(const bContext *C, ARegion *ar) 0, 0, 0, 0, "Zooms view in and out (Ctrl MiddleMouse)"); xco += XIC; - uiDefIconButO(block, BUT, "SEQUENCER_OT_view_zoom", WM_OP_INVOKE_REGION_WIN, ICON_BORDERMOVE, xco,yco,XIC,YIC, "Zooms view to fit area"); + uiDefIconButO(block, BUT, "View2D_OT_view_borderzoom", WM_OP_INVOKE_REGION_WIN, ICON_BORDERMOVE, xco,yco,XIC,YIC, "Zooms view to fit area"); uiBlockEndAlign(block); xco += 8 + XIC; diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h index 613bf0c3c74..ef583e56dd4 100644 --- a/source/blender/editors/space_sequencer/sequencer_intern.h +++ b/source/blender/editors/space_sequencer/sequencer_intern.h @@ -87,7 +87,6 @@ void SEQUENCER_OT_meta_separate(struct wmOperatorType *ot); void SEQUENCER_OT_view_all(struct wmOperatorType *ot); void SEQUENCER_OT_view_selected(struct wmOperatorType *ot); -void SEQUENCER_OT_view_zoom(struct wmOperatorType *ot); /* sequencer_select.c */ void SEQUENCER_OT_deselect_all(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c index f17efe19a21..6797a080798 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -80,7 +80,6 @@ void sequencer_operatortypes(void) WM_operatortype_append(SEQUENCER_OT_view_all); WM_operatortype_append(SEQUENCER_OT_view_selected); - WM_operatortype_append(SEQUENCER_OT_view_zoom); /* sequencer_select.c */ WM_operatortype_append(SEQUENCER_OT_deselect_all); @@ -137,7 +136,6 @@ void sequencer_keymap(wmWindowManager *wm) WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all", HOMEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom", BKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c index 94ab1064eec..5b36939a471 100644 --- a/source/blender/editors/space_time/space_time.c +++ b/source/blender/editors/space_time/space_time.c @@ -314,7 +314,7 @@ void ED_spacetype_time(void) art->init= time_main_area_init; art->draw= time_main_area_draw; art->listener= time_main_area_listener; - //art->keymap= time_keymap; + art->keymap= time_keymap; BLI_addhead(&st->regiontypes, art); /* regions: header */ diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c index 7672325c114..e4acf052534 100644 --- a/source/blender/editors/space_time/time_header.c +++ b/source/blender/editors/space_time/time_header.c @@ -222,9 +222,9 @@ static uiBlock *time_viewmenu(bContext *C, ARegion *ar, void *arg_unused) uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); if(stime->flag & TIME_DRAWFRAMES) - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); else - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); uiDefIconTextBut(block, BUTM, 1, (stime->flag & TIME_ONLYACTSEL)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT, "Only Selected Data Keys|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c index 51808fbf623..b47afaf0cde 100644 --- a/source/blender/editors/space_time/time_ops.c +++ b/source/blender/editors/space_time/time_ops.c @@ -44,6 +44,8 @@ #include "UI_interface.h" #include "UI_view2d.h" +#include "ED_screen.h" + #include "RNA_access.h" #include "RNA_define.h" @@ -51,17 +53,96 @@ #include "WM_types.h" -/* *************************************************/ +/* ****************** Start/End Frame Operators *******************************/ + +static int time_set_sfra_exec (bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + int frame= CFRA; + + if (scene == NULL) + return OPERATOR_CANCELLED; + + /* if 'end frame' (Preview Range or Actual) is less than 'frame', + * clamp 'frame' to 'end frame' + */ + if (PEFRA < frame) frame= PEFRA; + + /* if Preview Range is defined, set the 'start' frame for that */ + if (scene->r.psfra) + scene->r.psfra= frame; + else + scene->r.sfra= frame; + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} + +void TIME_OT_start_frame_set (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set Start Frame"; + ot->idname= "TIME_OT_start_frame_set"; + + /* api callbacks */ + ot->exec= time_set_sfra_exec; + ot->poll= ED_operator_timeline_active; + + // XXX properties??? +} + + +static int time_set_efra_exec (bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + int frame= CFRA; + + if (scene == NULL) + return OPERATOR_CANCELLED; + + /* if 'start frame' (Preview Range or Actual) is greater than 'frame', + * clamp 'frame' to 'end frame' + */ + if (PSFRA > frame) frame= PSFRA; + + /* if Preview Range is defined, set the 'end' frame for that */ + if (scene->r.pefra) + scene->r.pefra= frame; + else + scene->r.efra= frame; + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} + +void TIME_OT_end_frame_set (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set End Frame"; + ot->idname= "TIME_OT_end_frame_set"; + + /* api callbacks */ + ot->exec= time_set_efra_exec; + ot->poll= ED_operator_timeline_active; + + // XXX properties??? +} /* ************************** registration **********************************/ void time_operatortypes(void) { - + WM_operatortype_append(TIME_OT_start_frame_set); + WM_operatortype_append(TIME_OT_end_frame_set); } void time_keymap(wmWindowManager *wm) { + ListBase *keymap= WM_keymap_listbase(wm, "TimeLine", SPACE_TIME, 0); + WM_keymap_add_item(keymap, "TIME_OT_start_frame_set", SKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "TIME_OT_end_frame_set", EKEY, KM_PRESS, 0, 0); } From 9dec5e8fa3a214da7ad406265204411aabda3c30 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 04:47:34 +0000 Subject: [PATCH 09/63] DopeSheet: Bugfix for View All (HomeKey) Removing an old line of temporary code I forgot to remove --- source/blender/editors/space_action/action_edit.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index 858da27157d..d9b752cd30d 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -114,7 +114,6 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max) /* get range and apply necessary scaling before */ calc_fcurve_range(fcu, &tmin, &tmax); - tmin= tmax= 0.0f; // xxx if (nob) { tmin= get_action_frame_inv(nob, tmin); @@ -200,7 +199,7 @@ static int actkeys_viewall_exec(bContext *C, wmOperator *op) /* set the horizontal range, with an extra offset so that the extreme keys will be in view */ get_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax); - extra= 0.05f * (v2d->cur.xmax - v2d->cur.xmin); + extra= 0.1f * (v2d->cur.xmax - v2d->cur.xmin); v2d->cur.xmin -= extra; v2d->cur.xmax += extra; From b9063b27a9376ca276cb80f692ef8fa923a966a7 Mon Sep 17 00:00:00 2001 From: Diego Borghetti Date: Mon, 9 Feb 2009 07:15:22 +0000 Subject: [PATCH 10/63] Just commit so I can continue tomorrow from work. All the code have #if 0 / #endif so nothing to worry about. --- source/blender/blenfont/BLF_api.h | 16 ++ source/blender/blenfont/intern/blf_dir.c | 171 +++++++++++ source/blender/blenfont/intern/blf_font.c | 134 +++++++++ source/blender/blenfont/intern/blf_glyph.c | 268 ++++++++++++++++++ source/blender/blenfont/intern/blf_internal.h | 38 +++ .../blenfont/intern/blf_internal_types.h | 147 ++++++++++ 6 files changed, 774 insertions(+) create mode 100644 source/blender/blenfont/intern/blf_dir.c create mode 100644 source/blender/blenfont/intern/blf_font.c create mode 100644 source/blender/blenfont/intern/blf_glyph.c create mode 100644 source/blender/blenfont/intern/blf_internal.h diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h index 0a4ed0d7020..d91fbbf0fa9 100644 --- a/source/blender/blenfont/BLF_api.h +++ b/source/blender/blenfont/BLF_api.h @@ -49,4 +49,20 @@ int BLF_lang_error(void); /* Return the code string for the specified language code. */ char *BLF_lang_find_code(short langid); +#if 0 + +/* Add a path to the font dir paths. */ +void BLF_dir_add(const char *path); + +/* Remove a path from the font dir paths. */ +void BLF_dir_rem(const char *path); + +/* Return an array with all the font dir (this can be used for filesel) */ +char **BLF_dir_get(int *ndir); + +/* Free the data return by BLF_dir_get. */ +void BLF_dir_free(char **dirs, int count); + +#endif /* zero!! */ + #endif /* BLF_API_H */ diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c new file mode 100644 index 00000000000..2472d36a1d8 --- /dev/null +++ b/source/blender/blenfont/intern/blf_dir.c @@ -0,0 +1,171 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#if 0 + +#include +#include +#include + +#include "MEM_guardedalloc.h" + +#include "DNA_listBase.h" + +#include "BKE_utildefines.h" + +#include "BLI_blenlib.h" +#include "BLI_linklist.h" /* linknode */ +#include "BLI_string.h" + +#include "blf_internal_types.h" + +static ListBase global_font_dir= { NULL, NULL }; + +DirBLF *blf_dir_find(const char *path) +{ + DirBLF *p; + + p= global_font_dir.first; + while (p) { + if (!strcmp(p->path, path)) + return(p); + p= p->next; + } + return(NULL); +} + +void BLF_dir_add(const char *path) +{ + DirBLF *dir; + + dir= blf_dir_find(path); + if (dir) /* already in the list ? just return. */ + return; + + dir= (DirBLF *)MEM_mallocN(sizeof(DirBLF), "BLF_dir_add"); + dir->path= BLI_strdup(path); + BLI_addhead(&global_font_dir, dir); +} + +void BLF_dir_rem(const char *path) +{ + DirBLF *dir; + + dir= blf_dir_find(path); + if (dir) { + BLI_remlink(&global_font_dir, dir); + MEM_freeN(dir->path); + MEM_freeN(dir); + } +} + +char **BLF_dir_get(int *ndir) +{ + DirBLF *p; + char **dirs; + char *path; + int i, count; + + count= BLI_countlist(&global_font_dir); + if (!count) + return(NULL); + + dirs= (char **)MEM_mallocN(sizeof(char *) * count, "BLF_dir_get"); + p= global_font_dir.first; + i= 0; + while (p) { + path= BLI_strdup(p->path); + dirs[i]= path; + p= p->next; + } + *ndir= i; + return(dirs); +} + +void BLF_dir_free(char **dirs, int count) +{ + char *path; + int i; + + for (i= 0; i < count; i++) { + path= dirs[i]; + MEM_freeN(path); + } + MEM_freeN(dirs); +} + +char *blf_dir_search(char *file) +{ + DirBLF *dir; + char full_path[FILE_MAXDIR+FILE_MAXFILE]; + char *s; + + dir= global_font_dir.first; + s= NULL; + while (dir) { + BLI_join_dirfile(full_path, dir->path, file); + if (BLI_exist(full_path)) { + s= (char *)MEM_mallocN(strlen(full_path)+1,"blf_dir_search"); + strcpy(s, full_path); + break; + } + dir= dir->next; + } + + if (!s) { + /* check the current directory, why not ? */ + if (BLI_exist(file)) + s= BLI_strdup(file); + } + + return(s); +} + +int blf_dir_split(const char *str, char *file, int *size) +{ + char *s, i, len; + + /* Window, Linux or Mac, this is always / */ + s= strrchr(str, '/'); + if (s) { + len= s - str; + for (i= 0; i < len; i++) + file[i]= str[i]; + + file[i]= '.'; + file[i+1]= 't'; + file[i+2]= 't'; + file[i+3]= 'f'; + file[i+4]= '\0'; + s++; + *size= atoi(s); + return(1); + } + return(0); +} + +#endif /* zero!! */ diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c new file mode 100644 index 00000000000..8c7ec7a480f --- /dev/null +++ b/source/blender/blenfont/intern/blf_font.c @@ -0,0 +1,134 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#if 0 + +#include +#include +#include + +#include + +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "MEM_guardedalloc.h" + +#include "DNA_listBase.h" + +#include "BKE_utildefines.h" + +#include "BLI_blenlib.h" +#include "BLI_linklist.h" /* linknode */ +#include "BLI_string.h" + +#include "blf_internal_types.h" + + +/* freetype2 handle. */ +FT_Library global_ft_lib; + +int blf_font_init(void) +{ + return(FT_Init_FreeType(&global_ft_lib)); +} + +void blf_font_exit(void) +{ + FT_Done_Freetype(global_ft_lib); +} + +FontBLF *blf_font_new(char *name) +{ + FontBLF *font; + FT_Error err; + + font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new"); + err= FT_New_Face(global_ft_lib, name, 0, &font->face); + if (err) { + MEM_freeN(font); + return(NULL); + } + + err= FT_Select_Charmap(font->face, ft_encoding_unicode); + if (err) { + printf("Warning: FT_Select_Charmap fail!!\n"); + FT_Done_Face(font->face); + MEM_freeN(font); + return(NULL); + } + + font->name= MEM_strdup(name); + font->ref= 1; + font->aspect= 1.0f; + font->pos[0]= 0.0f; + font->pos[1]= 0.0f; + font->angle[0]= 0.0f; + font->angle[1]= 0.0f; + font->angle[2]= 0.0f; + Mat4One(font->mat); + font->clip_rec.xmin= 0.0f; + font->clip_rec.xmax= 0.0f; + font->clip_rec.ymin= 0.0f; + font->clip_rec.ymax= 0.0f; + font->clip_mode= BLF_CLIP_DISABLE; + font->dpi= 0; + font->size= 0; + font->cache.first= NULL; + font->cache.last= NULL; + font->glyph_cache= NULL; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint *)&font->max_tex_size); + return(font); +} + +void blf_font_size(FontBLF *font, int size, int dpi) +{ + GlyphCacheBLF *gc; + FT_Error err; + + err= FT_Set_Char_Size(font->face, 0, (size * 64), dpi, dpi); + if (err) { + /* FIXME: here we can go through the fixed size and choice a close one */ + printf("Warning: The current face don't support the size (%d) and dpi (%d)\n", size, dpi); + return; + } + + font->size= size; + font->dpi= dpi; + + gc= blf_glyph_cache_find(font, size, dpi); + if (gc) + font->glyph_cache= gc; + else { + gc= blf_glyph_cache_new(font); + if (gc) + font->glyph_cache= gc; + } +} + +#endif /* zero!! */ diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c new file mode 100644 index 00000000000..bea49ccb387 --- /dev/null +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -0,0 +1,268 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#if 0 + +#include +#include +#include + +#include + +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "MEM_guardedalloc.h" + +#include "DNA_listBase.h" + +#include "BKE_utildefines.h" + +#include "BLI_blenlib.h" +#include "BLI_linklist.h" /* linknode */ +#include "BLI_string.h" + +#include "blf_internal_types.h" + + +unsigned int blf_glyph_hash(unsigned int val) +{ + unsigned int key; + + key= val; + key += ~(key << 16); + key ^= (key >> 5); + key += (key << 3); + key ^= (key >> 13); + key += ~(key << 9); + key ^= (key >> 17); + return(key % 257); +} + +GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi) +{ + GlyphCacheBLF *p; + + p= (GlyphCacheBLF *)font->cache.first; + while (p) { + if (p->size == size && p->dpi == dpi) + return(p); + p= p->next; + } + return(NULL); +} + +/* Create a new glyph cache for the current size and dpi. */ +GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font) +{ + GlyphCacheBLF *gc; + int i; + + gc= (GlyphCacheBLF *)MEM_mallocN(sizeof(GlyphCacheBLF)); + gc->next= NULL; + gc->prev= NULL; + gc->size= font->size; + gc->dpi= font->dpi; + + for (i= 0; i < 257; i++) { + gc->bucket[i].first= NULL; + gc->bucket[i].last= NULL; + } + + gc->textures= (GLuint *)malloc(sizeof(GLunit)*256); + gc->ntex= 256; + gc->cur_tex= -1; + gc->x_offs= 0; + gc->y_offs= 0; + gc->pad= 3; + + gc->num_glyphs= font->face.num_glyphs; + gc->rem_glyphs= font->face.num_glyphs; + gc->ascender= ((float)font->size.metrics.ascender) / 64.0f; + gc->descender= ((float)font->size.metrics.descender) / 64.0f; + + if (FT_IS_SCALABLE(font->face)) { + gc->max_glyph_width= (float)((font->face->bbox.xMax - font->face->bbox.xMin) * + (((float)font->face->size.metrics.x_ppem) / + ((float)font->face->units_per_EM))); + + gc->max_glyph_height= (float)((font->face->bbox.yMax - font->face->bbox.yMin) * + (((float)font->face->size.metrics.y_ppem) / + ((float)font->face->units_per_EM))); + } + else { + gc->max_glyph_width= ((float)font->face->metrics.max_advance) / 64.0f; + gc->max_glyph_height= ((float)font->face->size.metrics.height) / 64.0f; + } + + gc->p2_width= 0; + gc->p2_height= 0; + + BLI_addhead(&font->cache, gc); + return(gc); +} + +void blf_glyph_cache_texture(FontBLF *font, GlyphCacheBLF *gc) +{ + int tot_mem; + unsigned char *buf; + + /* move the index. */ + gc->cur_tex++; + + if (gc->cur_tex > gc->ntex) { + gc->ntex *= 2; + gc->textures= (GLuint *)realloc((void *)gc->textures, sizeof(GLunit)*gc->ntex); + } + + gc->p2_width= blf_next_p2((gc->rem_glyphs * gc->max_glyph_width) + (gc->pad * 2)); + if (gc->p2_width > font->max_tex_size) + gc->p2_width= font->max_tex_size; + + i= (int)((gc->p2_width - (gc->pad * 2)) / gc->p2_width); + gc->p2_height= blf_next_p2(((gc->num_glyphs / i) + 1) * gc->max_glyph_height); + + if (gc->p2_height > font->max_tex_size) + gc->p2_height= font->max_tex_size; + + tot_mem= gc->p2_width * gc->p2_height; + buf= (unsigned char *)malloc(tot_mem); + memset((void *)buf, 0, tot_mem); + + glGenTextures(1, (GLuint*)gc->texures[gc->cur_tex]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, gc->p2_width, gc->p2_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, buf); + free((void *)buf); +} + +GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, FT_UInt idx) +{ + GlyphBLF *p; + unsigned int key; + + key= blf_glyph_hash(idx); + p= gc->bucket[key].first; + while (p) { + if (p->index == idx) + return(p); + p= p->next; + } + return(NULL); +} + +GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c) +{ + FT_GlyphSlot slot; + GlyphCache *gc; + GlyphBLF *g; + FT_Error err; + FT_Bitmap bitmap; + FTBBox bbox; + unsigned int key; + + g= blf_glyph_search(font->glyph_cache, index); + if (g) + return(g); + + err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP); + if (err) + return(NULL); + + /* get the glyph. */ + slot= font->face->glyph; + + err= FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL); + if (err) + return(NULL); + + g= (GlyphBLF *)MEM_mallocN(sizeof(GlyphBLF), "blf_glyph_add"); + g->next= NULL; + g->prev= NULL; + g->c= c; + g->index= index; + + gc= font->glyph_cache; + if (gc->cur_tex == -1) { + blf_glyph_cache_texture(font, gc); + gc->x_offs= gc->pad; + gc->y_offs= gc->pad; + } + + if (gc->x_offs > (gc->p2_width - gc->max_glyph_width)) { + gc->x_offs= gc->pad; + gc->y_offs += gc->max_glyph_height; + + if (gc->y_offs > (gc->p2_height - gc->max_glyph_height)) { + gc->y_offs= gc->pad; + blf_glyph_cache_texture(font, gc); + } + } + + bitmap= slot->bitmap; + g->tex= gc->textures[gc->cur_tex]; + g->xoff= gc->x_offs; + g->yoff= gc->y_offs; + g->width= bitmap.width; + g->height= bitmap.rows; + + if (g->width && g->height) { + glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); + glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glBindTexture(GL_TEXTURE_2D, g->tex); + glTexSubImage2D(GL_TEXTURE_2D, 0, g->xoff, g->yoff, g->width, g->height, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.buffer); + glPopClientAttrib(); + } + + g->advance= ((float)slot->advance.x) / 64.0f; + g->pos_x= bitmap.left; + g->pos_y= bitmap.top; + + FT_Outline_Get_CBox(&(slot->outline), &bbox); + g->box.xmin= ((float)bbox.xMin) / 64.0f; + g->box.xmax= ((float)bbox.xMax) / 64.0f; + g->box.ymin= ((float)bbox.yMin) / 64.0f; + g->box.ymax= ((float)bbox.yMax) / 64.0f; + + g->uv[0][0]= ((float)g->xoff) / ((float)g->p2_width); + g->uv[0][1]= ((float)g->yoff) / ((float)g->p2_height); + g->uv[1][0]= ((float)(g->xoff + g->width)) / ((float)g->p2_width); + g->uv[1][1]= ((float)(g->yoff + g->height)) / ((float)g->p2_height); + + key= blf_glyph_hash(g->index); + BLI_addhead(&gc->bucket[key], g); + return(g); +} + +#endif /* zero!! */ diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h new file mode 100644 index 00000000000..b88c83e4b13 --- /dev/null +++ b/source/blender/blenfont/intern/blf_internal.h @@ -0,0 +1,38 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef BLF_INTERNAL_H +#define BLF_INTERNAL_H + +#if 0 + +char *blf_dir_search(const char *file); +int blf_dir_split(const char *str, char *file, int *size); + +#endif /* zero! */ + +#endif /* BLF_INTERNAL_H */ diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h index 3a8c1bca3f5..b9ae9dfdac7 100644 --- a/source/blender/blenfont/intern/blf_internal_types.h +++ b/source/blender/blenfont/intern/blf_internal_types.h @@ -28,6 +28,149 @@ #ifndef BLF_INTERNAL_TYPES_H #define BLF_INTERNAL_TYPES_H +#if 0 + +typedef struct DirBLF { + struct DirBLF *next; + struct DirBLF *prev; + + /* full path where search fonts. */ + char *path; +} DirBLF; + +typedef struct _GlyphCacheBLF { + struct _GlyphCacheBLF *next; + struct _GlyphCacheBLF *prev; + + /* font size. */ + int size; + + /* and dpi. */ + int dpi; + + /* and the glyphs. */ + ListBase bucket[257]; + + /* texture array, to draw the glyphs. */ + GLuint *textures; + + /* size of the array. */ + int ntex; + + /* and the last texture, aka. the current texture. */ + int cur_tex; + + /* like bftgl, we draw every glyph in a big texture, so this is the + * current position inside the texture. + */ + int x_offs; + int y_offs; + + /* and the space from one to other. */ + unsigned int pad; + + /* and the bigger glyph in the font. */ + int max_glyph_width; + int max_glyph_height; + + /* next two integer power of two, to build the texture. */ + int p2_width; + int p2_height; + + /* number of glyphs in the font. */ + int num_glyphs; + + /* number of glyphs that we load here. */ + int rem_glyphs; + + /* ascender and descender value. */ + float ascender; + float descender; +} GlyphCacheBLF; + +typedef struct _GlyphBLF { + struct _GlyphBLF *next; + struct _GlyphBLF *prev; + + /* and the character, as UTF8 */ + unsigned int c; + + /* Freetype2 index. */ + FT_UInt index; + + /* texture id where this glyph is store. */ + GLuint tex; + + /* position inside the texture where this glyph is store. */ + int xoff; + int yoff; + + /* glyph width and height. */ + int width; + int height; + + /* glyph bounding box. */ + rctf box; + + /* uv coords. */ + float uv[2][2]; + + /* advance value. */ + float advance; + + /* X and Y bearing of the glyph. + * The X bearing is from the origin to the glyph left bbox edge. + * The Y bearing is from the baseline to the top of the glyph edge. + */ + float pos_x; + float pos_y; +} GlyphBLF; + +typedef struct FontBLF { + char *name; + + /* reference count. */ + int ref; + + /* aspect ratio or scale. */ + float aspect; + + /* initial position for draw the text. */ + float pos[3]; + + /* angle in degrees. */ + float angle[3]; + + /* this is the matrix that we load before rotate/scale/translate. */ + float mat[4][4]; + + /* clipping rectangle. */ + rctf clip_rec; + + /* and clipping mode. */ + int clip_mode; + + /* font dpi (default 72). */ + int dpi; + + /* font size. */ + int size; + + /* max texture size. */ + int max_tex_size; + + /* freetype2 face. */ + FT_Face face; + + /* list of glyph cache for this font. */ + ListBase cache; + + /* current glyph cache, size and dpi. */ + GlyphCacheBLF *glyph_cache; +} FontBLF; + +#endif /* zero!! */ + typedef struct LangBLF { struct LangBLF *next; struct LangBLF *prev; @@ -42,4 +185,8 @@ typedef struct LangBLF { #define BLF_LANG_FIND_BY_LANGUAGE 1 #define BLF_LANG_FIND_BY_CODE 2 +/* font->clip_mode */ +#define BLF_CLIP_DISABLE 0 +#define BLF_CLIP_OUT 1 + #endif /* BLF_INTERNAL_TYPES_H */ From 59736af8fc39246b82213ff0e9c8f917ed36a34c Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 10:04:11 +0000 Subject: [PATCH 11/63] Animato: Added 'experimental' grouping schemes for F-Curves When inserting keyframes on previous un-animated Objects/bones, F-Curves will be added into Action Groups into either "Object Transform" or . Ob->Material settings are not grouped for now to illustrate what's possible. Old files are currently not patched to use do this, as it's still not clear whether this will be ideal. --- source/blender/blenkernel/BKE_action.h | 47 +++-- source/blender/blenkernel/intern/action.c | 186 ++++++++++++++++++ source/blender/blenloader/intern/readfile.c | 2 +- .../blender/editors/animation/anim_channels.c | 2 +- source/blender/editors/animation/keyframing.c | 103 ++++++---- .../blender/editors/include/ED_keyframing.h | 4 +- .../editors/space_action/action_draw.c | 8 +- .../editors/space_action/space_action.c | 1 + .../blender/editors/space_graph/graph_draw.c | 6 +- .../blender/editors/space_graph/graph_edit.c | 1 - .../blender/editors/space_graph/space_graph.c | 2 +- 11 files changed, 296 insertions(+), 66 deletions(-) diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 9abacf862c5..a5a978ae3fa 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -36,11 +36,10 @@ #include "DNA_listBase.h" -/** - * The following structures are defined in DNA_action_types.h, and DNA_anim_types.h - */ - +/* The following structures are defined in DNA_action_types.h, and DNA_anim_types.h */ struct bAction; +struct bActionGroup; +struct FCurve; struct bPose; struct bPoseChannel; struct Object; @@ -52,28 +51,40 @@ struct ID; extern "C" { #endif -struct bAction *add_empty_action(const char name[]); - - /** - * Allocate a new bAction on the heap and copy - * the contents of src into it. If src is NULL NULL is returned. - */ +/* Action API ----------------- */ +/* Allocate a new bAction with the given name */ +struct bAction *add_empty_action(const char name[]); + +/* Allocate a copy of the given Action and all its data */ struct bAction *copy_action(struct bAction *src); -/** - * Deallocate the action's channels including constraint channels. - * does not free the action structure. - */ +/* Deallocate all of the Action's data, but not the Action itself */ void free_action(struct bAction *act); // XXX is this needed? void make_local_action(struct bAction *act); - -/** - * Some kind of bounding box operation on the action. - */ + +/* Some kind of bounding box operation on the action */ +// XXX depreceated.. void calc_action_range(const struct bAction *act, float *start, float *end, int incl_hidden); + +/* Action Groups API ----------------- */ + +/* Make the given Action Group the active one */ +void set_active_action_group(struct bAction *act, struct bActionGroup *agrp, short select); + +/* Add given channel into (active) group */ +void action_groups_add_channel(struct bAction *act, struct bActionGroup *agrp, struct FCurve *fcurve); + +/* Remove the given channel from all groups */ +void action_groups_remove_channel(struct bAction *act, struct FCurve *fcu); + +/* Find a group with the given name */ +struct bActionGroup *action_groups_find_named(struct bAction *act, const char name[]); + + +/* Pose API ----------------- */ /** * Removes and deallocates all channels from a pose. diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 72fd0259b89..4e66d5f0ab8 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -188,6 +188,192 @@ bAction *copy_action (bAction *src) } +/* Get the active action-group for an Action */ +bActionGroup *get_active_actiongroup (bAction *act) +{ + bActionGroup *agrp= NULL; + + if (act && act->groups.first) { + for (agrp= act->groups.first; agrp; agrp= agrp->next) { + if (agrp->flag & AGRP_ACTIVE) + break; + } + } + + return agrp; +} + +/* Make the given Action-Group the active one */ +void set_active_action_group (bAction *act, bActionGroup *agrp, short select) +{ + bActionGroup *grp; + + /* sanity checks */ + if (act == NULL) + return; + + /* Deactive all others */ + for (grp= act->groups.first; grp; grp= grp->next) { + if ((grp==agrp) && (select)) + grp->flag |= AGRP_ACTIVE; + else + grp->flag &= ~AGRP_ACTIVE; + } +} + +/* Add given channel into (active) group + * - assumes that channel is not linked to anything anymore + * - always adds at the end of the group + */ +void action_groups_add_channel (bAction *act, bActionGroup *agrp, FCurve *fcurve) +{ + FCurve *fcu; + short done=0; + + /* sanity checks */ + if (ELEM3(NULL, act, agrp, fcurve)) + return; + + /* if no channels, just add to two lists at the same time */ + if (act->curves.first == NULL) { + fcurve->next = fcurve->prev = NULL; + + agrp->channels.first = agrp->channels.last = fcurve; + act->curves.first = act->curves.last = fcurve; + + fcurve->grp= agrp; + return; + } + + /* try to find a channel to slot this in before/after */ + for (fcu= act->curves.first; fcu; fcu= fcu->next) { + /* if channel has no group, then we have ungrouped channels, which should always occur after groups */ + if (fcu->grp == NULL) { + BLI_insertlinkbefore(&act->curves, fcu, fcurve); + + if (agrp->channels.first == NULL) + agrp->channels.first= fcurve; + agrp->channels.last= fcurve; + + done= 1; + break; + } + + /* if channel has group after current, we can now insert (otherwise we have gone too far) */ + else if (fcu->grp == agrp->next) { + BLI_insertlinkbefore(&act->curves, fcu, fcurve); + + if (agrp->channels.first == NULL) + agrp->channels.first= fcurve; + agrp->channels.last= fcurve; + + done= 1; + break; + } + + /* if channel has group we're targeting, check whether it is the last one of these */ + else if (fcu->grp == agrp) { + if ((fcu->next) && (fcu->next->grp != agrp)) { + BLI_insertlinkafter(&act->curves, fcu, fcurve); + agrp->channels.last= fcurve; + done= 1; + break; + } + else if (fcu->next == NULL) { + BLI_addtail(&act->curves, fcurve); + agrp->channels.last= fcurve; + done= 1; + break; + } + } + + /* if channel has group before target, check whether the next one is something after target */ + else if (fcu->grp == agrp->prev) { + if (fcu->next) { + if ((fcu->next->grp != fcu->grp) && (fcu->next->grp != agrp)) { + BLI_insertlinkafter(&act->curves, fcu, fcurve); + + agrp->channels.first= fcurve; + agrp->channels.last= fcurve; + + done= 1; + break; + } + } + else { + BLI_insertlinkafter(&act->curves, fcu, fcurve); + + agrp->channels.first= fcurve; + agrp->channels.last= fcurve; + + done= 1; + break; + } + } + } + + /* only if added, set channel as belonging to this group */ + if (done) + fcurve->grp= agrp; + else + printf("Error: FCurve '%s' couldn't be added to Group '%s' \n", fcurve->rna_path, agrp->name); +} + +/* Remove the given channel from all groups */ +void action_groups_remove_channel (bAction *act, FCurve *fcu) +{ + /* sanity checks */ + if (ELEM(NULL, act, fcu)) + return; + + /* check if any group used this directly */ + if (fcu->grp) { + bActionGroup *agrp= fcu->grp; + + if (agrp->channels.first == agrp->channels.last) { + if (agrp->channels.first == fcu) { + agrp->channels.first= NULL; + agrp->channels.last= NULL; + } + } + else if (agrp->channels.first == fcu) { + if ((fcu->next) && (fcu->next->grp==agrp)) + agrp->channels.first= fcu->next; + else + agrp->channels.first= NULL; + } + else if (agrp->channels.last == fcu) { + if ((fcu->prev) && (fcu->prev->grp==agrp)) + agrp->channels.last= fcu->prev; + else + agrp->channels.last= NULL; + } + + fcu->grp= NULL; + } + + /* now just remove from list */ + BLI_remlink(&act->curves, fcu); +} + +/* Find a group with the given name */ +bActionGroup *action_groups_find_named (bAction *act, const char name[]) +{ + bActionGroup *grp; + + /* sanity checks */ + if (ELEM3(NULL, act, act->groups.first, name) || (name[0] == 0)) + return NULL; + + /* do string comparisons */ + for (grp= act->groups.first; grp; grp= grp->next) { + if (strcmp(grp->name, name) == 0) + return grp; + } + + /* not found */ + return NULL; +} /* ************************ Pose channels *************** */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index d22fc83f1e4..2a0f98cfe8d 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5525,7 +5525,7 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb) /* we totally reinit the view for the Action Editor, as some old instances had some weird cruft set */ ar->v2d.tot.xmin= -20.0f; ar->v2d.tot.ymin= (float)(-sa->winy); - ar->v2d.tot.xmax= (float)(sa->winx); + ar->v2d.tot.xmax= (float)((sa->winx > 120)? (sa->winx) : 120); ar->v2d.tot.ymax= 0.0f; ar->v2d.cur= ar->v2d.tot; diff --git a/source/blender/editors/animation/anim_channels.c b/source/blender/editors/animation/anim_channels.c index a7447658780..a697580d674 100644 --- a/source/blender/editors/animation/anim_channels.c +++ b/source/blender/editors/animation/anim_channels.c @@ -1075,7 +1075,7 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s case ANIMTYPE_GROUP: { bActionGroup *agrp= (bActionGroup *)ale->data; - short offset= (ac->datatype == ANIMCONT_DOPESHEET)? 21 : 0; + short offset= (ac->datatype == ANIMCONT_DOPESHEET)? 18 : 0; if ((x < (offset+17)) && (agrp->channels.first)) { /* toggle expand */ diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 3b865f4dac1..110fd84a630 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -3,6 +3,7 @@ */ #include +#include #include #include #include @@ -95,13 +96,13 @@ typedef struct bKeyingContext { /* Animation Data Validation */ /* Get (or add relevant data to be able to do so) F-Curve from the Active Action, - * for the given Animation Data block + * for the given Animation Data block. This assumes that all the destinations are valid. */ -// TODO: should we check if path is valid? For now, assume that it's already set OK by caller... -FCurve *verify_fcurve (ID *id, const char rna_path[], const int array_index, short add) +FCurve *verify_fcurve (ID *id, const char group[], const char rna_path[], const int array_index, short add) { AnimData *adt; bAction *act; + bActionGroup *grp; FCurve *fcu; /* sanity checks */ @@ -133,7 +134,7 @@ FCurve *verify_fcurve (ID *id, const char rna_path[], const int array_index, sho fcu= NULL; if ((fcu == NULL) && (add)) { - /* use default settings */ + /* use default settings to make a F-Curve */ fcu= MEM_callocN(sizeof(FCurve), "FCurve"); fcu->flag |= (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES); @@ -144,8 +145,33 @@ FCurve *verify_fcurve (ID *id, const char rna_path[], const int array_index, sho fcu->rna_path= BLI_strdupn(rna_path, strlen(rna_path)); fcu->array_index= array_index; - /* add curve */ - BLI_addtail(&act->curves, fcu); // XXX it might be better to add this in order, for easier UI coding... + + /* if a group name has been provided, try to add or find a group, then add F-Curve to it */ + if (group) { + /* try to find group */ + grp= action_groups_find_named(act, group); + + /* no matching groups, so add one */ + if (grp == NULL) { + /* Add a new group, and make it active */ + grp= MEM_callocN(sizeof(bActionGroup), "bActionGroup"); + + grp->flag |= (AGRP_ACTIVE|AGRP_SELECTED|AGRP_EXPANDED); + BLI_snprintf(grp->name, 64, group); + + BLI_addtail(&act->groups, grp); + BLI_uniquename(&act->groups, grp, "Group", offsetof(bActionGroup, name), 64); + + set_active_action_group(act, grp, 1); + } + + /* add F-Curve to group */ + action_groups_add_channel(act, grp, fcu); + } + else { + /* just add F-Curve to end of Action's list */ + BLI_addtail(&act->curves, fcu); + } } /* return the F-Curve */ @@ -711,7 +737,7 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_ * the keyframe insertion. These include the 'visual' keyframing modes, quick refresh, * and extra keyframe filtering. */ -short insertkey (ID *id, const char rna_path[], int array_index, float cfra, short flag) +short insertkey (ID *id, const char group[], const char rna_path[], int array_index, float cfra, short flag) { PointerRNA id_ptr, ptr; PropertyRNA *prop; @@ -725,7 +751,7 @@ short insertkey (ID *id, const char rna_path[], int array_index, float cfra, sho } /* get F-Curve */ - fcu= verify_fcurve(id, rna_path, array_index, 1); + fcu= verify_fcurve(id, group, rna_path, array_index, 1); /* only continue if we have an F-Curve to add keyframe to */ if (fcu) { @@ -809,7 +835,7 @@ short insertkey (ID *id, const char rna_path[], int array_index, float cfra, sho * The flag argument is used for special settings that alter the behaviour of * the keyframe deletion. These include the quick refresh options. */ -short deletekey (ID *id, const char rna_path[], int array_index, float cfra, short flag) +short deletekey (ID *id, const char group[], const char rna_path[], int array_index, float cfra, short flag) { AnimData *adt; FCurve *fcu; @@ -819,7 +845,7 @@ short deletekey (ID *id, const char rna_path[], int array_index, float cfra, sho * so 'add' var must be 0 */ // XXX we don't check the validity of the path here yet, but it should be ok... - fcu= verify_fcurve(id, rna_path, array_index, 0); + fcu= verify_fcurve(id, group, rna_path, array_index, 0); adt= BKE_animdata_from_id(id); /* only continue if we have an ipo-curve to remove keyframes from */ @@ -2049,24 +2075,25 @@ static int insert_key_exec (bContext *C, wmOperator *op) switch (mode) { case 3: /* color of active material (only for geometry...) */ // NOTE: this is just a demo... but ideally we'd go through materials instead of active one only so reference stays same - success+= insertkey(id, "active_material.diffuse_color", 0, cfra, 0); - success+= insertkey(id, "active_material.diffuse_color", 1, cfra, 0); - success+= insertkey(id, "active_material.diffuse_color", 2, cfra, 0); + // XXX no group for now + success+= insertkey(id, NULL, "active_material.diffuse_color", 0, cfra, 0); + success+= insertkey(id, NULL, "active_material.diffuse_color", 1, cfra, 0); + success+= insertkey(id, NULL, "active_material.diffuse_color", 2, cfra, 0); break; case 2: /* object scale */ - success+= insertkey(id, "scale", 0, cfra, 0); - success+= insertkey(id, "scale", 1, cfra, 0); - success+= insertkey(id, "scale", 2, cfra, 0); + success+= insertkey(id, "Object Transforms", "scale", 0, cfra, 0); + success+= insertkey(id, "Object Transforms", "scale", 1, cfra, 0); + success+= insertkey(id, "Object Transforms", "scale", 2, cfra, 0); break; case 1: /* object rotation */ - success+= insertkey(id, "rotation", 0, cfra, 0); - success+= insertkey(id, "rotation", 1, cfra, 0); - success+= insertkey(id, "rotation", 2, cfra, 0); + success+= insertkey(id, "Object Transforms", "rotation", 0, cfra, 0); + success+= insertkey(id, "Object Transforms", "rotation", 1, cfra, 0); + success+= insertkey(id, "Object Transforms", "rotation", 2, cfra, 0); break; default: /* object location */ - success+= insertkey(id, "location", 0, cfra, 0); - success+= insertkey(id, "location", 1, cfra, 0); - success+= insertkey(id, "location", 2, cfra, 0); + success+= insertkey(id, "Object Transforms", "location", 0, cfra, 0); + success+= insertkey(id, "Object Transforms", "location", 1, cfra, 0); + success+= insertkey(id, "Object Transforms", "location", 2, cfra, 0); break; } @@ -2084,22 +2111,30 @@ static int insert_key_exec (bContext *C, wmOperator *op) switch (mode) { case 6: /* pchan scale */ sprintf(buf, "pose.pose_channels[\"%s\"].scale", pchan->name); - success+= insertkey(id, buf, 0, cfra, 0); - success+= insertkey(id, buf, 1, cfra, 0); - success+= insertkey(id, buf, 2, cfra, 0); + success+= insertkey(id, pchan->name, buf, 0, cfra, 0); + success+= insertkey(id, pchan->name, buf, 1, cfra, 0); + success+= insertkey(id, pchan->name, buf, 2, cfra, 0); break; case 5: /* pchan rotation */ - sprintf(buf, "pose.pose_channels[\"%s\"].rotation", pchan->name); - success+= insertkey(id, buf, 0, cfra, 0); - success+= insertkey(id, buf, 1, cfra, 0); - success+= insertkey(id, buf, 2, cfra, 0); - success+= insertkey(id, buf, 3, cfra, 0); + if (pchan->rotmode == PCHAN_ROT_QUAT) { + sprintf(buf, "pose.pose_channels[\"%s\"].rotation", pchan->name); + success+= insertkey(id, pchan->name, buf, 0, cfra, 0); + success+= insertkey(id, pchan->name, buf, 1, cfra, 0); + success+= insertkey(id, pchan->name, buf, 2, cfra, 0); + success+= insertkey(id, pchan->name, buf, 3, cfra, 0); + } + else { + sprintf(buf, "pose.pose_channels[\"%s\"].euler_rotation", pchan->name); + success+= insertkey(id, pchan->name, buf, 0, cfra, 0); + success+= insertkey(id, pchan->name, buf, 1, cfra, 0); + success+= insertkey(id, pchan->name, buf, 2, cfra, 0); + } break; default: /* pchan location */ sprintf(buf, "pose.pose_channels[\"%s\"].location", pchan->name); - success+= insertkey(id, buf, 0, cfra, 0); - success+= insertkey(id, buf, 1, cfra, 0); - success+= insertkey(id, buf, 2, cfra, 0); + success+= insertkey(id, pchan->name, buf, 0, cfra, 0); + success+= insertkey(id, pchan->name, buf, 1, cfra, 0); + success+= insertkey(id, pchan->name, buf, 2, cfra, 0); break; } } @@ -2172,7 +2207,7 @@ static int delete_key_exec (bContext *C, wmOperator *op) for (fcu= act->curves.first; fcu; fcu= fcn) { fcn= fcu->next; - success+= deletekey(id, fcu->rna_path, fcu->array_index, cfra, 0); + success+= deletekey(id, NULL, fcu->rna_path, fcu->array_index, cfra, 0); } } diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index e7bdbb86ffa..91dbbec873f 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -73,12 +73,12 @@ enum { * Use this to create any necessary animation data, and then insert a keyframe * using the current value being keyframed, in the relevant place. Returns success. */ -short insertkey(struct ID *id, const char rna_path[], int array_index, float cfra, short flag); +short insertkey(struct ID *id, const char group[], const char rna_path[], int array_index, float cfra, short flag); /* Main Keyframing API call: * Use this to delete keyframe on current frame for relevant channel. Will perform checks just in case. */ -short deletekey(struct ID *id, const char rna_path[], int array_index, float cfra, short flag); +short deletekey(struct ID *id, const char group[], const char rna_path[], int array_index, float cfra, short flag); /* Main Keyframe Management operators: diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 3152abcae94..2908d3b8e33 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -594,7 +594,7 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) indent= 0; special= -1; - offset= (ale->id) ? 21 : 0; + offset= (ale->id) ? 18 : 0; /* only show expand if there are any channels */ if (agrp->channels.first) { @@ -619,8 +619,8 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) indent = 0; - //group= (ale->grp) ? 1 : 0; - //grp= ale->grp; + group= (fcu->grp) ? 1 : 0; + grp= fcu->grp; switch (ale->ownertype) { case ANIMTYPE_NONE: /* no owner */ @@ -650,9 +650,7 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) sel = SEL_FCU(fcu); - // for now, we just print the full path... this needs more work! getname_anim_fcurve(name, ale->id, fcu); - //sprintf(name, "%s[%d]", fcu->rna_path, fcu->array_index); } break; diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index fea9214d081..b4e43c29c3d 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -299,6 +299,7 @@ static void action_channel_area_listener(ARegion *ar, wmNotifier *wmn) switch(wmn->data) { case ND_BONE_ACTIVE: case ND_BONE_SELECT: + case ND_KEYS: ED_region_tag_redraw(ar); break; } diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 6ccfae88b08..a6424c8f5b6 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -875,7 +875,7 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) indent= 0; special= -1; - offset= (ale->id) ? 21 : 0; + offset= (ale->id) ? 18 : 0; /* only show expand if there are any channels */ if (agrp->channels.first) { @@ -900,8 +900,8 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) indent = 0; - //group= (ale->grp) ? 1 : 0; - //grp= ale->grp; + group= (fcu->grp) ? 1 : 0; + grp= fcu->grp; // XXX include some UI element to allow toggling of visibility diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index a7b9e8aa883..08f724bb9a4 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -122,7 +122,6 @@ static void get_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, fl /* get range and apply necessary scaling before */ calc_fcurve_range(fcu, &tmin, &tmax); - tmin= tmax= 0.0f; // xxx if (nob) { tmin= get_action_frame_inv(nob, tmin); diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index 3644406c12f..29c92ee4496 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -100,7 +100,7 @@ static SpaceLink *graph_new(const bContext *C) ar->regiontype= RGN_TYPE_WINDOW; ar->v2d.tot.xmin= 0.0f; - ar->v2d.tot.ymin= -10.0f; + ar->v2d.tot.ymin= (float)scene->r.sfra - 10.0f; ar->v2d.tot.xmax= (float)scene->r.efra; ar->v2d.tot.ymax= 10.0f; From 2b818935fe708f5f386375d484faa35b9163b4c7 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 10:33:05 +0000 Subject: [PATCH 12/63] Graph Editor: Drawing tweaks for previous commit * Group channels are drawn with better indention now * Colors for group channels in Graph Editor are now initialised properly * When selecting individual keyframes in Graph Editor, it is now possible to see which curve it belonged to, as the 'active' and 'selected' flags are set on that curve only. --- source/blender/editors/interface/resources.c | 2 ++ .../editors/space_action/action_draw.c | 2 +- .../blender/editors/space_graph/graph_draw.c | 2 +- .../editors/space_graph/graph_select.c | 35 ++++++++++++++----- .../blender/windowmanager/intern/wm_files.c | 11 +++--- 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 33e738cfc68..d55a40f9bbb 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -452,6 +452,8 @@ void ui_theme_init_userdef(void) SETCOL(btheme->tipo.ds_channel, 82, 96, 110, 255); SETCOL(btheme->tipo.ds_subchannel, 124, 137, 150, 255); + SETCOL(btheme->tipo.group, 22, 112, 0, 255); + SETCOL(btheme->tipo.group_active, 125, 233, 96, 255); /* space file */ /* to have something initialized */ diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 2908d3b8e33..4fb0690572e 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -594,7 +594,7 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) indent= 0; special= -1; - offset= (ale->id) ? 18 : 0; + offset= (ale->id) ? 16 : 0; /* only show expand if there are any channels */ if (agrp->channels.first) { diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index a6424c8f5b6..f05606fbfa6 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -875,7 +875,7 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) indent= 0; special= -1; - offset= (ale->id) ? 18 : 0; + offset= (ale->id) ? 16 : 0; /* only show expand if there are any channels */ if (agrp->channels.first) { diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c index 2a9cab17e3a..be2f6dda0e0 100644 --- a/source/blender/editors/space_graph/graph_select.c +++ b/source/blender/editors/space_graph/graph_select.c @@ -121,7 +121,6 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel) test_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); /* See if we should be selecting or deselecting */ - // xxx check for curves too if (test) { for (ale= anim_data.first; ale; ale= ale->next) { if (ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, test_cb, NULL)) { @@ -135,9 +134,21 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel) sel_cb= ANIM_editkeyframes_select(sel); /* Now set the flags */ - // xxx check for curves too - for (ale= anim_data.first; ale; ale= ale->next) + for (ale= anim_data.first; ale; ale= ale->next) { + FCurve *fcu= (FCurve *)ale->key_data; + + /* Keyframes First */ ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, sel_cb, NULL); + + /* Curve Selection too */ + if (sel == SELECT_ADD) + fcu->flag |= FCURVE_SELECTED; + else if (sel == SELECT_SUBTRACT) + fcu->flag &= ~FCURVE_SELECTED; + else + fcu->flag ^= FCURVE_SELECTED; + fcu->flag &= ~FCURVE_ACTIVE; + } /* Cleanup */ BLI_freelistN(&anim_data); @@ -664,12 +675,6 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short selectmode) selectmode= SELECT_ADD; } - /* select or deselect? */ - if (selectmode == SELECT_ADD) - fcu->flag |= (FCURVE_ACTIVE|FCURVE_SELECTED); - else if (selectmode == SELECT_INVERT) - fcu->flag ^= (FCURVE_ACTIVE|FCURVE_SELECTED); - /* if we're selecting points too */ if ( ((fcu->flag & FCURVE_PROTECTED)==0) /*|| (curvesonly == 0) */) { /* only if there's keyframe */ @@ -712,6 +717,18 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short selectmode) } } } + + /* select or deselect curve? */ + if (selectmode == SELECT_INVERT) { + fcu->flag ^= FCURVE_SELECTED; + + if (fcu->flag & FCURVE_SELECTED) + fcu->flag |= FCURVE_ACTIVE; + else + fcu->flag &= ~FCURVE_ACTIVE; + } + else if (selectmode == SELECT_ADD) + fcu->flag |= (FCURVE_ACTIVE|FCURVE_SELECTED); } /* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */ diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 04583c45ec0..484d97e7b71 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -331,12 +331,15 @@ static void init_userdef_themes(void) /* adjust themes */ for (btheme= U.themes.first; btheme; btheme= btheme->next) { /* DopeSheet - (Object) Channel color */ - SETCOL(btheme->tact.ds_channel, 0x36, 0x13, 0xca, 255); - SETCOL(btheme->tact.ds_subchannel, 0x60, 0x43, 0xd2, 255); + SETCOL(btheme->tact.ds_channel, 82, 96, 110, 255); + SETCOL(btheme->tact.ds_subchannel, 124, 137, 150, 255); /* Graph Editor - (Object) Channel color */ - SETCOL(btheme->tipo.ds_channel, 0x36, 0x13, 0xca, 255); - SETCOL(btheme->tipo.ds_subchannel, 0x60, 0x43, 0xd2, 255); + SETCOL(btheme->tipo.ds_channel, 82, 96, 110, 255); + SETCOL(btheme->tipo.ds_subchannel, 124, 137, 150, 255); + /* Graph Editor - Group Channel color */ + SETCOL(btheme->tipo.group, 22, 112, 0, 255); + SETCOL(btheme->tipo.group_active, 125, 233, 96, 255); } /* adjust grease-pencil distances */ From c58d336a33b4105530af326dccef077ba0274fa6 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 11:05:34 +0000 Subject: [PATCH 13/63] Keyframe-related bugfixes: * Deleting keyframes should be safer now * Graph Editor no longer crashes on F-Curves with no keyframes/samples * Silenced console prints that occurred when an F-Curve had now keyframes. --- source/blender/blenkernel/intern/action.c | 8 ++++++-- .../editors/animation/keyframes_general.c | 7 +++++++ source/blender/editors/animation/keyframing.c | 2 +- .../blender/editors/space_graph/graph_draw.c | 18 ++++++++++-------- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 4e66d5f0ab8..9ed469c9028 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -313,10 +313,14 @@ void action_groups_add_channel (bAction *act, bActionGroup *agrp, FCurve *fcurve } /* only if added, set channel as belonging to this group */ - if (done) + if (done) { + //printf("FCurve added to group \n"); fcurve->grp= agrp; - else + } + else { printf("Error: FCurve '%s' couldn't be added to Group '%s' \n", fcurve->rna_path, agrp->name); + BLI_addtail(&act->curves, fcurve); + } } /* Remove the given channel from all groups */ diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c index 30d05b91582..cf7d56da5d9 100644 --- a/source/blender/editors/animation/keyframes_general.c +++ b/source/blender/editors/animation/keyframes_general.c @@ -103,6 +103,13 @@ void delete_fcurve_keys(FCurve *fcu) } } + /* Free the array of BezTriples if there are not keyframes */ + if (fcu->totvert == 0) { + if (fcu->bezt) + MEM_freeN(fcu->bezt); + fcu->bezt= NULL; + } + #if 0 // XXX for now, we don't get rid of empty curves... /* Only delete if there isn't an ipo-driver still hanging around on an empty curve */ if ((icu->totvert==0) && (icu->driver==NULL)) { diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 110fd84a630..df3a7b85a45 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -2267,7 +2267,7 @@ short action_frame_has_keyframe (bAction *act, float frame, short filter) */ for (fcu= act->curves.first; fcu; fcu= fcu->next) { /* only check if there are keyframes (currently only of type BezTriple) */ - if (fcu->bezt) { + if (fcu->bezt && fcu->totvert) { /* we either include all regardless of muting, or only non-muted */ if ((filter & ANIMFILTER_KEYS_MUTED) || (fcu->flag & FCURVE_MUTED)==0) { short replace = -1; diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index f05606fbfa6..8de273c9428 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -632,14 +632,16 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 0); /* draw curve - we currently calculate colour on the fly, but that should probably be done in advance instead */ - col= ipo_rainbow(i, items); - cpack(col); - - draw_fcurve_repeat(fcu, &ar->v2d, 0, 0, &fac); // XXX this call still needs a lot more work - - /* draw handles and vertices as appropriate */ - draw_fcurve_handles(sipo, ar, fcu); - draw_fcurve_vertices(sipo, ar, fcu); + if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) { + col= ipo_rainbow(i, items); + cpack(col); + + draw_fcurve_repeat(fcu, &ar->v2d, 0, 0, &fac); // XXX this call still needs a lot more work + + /* draw handles and vertices as appropriate */ + draw_fcurve_handles(sipo, ar, fcu); + draw_fcurve_vertices(sipo, ar, fcu); + } /* undo mapping of keyframes for drawing if scaled F-Curve */ if (nob) From f33309b0285079c14a8f9fc913157129ff6cbc81 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Mon, 9 Feb 2009 15:50:09 +0000 Subject: [PATCH 14/63] 2.5 - Added depsgraph tag for object-change in AnimData, so the new animsys doesn't have to all objects anymore. (Still WIP, depsgraph has to do this much better) - Bugfix in notifiers; only 1 notifier was handled for frame updates Result: 2 windows, displaying 2 scenes, now can be edited independently, and play independent. Not when they share data, of course. :) --- source/blender/blenkernel/intern/anim_sys.c | 25 ++++--- source/blender/blenkernel/intern/depsgraph.c | 9 ++- source/blender/blenkernel/intern/scene.c | 72 +++++++++---------- source/blender/editors/screen/screen_ops.c | 3 +- source/blender/windowmanager/WM_types.h | 4 +- .../windowmanager/intern/wm_event_system.c | 38 +++++----- 6 files changed, 82 insertions(+), 69 deletions(-) diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 8bc914d5be0..a7e65a9c585 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -587,7 +587,7 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re * - NLA before Active Action, as Active Action behaves as 'tweaking track' * that overrides 'rough' work in NLA */ - if ((recalc & ADT_RECALC_ANIM) /*|| (adt->recalc & ADT_RECALC_ANIM)*/) // XXX for now,don't check yet, as depsgraph doesn't know this yet + if ((recalc & ADT_RECALC_ANIM) || (adt->recalc & ADT_RECALC_ANIM)) { /* evaluate NLA data */ if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF)) @@ -599,6 +599,9 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re // FIXME: what if the solo track was not tweaking one, then nla-solo should be checked too? if (adt->action) animsys_evaluate_action(&id_ptr, adt->action, adt->remap, ctime); + + /* reset tag */ + adt->recalc &= ~ADT_RECALC_ANIM; } /* recalculate drivers @@ -639,29 +642,29 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime) printf("Evaluate all animation - %f \n", ctime); /* macro for less typing */ -#define EVAL_ANIM_IDS(first) \ +#define EVAL_ANIM_IDS(first, flag) \ for (id= first; id; id= id->next) { \ AnimData *adt= BKE_animdata_from_id(id); \ - BKE_animsys_evaluate_animdata(id, adt, ctime, ADT_RECALC_ANIM); \ + BKE_animsys_evaluate_animdata(id, adt, ctime, flag); \ } /* nodes */ // TODO... /* textures */ - EVAL_ANIM_IDS(main->tex.first); + EVAL_ANIM_IDS(main->tex.first, ADT_RECALC_ANIM); /* lamps */ - EVAL_ANIM_IDS(main->lamp.first); + EVAL_ANIM_IDS(main->lamp.first, ADT_RECALC_ANIM); /* materials */ - EVAL_ANIM_IDS(main->mat.first); + EVAL_ANIM_IDS(main->mat.first, ADT_RECALC_ANIM); /* cameras */ - EVAL_ANIM_IDS(main->camera.first); + EVAL_ANIM_IDS(main->camera.first, ADT_RECALC_ANIM); /* shapekeys */ - EVAL_ANIM_IDS(main->key.first); + EVAL_ANIM_IDS(main->key.first, ADT_RECALC_ANIM); /* curves */ // TODO... @@ -670,13 +673,13 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime) // TODO... /* objects */ - EVAL_ANIM_IDS(main->object.first); + EVAL_ANIM_IDS(main->object.first, 0); /* worlds */ - EVAL_ANIM_IDS(main->world.first); + EVAL_ANIM_IDS(main->world.first, ADT_RECALC_ANIM); /* scenes */ - EVAL_ANIM_IDS(main->scene.first); + EVAL_ANIM_IDS(main->scene.first, ADT_RECALC_ANIM); } /* ***************************************** */ diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 265fb1258a1..0f48133efc7 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -324,7 +324,7 @@ static void dag_add_driver_relation(AnimData *adt, DagForest *dag, DagNode *node /* now we need refs to all objects mentioned in this * pydriver expression, to call 'dag_add_relation' * for each of them */ - Object **obarray = BPY_pydriver_get_objects(fcu->driver); + Object **obarray = NULL; // XXX BPY_pydriver_get_objects(fcu->driver); if (obarray) { Object *ob, **oba = obarray; @@ -2045,7 +2045,12 @@ static void dag_object_time_update_flags(Object *ob) } } #endif // XXX old animation system - if(animdata_use_time(ob->adt)) ob->recalc |= OB_RECALC; + + if(animdata_use_time(ob->adt)) { + ob->recalc |= OB_RECALC; + ob->adt->recalc |= ADT_RECALC_ANIM; + } + if((ob->adt) && (ob->type==OB_ARMATURE)) ob->recalc |= OB_RECALC_DATA; if(object_modifiers_use_time(ob)) ob->recalc |= OB_RECALC_DATA; diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 9cdd67428ac..7b3ac9e4ec2 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -565,33 +565,10 @@ int scene_check_setscene(Scene *sce) return 1; } -static void scene_update(Scene *sce, unsigned int lay) -{ - Base *base; - Object *ob; - - if(sce->theDag==NULL) - DAG_scene_sort(sce); - - DAG_scene_update_flags(sce, lay); // only stuff that moves or needs display still - - for(base= sce->base.first; base; base= base->next) { - ob= base->object; - - object_handle_update(sce, ob); // bke_object.h - - /* only update layer when an ipo */ - // XXX old animation system - //if(ob->ipo && has_ipo_code(ob->ipo, OB_LAY) ) { - // base->lay= ob->lay; - //} - } -} - /* This (evil) function is needed to cope with two legacy Blender rendering features - * mblur (motion blur that renders 'subframes' and blurs them together), and fields - * rendering. Thus, the use of ugly globals from object.c - */ +* mblur (motion blur that renders 'subframes' and blurs them together), and fields +* rendering. Thus, the use of ugly globals from object.c +*/ // BAD... EVIL... JUJU...!!!! // XXX moved here temporarily float frame_to_float (Scene *scene, int cfra) /* see also bsystem_time in object.c */ @@ -607,24 +584,47 @@ float frame_to_float (Scene *scene, int cfra) /* see also bsystem_time in objec return ctime; } +static void scene_update(Scene *sce, unsigned int lay) +{ + Base *base; + Object *ob; + float ctime = frame_to_float(sce, sce->r.cfra); + + if(sce->theDag==NULL) + DAG_scene_sort(sce); + + DAG_scene_update_flags(sce, lay); // only stuff that moves or needs display still + + /* All 'standard' (i.e. without any dependencies) animation is handled here, + * with an 'local' to 'macro' order of evaluation. This should ensure that + * settings stored nestled within a hierarchy (i.e. settings in a Texture block + * can be overridden by settings from Scene, which owns the Texture through a hierarchy + * such as Scene->World->MTex/Texture) can still get correctly overridden. + */ + BKE_animsys_evaluate_all_animation(G.main, ctime); + + for(base= sce->base.first; base; base= base->next) { + ob= base->object; + + object_handle_update(sce, ob); // bke_object.h + + /* only update layer when an ipo */ + // XXX old animation system + //if(ob->ipo && has_ipo_code(ob->ipo, OB_LAY) ) { + // base->lay= ob->lay; + //} + } +} + + /* applies changes right away, does all sets too */ void scene_update_for_newframe(Scene *sce, unsigned int lay) { Scene *scene= sce; - float ctime = frame_to_float(sce, sce->r.cfra); /* clear animation overrides */ // XXX TODO... - /* All 'standard' (i.e. without any dependencies) animation is handled here, - * with an 'local' to 'macro' order of evaluation. This should ensure that - * settings stored nestled within a hierarchy (i.e. settings in a Texture block - * can be overridden by settings from Scene, which owns the Texture through a hierarchy - * such as Scene->World->MTex/Texture) can still get correctly overridden. - */ - BKE_animsys_evaluate_all_animation(G.main, ctime); - - #ifndef DISABLE_PYTHON if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED, 0); #endif diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 6f064b3db86..b2995836732 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1002,6 +1002,7 @@ static int frame_offset_exec(bContext *C, wmOperator *op) delta = RNA_int_get(op->ptr, "delta"); CTX_data_scene(C)->r.cfra += delta; + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C)); return OPERATOR_FINISHED; @@ -1760,7 +1761,7 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event) scene->r.cfra= scene->r.sfra; } - WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C)); + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); return OPERATOR_FINISHED; } diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 1ace7bce09c..9382e170a21 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -121,7 +121,7 @@ typedef void (*wmUIHandlerRemoveFunc)(struct bContext *C, void *userdata); /* ************** Notifiers ****************** */ typedef struct wmNotifier { - struct wmNotifier *prev, *next; + struct wmNotifier *next, *prev; struct wmWindowManager *wm; struct wmWindow *window; @@ -162,9 +162,9 @@ typedef struct wmNotifier { /* NC_SCREEN screen */ #define ND_SCREENBROWSE (1<<16) -#define ND_SCENEBROWSE (2<<16) /* NC_SCENE Scene */ +#define ND_SCENEBROWSE (1<<16) #define ND_MARKERS (2<<16) #define ND_FRAME (3<<16) #define ND_RENDER_OPTIONS (4<<16) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index dcca2fa60c9..886456733f9 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -162,29 +162,33 @@ void wm_event_do_notifiers(bContext *C) wmWindow *win; for(win= wm->windows.first; win; win= win->next) { - ScrArea *sa; - ARegion *ar; - - /* XXX context in notifiers? */ - CTX_wm_window_set(C, win); - - /* printf("notifier win %d screen %s\n", win->winid, win->screen->id.name+2); */ - ED_screen_do_listen(win, note); - - for(ar=win->screen->regionbase.first; ar; ar= ar->next) { - ED_region_do_listen(ar, note); - } - for(sa= win->screen->areabase.first; sa; sa= sa->next) { - ED_area_do_listen(sa, note); - for(ar=sa->regionbase.first; ar; ar= ar->next) { + /* filter out notifiers */ + if(note->category==NC_SCREEN && note->reference && note->reference!=win->screen); + else if(note->category==NC_SCENE && note->reference && note->reference!=win->screen->scene); + else { + ScrArea *sa; + ARegion *ar; + + /* XXX context in notifiers? */ + CTX_wm_window_set(C, win); + + /* printf("notifier win %d screen %s\n", win->winid, win->screen->id.name+2); */ + ED_screen_do_listen(win, note); + + for(ar=win->screen->regionbase.first; ar; ar= ar->next) { ED_region_do_listen(ar, note); } + + for(sa= win->screen->areabase.first; sa; sa= sa->next) { + ED_area_do_listen(sa, note); + for(ar=sa->regionbase.first; ar; ar= ar->next) { + ED_region_do_listen(ar, note); + } + } } } - CTX_wm_window_set(C, NULL); - MEM_freeN(note); } From 8f712f86b9afd010aa24aea7bc6c686dd3ef43a1 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Mon, 9 Feb 2009 16:52:33 +0000 Subject: [PATCH 15/63] 2.5 - Render: scene buttons RENDER and ANIM now work - Nodes: text drawing for socket names back --- source/blender/editors/space_buttons/Makefile | 1 + source/blender/editors/space_buttons/SConscript | 2 +- .../editors/space_buttons/buttons_scene.c | 16 ++++++++++++---- source/blender/editors/space_node/node_draw.c | 8 +++----- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/space_buttons/Makefile b/source/blender/editors/space_buttons/Makefile index ff82f25ea55..b96d1cc5495 100644 --- a/source/blender/editors/space_buttons/Makefile +++ b/source/blender/editors/space_buttons/Makefile @@ -44,6 +44,7 @@ CPPFLAGS += -I../../blenloader CPPFLAGS += -I../../blenkernel CPPFLAGS += -I../../blenlib CPPFLAGS += -I../../makesdna +CPPFLAGS += -I../../makesrna CPPFLAGS += -I../../imbuf CPPFLAGS += -I../../python CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include diff --git a/source/blender/editors/space_buttons/SConscript b/source/blender/editors/space_buttons/SConscript index 0bd5374c3ca..d36dd89b681 100644 --- a/source/blender/editors/space_buttons/SConscript +++ b/source/blender/editors/space_buttons/SConscript @@ -5,6 +5,6 @@ sources = env.Glob('*.c') incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' -incs += ' ../../render/extern/include' +incs += ' ../../makesrna ../../render/extern/include' env.BlenderLib ( 'bf_editors_space_buttons', sources, Split(incs), [], libtype=['core'], priority=[120] ) diff --git a/source/blender/editors/space_buttons/buttons_scene.c b/source/blender/editors/space_buttons/buttons_scene.c index f278b6379ab..e4cff2f4f06 100644 --- a/source/blender/editors/space_buttons/buttons_scene.c +++ b/source/blender/editors/space_buttons/buttons_scene.c @@ -40,9 +40,14 @@ #include "RE_pipeline.h" +#include "RNA_access.h" +#include "RNA_define.h" + #include "UI_interface.h" #include "UI_resources.h" +#include "WM_types.h" + #include "buttons_intern.h" #define R_DISPLAYIMAGE 0 @@ -212,7 +217,8 @@ static void render_panel_render(const bContext *C, ARegion *ar) if(uiNewPanel(C, ar, block, "Render", "Render", 320, 0, 318, 204)==0) return; uiBlockBeginAlign(block); - uiDefBut(block, BUT,0,"RENDER", 369, 164, 191,37, 0, 0, 0, 0, 0, "Render the current frame (F12)"); + uiDefButO(block, BUT, "SCREEN_OT_render", WM_OP_INVOKE_DEFAULT, "RENDER", 369, 164, 191,37, "Render the current frame (F12)"); + #ifndef DISABLE_YAFRAY /* yafray: on request, render engine menu is back again, and moved to Render panel */ uiDefButS(block, MENU, 0, "Rendering Engine %t|Blender Internal %x0|YafRay %x1", @@ -287,12 +293,14 @@ void render_panel_anim(const bContext *C, ARegion *ar) { Scene *scene= CTX_data_scene(C); uiBlock *block; - + uiBut *but; + block= uiBeginBlock(C, ar, "render_panel_anim", UI_EMBOSS, UI_HELV); if(uiNewPanel(C, ar, block, "Anim", "Render", 640, 0, 318, 204) == 0) return; - uiDefBut(block, BUT, 0, "ANIM", 692,142,192,47, 0, 0, 0, 0, 0, "Render the animation to disk from start to end frame, (Ctrl+F12)"); - + but= uiDefButO(block, BUT, "SCREEN_OT_render", WM_OP_INVOKE_DEFAULT, "ANIM", 692,142,192,47, "Render the animation to disk from start to end frame, (Ctrl+F12)"); + RNA_boolean_set(uiButGetOperatorPtrRNA(but), "anim", 1); + uiBlockSetCol(block, TH_BUT_SETTING1); uiBlockBeginAlign(block); uiDefButBitI(block, TOG, R_DOSEQ, 0, "Do Sequence",692,114,192,20, &scene->r.scemode, 0, 0, 0, 0, "Enables sequence output rendering (Default: 3D rendering)"); diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index ffb25339bc3..e9d865a371a 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -823,11 +823,9 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN } } else { - /* XXX fix UI_ThemeColor(TH_TEXT); ui_rasterpos_safe(sock->locx+8.0f, sock->locy-5.0f, snode->aspect); UI_DrawString(snode->curfont, sock->name, 0); - */ } } } @@ -835,11 +833,12 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN /* socket outputs */ for(sock= node->outputs.first; sock; sock= sock->next) { if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { + float slen; + int ofs= 0; + socket_circle_draw(sock, NODE_SOCKSIZE); - /* XXX fix UI_ThemeColor(TH_TEXT); - ofs= 0; slen= snode->aspect*UI_GetStringWidth(snode->curfont, sock->name, 0); while(slen > node->width) { ofs++; @@ -847,7 +846,6 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN } ui_rasterpos_safe(sock->locx-8.0f-slen, sock->locy-5.0f, snode->aspect); UI_DrawString(snode->curfont, sock->name+ofs, 0); - */ } } From c02bc1ce5379356b5c17034457a59aebf6e41725 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Mon, 9 Feb 2009 18:06:45 +0000 Subject: [PATCH 16/63] 2.5 Bugfix: enter editmode had wrong notifier reference pointer, caused redraws to skip. --- source/blender/editors/object/object_edit.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index b90009adfa8..fc64b707e16 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -1665,7 +1665,6 @@ void OBJECT_OT_select_random(wmOperatorType *ot) static int object_clear_location_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); int armature_clear= 0; CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { @@ -1708,7 +1707,6 @@ void OBJECT_OT_clear_location(wmOperatorType *ot) static int object_clear_rotation_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); int armature_clear= 0; CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { @@ -1752,7 +1750,6 @@ void OBJECT_OT_clear_rotation(wmOperatorType *ot) static int object_clear_scale_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); int armature_clear= 0; CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { @@ -1777,7 +1774,7 @@ static int object_clear_scale_exec(bContext *C, wmOperator *op) if(armature_clear==0) /* in this case flush was done */ ED_anim_dag_flush_update(C); - WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, CTX_data_scene(C)); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL); return OPERATOR_FINISHED; } @@ -3041,7 +3038,7 @@ void ED_object_exit_editmode(bContext *C, int flag) if(flag & EM_WAITCURSOR) waitcursor(0); - WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, ob); + WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, scene); } @@ -3083,7 +3080,7 @@ void ED_object_enter_editmode(bContext *C, int flag) make_editMesh(scene, ob); - WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_MESH, ob); + WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_MESH, scene); } else if (ob->type==OB_ARMATURE){ bArmature *arm= base->object->data; From 283926aa2d0c6366d92a4f38e994e843b73659f6 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 9 Feb 2009 20:58:31 +0000 Subject: [PATCH 17/63] 2.5: UV Editor module porting pretty much finished now, only missing still is mirror transform. This commits adds the remaining operators: * UV mapping operators (U key menu): cube, sphere, cylinder, etc. * Hide/Show operators. And solves most XXX's, including: * Fix bad includes and calls into space image. * Aspect ratio correction. * Create UVs if they don't exist yet on unwrap. * Assign image to UVs. * Drawing proportional edit circle. --- source/blender/editors/include/ED_image.h | 14 + source/blender/editors/include/ED_mesh.h | 4 + source/blender/editors/include/ED_uvedit.h | 3 +- .../editors/interface/interface_regions.c | 6 +- source/blender/editors/mesh/editface.c | 544 ---------- source/blender/editors/mesh/editmesh_lib.c | 1 + source/blender/editors/mesh/editmesh_mods.c | 233 +---- source/blender/editors/mesh/mesh_intern.h | 24 - source/blender/editors/mesh/mesh_ops.c | 4 +- .../blender/editors/space_image/image_draw.c | 9 +- .../editors/space_image/image_header.c | 86 +- .../editors/space_image/image_intern.h | 15 - .../blender/editors/space_image/image_ops.c | 39 +- .../blender/editors/space_image/space_image.c | 105 +- source/blender/editors/transform/transform.c | 4 + .../editors/transform/transform_constraints.c | 23 +- .../blender/editors/transform/transform_ops.c | 5 +- source/blender/editors/uvedit/uvedit_draw.c | 51 +- source/blender/editors/uvedit/uvedit_intern.h | 12 +- source/blender/editors/uvedit/uvedit_ops.c | 322 +++++- .../editors/uvedit/uvedit_parametrizer.c | 4 +- .../editors/uvedit/uvedit_unwrap_ops.c | 963 ++++++++++++++++-- 22 files changed, 1351 insertions(+), 1120 deletions(-) diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h index 84225d85877..f015001c0d5 100644 --- a/source/blender/editors/include/ED_image.h +++ b/source/blender/editors/include/ED_image.h @@ -33,9 +33,23 @@ struct bContext; /* space_image.c, exported for transform */ struct Image *ED_space_image(struct SpaceImage *sima); +void ED_space_image_set(struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima); + +struct ImBuf *ED_space_image_buffer(struct SpaceImage *sima); void ED_space_image_size(struct SpaceImage *sima, int *width, int *height); +void ED_space_image_aspect(struct SpaceImage *sima, float *aspx, float *aspy); +void ED_space_image_zoom(struct SpaceImage *sima, struct ARegion *ar, float *zoomx, float *zoomy); void ED_space_image_uv_aspect(struct SpaceImage *sima, float *aspx, float *aspy); +void ED_image_size(struct Image *ima, int *width, int *height); +void ED_image_aspect(struct Image *ima, float *aspx, float *aspy); +void ED_image_uv_aspect(struct Image *ima, float *aspx, float *aspy); + +int ED_space_image_show_render(struct SpaceImage *sima); +int ED_space_image_show_paint(struct SpaceImage *sima); +int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit); +int ED_space_image_show_uvshadow(struct SpaceImage *sima, struct Object *obedit); + /* image_render.c, export for screen_ops.c, render operator */ void ED_space_image_output(struct bContext *C); diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index bd997e93e9b..e32243fc28f 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -119,6 +119,7 @@ void EM_deselect_flush(struct EditMesh *em); void EM_selectmode_set(struct EditMesh *em); void EM_select_flush(struct EditMesh *em); void EM_convertsel(struct EditMesh *em, short oldmode, short selectmode); +void EM_validate_selections(struct EditMesh *em); /* exported to transform */ int EM_get_actSelection(struct EditMesh *em, struct EditSelection *ese); @@ -139,6 +140,9 @@ void EM_free_backbuf(void); int EM_init_backbuf_border(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax); int EM_init_backbuf_circle(struct ViewContext *vc, short xs, short ys, short rads); +void EM_hide_mesh(struct EditMesh *em, int swap); +void EM_reveal_mesh(struct EditMesh *em); + /* editface.c */ struct MTFace *EM_get_active_mtface(struct EditMesh *em, struct EditFace **act_efa, struct MCol **mcol, int sloppy); diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h index fa106ff4360..74a9be75db6 100644 --- a/source/blender/editors/include/ED_uvedit.h +++ b/source/blender/editors/include/ED_uvedit.h @@ -28,6 +28,7 @@ #ifndef ED_UVEDIT_H #define ED_UVEDIT_H +struct bContext; struct Scene; struct Object; struct MTFace; @@ -40,7 +41,7 @@ void ED_operatortypes_uvedit(void); void ED_keymap_uvedit(struct wmWindowManager *wm); void ED_uvedit_assign_image(struct Scene *scene, struct Object *obedit, struct Image *ima, struct Image *previma); -void ED_uvedit_set_tile(struct Scene *scene, struct Object *obedit, struct Image *ima, int curtile, int dotile); +void ED_uvedit_set_tile(struct bContext *C, struct Scene *scene, struct Object *obedit, struct Image *ima, int curtile, int dotile); int ED_uvedit_minmax(struct Scene *scene, struct Image *ima, struct Object *obedit, float *min, float *max); int ED_uvedit_test_silent(struct Object *obedit); diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index f5f5a98129d..696fde4b512 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -240,7 +240,9 @@ ARegion *ui_add_temporary_region(bScreen *sc) void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar) { - wm_draw_region_clear(CTX_wm_window(C), ar); + if(CTX_wm_window(C)) + wm_draw_region_clear(CTX_wm_window(C), ar); + ED_region_exit(C, ar); BKE_area_region_free(NULL, ar); /* NULL: no spacetype */ BLI_freelinkN(&sc->regionbase, ar); @@ -1938,7 +1940,7 @@ uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut uiMenuInfo info; head= MEM_callocN(sizeof(uiMenuItem), "menu dummy"); - head->opcontext= WM_OP_EXEC_REGION_WIN; + head->opcontext= WM_OP_INVOKE_REGION_WIN; menu_func(C, head, arg); diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index f2dd68973b8..6c17dff3428 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -81,27 +81,6 @@ /* own include */ #include "mesh_intern.h" - -/* Pupmenu codes: */ -#define UV_CUBE_MAPPING 2 -#define UV_CYL_MAPPING 3 -#define UV_SPHERE_MAPPING 4 -#define UV_BOUNDS_MAPPING 5 -#define UV_RESET_MAPPING 6 -#define UV_WINDOW_MAPPING 7 -#define UV_UNWRAP_MAPPING 8 -#define UV_CYL_EX 32 -#define UV_SPHERE_EX 34 - -/* Some macro tricks to make pupmenu construction look nicer :-) - Sorry, just did it for fun. */ - -#define _STR(x) " " #x -#define STRING(x) _STR(x) - -#define MENUSTRING(string, code) string " %x" STRING(code) -#define MENUTITLE(string) string " %t|" - /* ***************** XXX **************** */ static int sample_backbuf_rect() {return 0;} static int sample_backbuf() {return 0;} @@ -139,462 +118,6 @@ int facesel_face_pick(View3D *v3d, Mesh *me, short *mval, unsigned int *index, s return 1; } -/* only operates on the edit object - this is all thats needed at the moment */ -static void uv_calc_center_vector(Scene *scene, View3D *v3d, float *result, Object *ob, EditMesh *em) -{ - float min[3], max[3], *cursx; - - EditFace *efa; - switch (v3d->around) - { - case V3D_CENTER: /* bounding box center */ - min[0]= min[1]= min[2]= 1e20f; - max[0]= max[1]= max[2]= -1e20f; - - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - DO_MINMAX(efa->v1->co, min, max); - DO_MINMAX(efa->v2->co, min, max); - DO_MINMAX(efa->v3->co, min, max); - if(efa->v4) DO_MINMAX(efa->v4->co, min, max); - } - } - VecMidf(result, min, max); - break; - case V3D_CURSOR: /*cursor center*/ - cursx= give_cursor(scene, v3d); - /* shift to objects world */ - result[0]= cursx[0]-ob->obmat[3][0]; - result[1]= cursx[1]-ob->obmat[3][1]; - result[2]= cursx[2]-ob->obmat[3][2]; - break; - case V3D_LOCAL: /*object center*/ - case V3D_CENTROID: /* multiple objects centers, only one object here*/ - default: - result[0]= result[1]= result[2]= 0.0; - break; - } -} - -static void uv_calc_map_matrix(float result[][4], RegionView3D *rv3d, Object *ob, float upangledeg, float sideangledeg, float radius) -{ - float rotup[4][4], rotside[4][4], viewmatrix[4][4], rotobj[4][4]; - float sideangle= 0.0, upangle= 0.0; - int k; - - /* get rotation of the current view matrix */ - Mat4CpyMat4(viewmatrix, rv3d->viewmat); - /* but shifting */ - for( k= 0; k< 4; k++) viewmatrix[3][k] =0.0; - - /* get rotation of the current object matrix */ - Mat4CpyMat4(rotobj,ob->obmat); - /* but shifting */ - for( k= 0; k< 4; k++) rotobj[3][k] =0.0; - - Mat4Clr(*rotup); - Mat4Clr(*rotside); - - /* compensate front/side.. against opengl x,y,z world definition */ - /* this is "kanonen gegen spatzen", a few plus minus 1 will do here */ - /* i wanted to keep the reason here, so we're rotating*/ - sideangle= M_PI * (sideangledeg + 180.0) /180.0; - rotside[0][0]= (float)cos(sideangle); - rotside[0][1]= -(float)sin(sideangle); - rotside[1][0]= (float)sin(sideangle); - rotside[1][1]= (float)cos(sideangle); - rotside[2][2]= 1.0f; - - upangle= M_PI * upangledeg /180.0; - rotup[1][1]= (float)cos(upangle)/radius; - rotup[1][2]= -(float)sin(upangle)/radius; - rotup[2][1]= (float)sin(upangle)/radius; - rotup[2][2]= (float)cos(upangle)/radius; - rotup[0][0]= (float)1.0/radius; - - /* calculate transforms*/ - Mat4MulSerie(result,rotup,rotside,viewmatrix,rotobj,NULL,NULL,NULL,NULL); -} - -static void uv_calc_shift_project(ARegion *ar, View3D *v3d, float *target, float *shift, float rotmat[][4], int projectionmode, float *source, float *min, float *max) -{ - RegionView3D *rv3d= ar->regiondata; - float pv[3]; - - VecSubf(pv, source, shift); - Mat4MulVecfl(rotmat, pv); - - switch(projectionmode) { - case B_UVAUTO_CYLINDER: - tubemap(pv[0], pv[1], pv[2], &target[0],&target[1]); - /* split line is always zero */ - if (target[0] >= 1.0f) target[0] -= 1.0f; - break; - - case B_UVAUTO_SPHERE: - spheremap(pv[0], pv[1], pv[2], &target[0],&target[1]); - /* split line is always zero */ - if (target[0] >= 1.0f) target[0] -= 1.0f; - break; - - case 3: /* ortho special case for BOUNDS */ - target[0] = -pv[0]; - target[1] = pv[2]; - break; - - case 4: - { - /* very special case for FROM WINDOW */ - float pv4[4], dx, dy, x= 0.0, y= 0.0; - - dx= ar->winx; - dy= ar->winy; - - VecCopyf(pv4, source); - pv4[3] = 1.0; - - /* rotmat is the object matrix in this case */ - Mat4MulVec4fl(rotmat, pv4); - - /* almost project_short */ - Mat4MulVec4fl(rv3d->persmat, pv4); - if (fabs(pv4[3]) > 0.00001) { /* avoid division by zero */ - target[0] = dx/2.0 + (dx/2.0)*pv4[0]/pv4[3]; - target[1] = dy/2.0 + (dy/2.0)*pv4[1]/pv4[3]; - } - else { - /* scaling is lost but give a valid result */ - target[0] = dx/2.0 + (dx/2.0)*pv4[0]; - target[1] = dy/2.0 + (dy/2.0)*pv4[1]; - } - - /* v3d->persmat seems to do this funky scaling */ - if(dx > dy) { - y= (dx-dy)/2.0; - dy = dx; - } - else { - x= (dy-dx)/2.0; - dx = dy; - } - target[0]= (x + target[0])/dx; - target[1]= (y + target[1])/dy; - - } - break; - - default: - target[0] = 0.0; - target[1] = 1.0; - } - - /* we know the values here and may need min_max later */ - /* max requests independand from min; not fastest but safest */ - if(min) { - min[0] = MIN2(target[0], min[0]); - min[1] = MIN2(target[1], min[1]); - } - if(max) { - max[0] = MAX2(target[0], max[0]); - max[1] = MAX2(target[1], max[1]); - } -} - -static void correct_uv_aspect( EditMesh *em ) -{ - float aspx=1, aspy=1; - EditFace *efa = EM_get_actFace(em, 1); - MTFace *tface; - - if (efa) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); -// XXX image_final_aspect(tface->tpage, &aspx, &aspy); - } - - if (aspx != aspy) { - - float scale; - - if (aspx > aspy) { - scale = aspy/aspx; - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - tface->uv[0][0] = ((tface->uv[0][0]-0.5)*scale)+0.5; - tface->uv[1][0] = ((tface->uv[1][0]-0.5)*scale)+0.5; - tface->uv[2][0] = ((tface->uv[2][0]-0.5)*scale)+0.5; - if(efa->v4) { - tface->uv[3][0] = ((tface->uv[3][0]-0.5)*scale)+0.5; - } - } - } - } else { - scale = aspx/aspy; - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - tface->uv[0][1] = ((tface->uv[0][1]-0.5)*scale)+0.5; - tface->uv[1][1] = ((tface->uv[1][1]-0.5)*scale)+0.5; - tface->uv[2][1] = ((tface->uv[2][1]-0.5)*scale)+0.5; - if(efa->v4) { - tface->uv[3][1] = ((tface->uv[3][1]-0.5)*scale)+0.5; - } - } - } - } - } -} - -static void default_uv(float uv[][2], float size) -{ - int dy; - - if(size>1.0) size= 1.0; - - dy= 1.0-size; - - uv[0][0]= 0; - uv[0][1]= size+dy; - - uv[1][0]= 0; - uv[1][1]= dy; - - uv[2][0]= size; - uv[2][1]= dy; - - uv[3][0]= size; - uv[3][1]= size+dy; -} - -static void calculate_uv_map(Scene *scene, ARegion *ar, View3D *v3d, EditMesh *em, unsigned short mapmode) -{ - RegionView3D *rv3d= ar->regiondata; - MTFace *tface; - Object *ob; - EditFace *efa; - float dx, dy, rotatematrix[4][4], radius= 1.0, min[3], cent[3], max[3]; - float fac= 1.0, upangledeg= 0.0, sideangledeg= 90.0; - int i, b, mi, n; - - if(scene->toolsettings->uvcalc_mapdir==1) { - upangledeg= 90.0; - sideangledeg= 0.0; - } else { - upangledeg= 0.0; - if(scene->toolsettings->uvcalc_mapalign==1) sideangledeg= 0.0; - else sideangledeg= 90.0; - } - - /* add uvs if there not here */ - if (!EM_texFaceCheck(em)) { - if (em && em->faces.first) - EM_add_data_layer(em, &em->fdata, CD_MTFACE); - -// XXX if (G.sima && G.sima->image) /* this is a bit of a kludge, but assume they want the image on their mesh when UVs are added */ -// image_changed(G.sima, G.sima->image); - - if (!EM_texFaceCheck(em)) - return; - - /* select new UV's */ -// XX if ((G.sima && G.sima->flag & SI_SYNC_UVSEL)==0) { -// for(efa=em->faces.first; efa; efa=efa->next) { -// MTFace *tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); -// simaFaceSel_Set(efa, tf); -// } - - } - - ob=OBACT; - - switch(mapmode) { - case B_UVAUTO_BOUNDS: - min[0]= min[1]= 10000000.0; - max[0]= max[1]= -10000000.0; - - cent[0] = cent[1] = cent[2] = 0.0; - uv_calc_map_matrix(rotatematrix, rv3d, ob, upangledeg, sideangledeg, 1.0f); - - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - uv_calc_shift_project(ar, v3d, tface->uv[0],cent,rotatematrix,3, efa->v1->co, min,max); - uv_calc_shift_project(ar, v3d, tface->uv[1],cent,rotatematrix,3, efa->v2->co, min,max); - uv_calc_shift_project(ar, v3d, tface->uv[2],cent,rotatematrix,3, efa->v3->co,min,max); - if(efa->v4) - uv_calc_shift_project(ar, v3d, tface->uv[3],cent,rotatematrix,3, efa->v4->co,min,max); - } - } - - /* rescale UV to be in 1/1 */ - dx= (max[0]-min[0]); - dy= (max[1]-min[1]); - - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - if(efa->v4) b= 3; else b= 2; - for(; b>=0; b--) { - tface->uv[b][0]= ((tface->uv[b][0]-min[0])*fac)/dx; - tface->uv[b][1]= 1.0-fac+((tface->uv[b][1]-min[1])/* *fac */)/dy; - } - } - } - break; - - case B_UVAUTO_WINDOW: - cent[0] = cent[1] = cent[2] = 0.0; - Mat4CpyMat4(rotatematrix,ob->obmat); - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - uv_calc_shift_project(ar, v3d, tface->uv[0],cent,rotatematrix,4, efa->v1->co, NULL,NULL); - uv_calc_shift_project(ar, v3d, tface->uv[1],cent,rotatematrix,4, efa->v2->co, NULL,NULL); - uv_calc_shift_project(ar, v3d, tface->uv[2],cent,rotatematrix,4, efa->v3->co, NULL,NULL); - if(efa->v4) - uv_calc_shift_project(ar, v3d, tface->uv[3],cent,rotatematrix,4, efa->v4->co, NULL,NULL); - } - } - break; - - case B_UVAUTO_RESET: - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - default_uv(tface->uv, 1.0); - } - } - break; - - case B_UVAUTO_CYLINDER: - case B_UVAUTO_SPHERE: - uv_calc_center_vector(scene, v3d, cent, ob, em); - - if(mapmode==B_UVAUTO_CYLINDER) radius = scene->toolsettings->uvcalc_radius; - - /* be compatible to the "old" sphere/cylinder mode */ - if (scene->toolsettings->uvcalc_mapdir== 2) - Mat4One(rotatematrix); - else - uv_calc_map_matrix(rotatematrix, rv3d, ob, upangledeg,sideangledeg,radius); - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - uv_calc_shift_project(ar, v3d, tface->uv[0],cent,rotatematrix,mapmode, efa->v1->co, NULL,NULL); - uv_calc_shift_project(ar, v3d, tface->uv[1],cent,rotatematrix,mapmode, efa->v2->co, NULL,NULL); - uv_calc_shift_project(ar, v3d, tface->uv[2],cent,rotatematrix,mapmode, efa->v3->co, NULL,NULL); - n = 3; - if(efa->v4) { - uv_calc_shift_project(ar, v3d, tface->uv[3],cent,rotatematrix,mapmode, efa->v4->co, NULL,NULL); - n=4; - } - - mi = 0; - for (i = 1; i < n; i++) - if (tface->uv[i][0] > tface->uv[mi][0]) mi = i; - - for (i = 0; i < n; i++) { - if (i != mi) { - dx = tface->uv[mi][0] - tface->uv[i][0]; - if (dx > 0.5) tface->uv[i][0] += 1.0; - } - } - } - } - - break; - - case B_UVAUTO_CUBE: - { - /* choose x,y,z axis for projetion depending on the largest normal */ - /* component, but clusters all together around the center of map */ - float no[3]; - short cox, coy; - float *loc= ob->obmat[3]; - /*MVert *mv= me->mvert;*/ - float cubesize = scene->toolsettings->uvcalc_cubesize; - - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - CalcNormFloat(efa->v1->co, efa->v2->co, efa->v3->co, no); - - no[0]= fabs(no[0]); - no[1]= fabs(no[1]); - no[2]= fabs(no[2]); - - cox=0; coy= 1; - if(no[2]>=no[0] && no[2]>=no[1]); - else if(no[1]>=no[0] && no[1]>=no[2]) coy= 2; - else { cox= 1; coy= 2; } - - tface->uv[0][0]= 0.5+0.5*cubesize*(loc[cox] + efa->v1->co[cox]); - tface->uv[0][1]= 0.5+0.5*cubesize*(loc[coy] + efa->v1->co[coy]); - dx = floor(tface->uv[0][0]); - dy = floor(tface->uv[0][1]); - tface->uv[0][0] -= dx; - tface->uv[0][1] -= dy; - tface->uv[1][0]= 0.5+0.5*cubesize*(loc[cox] + efa->v2->co[cox]); - tface->uv[1][1]= 0.5+0.5*cubesize*(loc[coy] + efa->v2->co[coy]); - tface->uv[1][0] -= dx; - tface->uv[1][1] -= dy; - tface->uv[2][0]= 0.5+0.5*cubesize*(loc[cox] + efa->v3->co[cox]); - tface->uv[2][1]= 0.5+0.5*cubesize*(loc[coy] + efa->v3->co[coy]); - tface->uv[2][0] -= dx; - tface->uv[2][1] -= dy; - if(efa->v4) { - tface->uv[3][0]= 0.5+0.5*cubesize*(loc[cox] + efa->v4->co[cox]); - tface->uv[3][1]= 0.5+0.5*cubesize*(loc[coy] + efa->v4->co[coy]); - tface->uv[3][0] -= dx; - tface->uv[3][1] -= dy; - } - } - } - break; - } - default: - if ((scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT)==0) - correct_uv_aspect(em); - return; - } /* end switch mapmode */ - - /* clipping and wrapping */ - if(0) { // XXX (make it uv layer property!) G.sima && G.sima->flag & SI_CLIP_UV) { - for (efa= em->faces.first; efa; efa= efa->next) { - if (!(efa->f & SELECT)) continue; - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - - dx= dy= 0; - if(efa->v4) b= 3; else b= 2; - for(; b>=0; b--) { - while(tface->uv[b][0] + dx < 0.0) dx+= 0.5; - while(tface->uv[b][0] + dx > 1.0) dx-= 0.5; - while(tface->uv[b][1] + dy < 0.0) dy+= 0.5; - while(tface->uv[b][1] + dy > 1.0) dy-= 0.5; - } - - if(efa->v4) b= 3; else b= 2; - for(; b>=0; b--) { - tface->uv[b][0]+= dx; - CLAMP(tface->uv[b][0], 0.0, 1.0); - - tface->uv[b][1]+= dy; - CLAMP(tface->uv[b][1], 0.0, 1.0); - } - } - } - - if ( (mapmode!=B_UVAUTO_BOUNDS) && - (mapmode!=B_UVAUTO_RESET) && - (scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT)==0 - ) { - correct_uv_aspect(em); - } - -// XXX notifier object_uvs_changed(OBACT); - -} - /* last_sel, use em->act_face otherwise get the last selected face in the editselections * at the moment, last_sel is mainly useful for gaking sure the space image dosnt flicker */ MTFace *EM_get_active_mtface(EditMesh *em, EditFace **act_efa, MCol **mcol, int sloppy) @@ -1211,73 +734,6 @@ void face_borderselect(Scene *scene, ARegion *ar) #endif } -void uv_autocalc_tface(Scene *scene, ARegion *ar, View3D *v3d, EditMesh *em) -{ - short mode; -#ifndef DISABLE_PYTHON -// short i=0, has_pymenu=0; /* pymenu must be bigger then UV_*_MAPPING */ -// XXX BPyMenu *pym; -// char menu_number[3]; -#endif - - /* uvmenu, will add python items */ - char uvmenu[4096]=MENUTITLE("UV Calculation") - MENUSTRING("Unwrap", UV_UNWRAP_MAPPING) "|%l|" - - MENUSTRING("Cube Projection", UV_CUBE_MAPPING) "|" - MENUSTRING("Cylinder from View", UV_CYL_MAPPING) "|" - MENUSTRING("Sphere from View", UV_SPHERE_MAPPING) "|%l|" - - MENUSTRING("Project From View", UV_WINDOW_MAPPING) "|" - MENUSTRING("Project from View (Bounds)",UV_BOUNDS_MAPPING) "|%l|" - - MENUSTRING("Reset", UV_RESET_MAPPING); -#ifndef DISABLE_PYTHON -#if 0 - XXX - /* note that we account for the 10 previous entries with i+10: */ - for (pym = BPyMenuTable[PYMENU_UVCALCULATION]; pym; pym = pym->next, i++) { - - if (!has_pymenu) { - strcat(uvmenu, "|%l"); - has_pymenu = 1; - } - - strcat(uvmenu, "|"); - strcat(uvmenu, pym->name); - strcat(uvmenu, " %x"); - sprintf(menu_number, "%d", i+10); - strcat(uvmenu, menu_number); - } -#endif -#endif - - mode= pupmenu(uvmenu); -#ifndef DISABLE_PYTHON -// if (mode >= 10) { -// BPY_menu_do_python(PYMENU_UVCALCULATION, mode - 10); -// return; -// } -#endif - switch(mode) { - case UV_CUBE_MAPPING: - calculate_uv_map(scene, ar, v3d, em, B_UVAUTO_CUBE); break; - case UV_CYL_MAPPING: - calculate_uv_map(scene, ar, v3d, em, B_UVAUTO_CYLINDER); break; - case UV_SPHERE_MAPPING: - calculate_uv_map(scene, ar, v3d, em, B_UVAUTO_SPHERE); break; - case UV_BOUNDS_MAPPING: - calculate_uv_map(scene, ar, v3d, em, B_UVAUTO_BOUNDS); break; - case UV_RESET_MAPPING: - calculate_uv_map(scene, ar, v3d, em, B_UVAUTO_RESET); break; - case UV_WINDOW_MAPPING: - calculate_uv_map(scene, ar, v3d, em, B_UVAUTO_WINDOW); break; - case UV_UNWRAP_MAPPING: -// XXX unwrap_lscm(0); - break; - } -} - /* Texture Paint */ void set_texturepaint(Scene *scene) /* toggle */ diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c index 0ee4d2f8274..738cdd7a77f 100644 --- a/source/blender/editors/mesh/editmesh_lib.c +++ b/source/blender/editors/mesh/editmesh_lib.c @@ -219,6 +219,7 @@ void EM_validate_selections(EditMesh *em) EditSelection *ese, *nextese; ese = em->selected.first; + while(ese){ nextese = ese->next; if(ese->type == EDITVERT && !(((EditVert*)ese->data)->f & SELECT)) BLI_freelinkN(&(em->selected), ese); diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 77fa456a76c..bd878946bb9 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -2533,9 +2533,8 @@ void MESH_OT_select_linked(wmOperatorType *ot) /* ************************* */ - /* swap is 0 or 1, if 1 it hides not selected */ -static void hide_mesh(EditMesh *em, int swap) +void EM_hide_mesh(EditMesh *em, int swap) { EditVert *eve; EditEdge *eed; @@ -2642,7 +2641,7 @@ static int hide_mesh_exec(bContext *C, wmOperator *op) Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; - hide_mesh(em, RNA_boolean_get(op->ptr, "invert")); + EM_hide_mesh(em, RNA_boolean_get(op->ptr, "invert")); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -2665,7 +2664,7 @@ void MESH_OT_hide(wmOperatorType *ot) RNA_def_boolean(ot->srna, "invert", 0, "Invert", ""); } -void reveal_mesh(EditMesh *em) +void EM_reveal_mesh(EditMesh *em) { EditVert *eve; EditEdge *eed; @@ -2706,8 +2705,8 @@ static int reveal_mesh_exec(bContext *C, wmOperator *op) Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; - reveal_mesh(em); - + EM_reveal_mesh(em); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; } @@ -2726,228 +2725,6 @@ void MESH_OT_reveal(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -void hide_tface_uv(EditMesh *em, int swap) -{ -#if 0 - /* no space image here */ - EditFace *efa; - MTFace *tface; - - if( is_uv_tface_editing_allowed()==0 ) return; - - /* call the mesh function if we are in mesh sync sel */ - if (G.sima->flag & SI_SYNC_UVSEL) { - hide_mesh(swap); - return; - } - - if(swap) { - for (efa= em->faces.first; efa; efa= efa->next) { - if(efa->f & SELECT) { - tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - if (G.sima->flag & SI_SELACTFACE) { - /* Pretend face mode */ - if (( (efa->v4==NULL && - ( tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) == (TF_SEL1|TF_SEL2|TF_SEL3) ) || - ( tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) == (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) ) == 0) { - - if (em->selectmode == SCE_SELECT_FACE) { - efa->f &= ~SELECT; - /* must re-select after */ - efa->e1->f &= ~SELECT; - efa->e2->f &= ~SELECT; - efa->e3->f &= ~SELECT; - if(efa->e4) efa->e4->f &= ~SELECT; - } else { - EM_select_face(efa, 0); - } - } - tface->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); - } else if (em->selectmode == SCE_SELECT_FACE) { - if((tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))==0) { - if(!efa->v4) - EM_select_face(efa, 0); - else if(!(tface->flag & TF_SEL4)) - EM_select_face(efa, 0); - tface->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); - } - } else { - /* EM_deselect_flush will deselect the face */ - if((tface->flag & TF_SEL1)==0) efa->v1->f &= ~SELECT; - if((tface->flag & TF_SEL2)==0) efa->v2->f &= ~SELECT; - if((tface->flag & TF_SEL3)==0) efa->v3->f &= ~SELECT; - if((efa->v4) && (tface->flag & TF_SEL4)==0) efa->v4->f &= ~SELECT; - tface->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); - } - } - } - } else { - for (efa= em->faces.first; efa; efa= efa->next) { - if(efa->f & SELECT) { - tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - if (G.sima->flag & SI_SELACTFACE) { - if ( (efa->v4==NULL && - ( tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) == (TF_SEL1|TF_SEL2|TF_SEL3) ) || - ( tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) == (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) ) { - - if (em->selectmode == SCE_SELECT_FACE) { - efa->f &= ~SELECT; - /* must re-select after */ - efa->e1->f &= ~SELECT; - efa->e2->f &= ~SELECT; - efa->e3->f &= ~SELECT; - if(efa->e4) efa->e4->f &= ~SELECT; - } else { - EM_select_face(efa, 0); - } - } - tface->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); - } else if (em->selectmode == SCE_SELECT_FACE) { - if(tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) - EM_select_face(efa, 0); - else if(efa->v4 && tface->flag & TF_SEL4) - EM_select_face(efa, 0); - tface->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); - } else { - /* EM_deselect_flush will deselect the face */ - if(tface->flag & TF_SEL1) efa->v1->f &= ~SELECT; - if(tface->flag & TF_SEL2) efa->v2->f &= ~SELECT; - if(tface->flag & TF_SEL3) efa->v3->f &= ~SELECT; - if((efa->v4) && tface->flag & TF_SEL4) efa->v4->f &= ~SELECT; - tface->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); - } - } - } - } - - - /*deselects too many but ok for now*/ - if(em->selectmode & (SCE_SELECT_EDGE|SCE_SELECT_VERTEX)) { - EM_deselect_flush(em); - } - - if (em->selectmode==SCE_SELECT_FACE) { - /* de-selected all edges from faces that were de-selected. - * now make sure all faces that are selected also have selected edges */ - for (efa= em->faces.first; efa; efa= efa->next) { - if (efa->f & SELECT) { - EM_select_face(efa, 1); - } - } - } - - EM_validate_selections(); - -// XXX object_tface_flags_changed(OBACT, 0); -#endif -} - -void reveal_tface_uv(EditMesh *em) -{ -#if 0 - /* function should move away? */ - EditFace *efa; - MTFace *tface; - - if( is_uv_tface_editing_allowed()==0 ) return; - - /* call the mesh function if we are in mesh sync sel */ - if (G.sima->flag & SI_SYNC_UVSEL) { - reveal_mesh(); - return; - } - - if (G.sima->flag & SI_SELACTFACE) { - if (em->selectmode == SCE_SELECT_FACE) { - for (efa= em->faces.first; efa; efa= efa->next) { - if (!(efa->h) && !(efa->f & SELECT)) { - tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - EM_select_face(efa, 1); - tface->flag |= TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4; - } - } - } else { - /* enable adjacent faces to have disconnected UV selections if sticky is disabled */ - if (G.sima->sticky == SI_STICKY_DISABLE) { - for (efa= em->faces.first; efa; efa= efa->next) { - if (!(efa->h) && !(efa->f & SELECT)) { - /* All verts must be unselected for the face to be selected in the UV view */ - if ((efa->v1->f&SELECT)==0 && (efa->v2->f&SELECT)==0 && (efa->v3->f&SELECT)==0 && (efa->v4==0 || (efa->v4->f&SELECT)==0)) { - tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - tface->flag |= TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4; - /* Cant use EM_select_face here because it unselects the verts - * and we cant tell if the face was totally unselected or not */ - /*EM_select_face(efa, 1); - * - * See Loop with EM_select_face() below... */ - efa->f |= SELECT; - } - } - } - } else { - for (efa= em->faces.first; efa; efa= efa->next) { - if (!(efa->h) && !(efa->f & SELECT)) { - tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - if ((efa->v1->f & SELECT)==0) {tface->flag |= TF_SEL1;} - if ((efa->v2->f & SELECT)==0) {tface->flag |= TF_SEL2;} - if ((efa->v3->f & SELECT)==0) {tface->flag |= TF_SEL3;} - if ((efa->v4 && (efa->v4->f & SELECT)==0)) {tface->flag |= TF_SEL4;} - efa->f |= SELECT; - } - } - } - - /* Select all edges and verts now */ - for (efa= em->faces.first; efa; efa= efa->next) { - /* we only selected the face flags, and didnt changes edges or verts, fix this now */ - if (!(efa->h) && (efa->f & SELECT)) { - EM_select_face(efa, 1); - } - } - EM_select_flush(em); - } - } else if (em->selectmode == SCE_SELECT_FACE) { - for (efa= em->faces.first; efa; efa= efa->next) { - if (!(efa->h) && !(efa->f & SELECT)) { - tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - efa->f |= SELECT; - tface->flag |= TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4; - } - } - - /* Select all edges and verts now */ - for (efa= em->faces.first; efa; efa= efa->next) { - /* we only selected the face flags, and didnt changes edges or verts, fix this now */ - if (!(efa->h) && (efa->f & SELECT)) { - EM_select_face(efa, 1); - } - } - - } else { - for (efa= em->faces.first; efa; efa= efa->next) { - if (!(efa->h) && !(efa->f & SELECT)) { - tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - if ((efa->v1->f & SELECT)==0) {tface->flag |= TF_SEL1;} - if ((efa->v2->f & SELECT)==0) {tface->flag |= TF_SEL2;} - if ((efa->v3->f & SELECT)==0) {tface->flag |= TF_SEL3;} - if ((efa->v4 && (efa->v4->f & SELECT)==0)) {tface->flag |= TF_SEL4;} - efa->f |= SELECT; - } - } - - /* Select all edges and verts now */ - for (efa= em->faces.first; efa; efa= efa->next) { - /* we only selected the face flags, and didnt changes edges or verts, fix this now */ - if (!(efa->h) && (efa->f & SELECT)) { - EM_select_face(efa, 1); - } - } - } - -// XXX object_tface_flags_changed(OBACT, 0); -#endif -} - void select_faces_by_numverts(EditMesh *em, int numverts) { EditFace *efa; diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h index 89dc8942a2a..0e54e10793c 100644 --- a/source/blender/editors/mesh/mesh_intern.h +++ b/source/blender/editors/mesh/mesh_intern.h @@ -43,30 +43,6 @@ int edgetag_context_check(Scene *scene, EditEdge *eed); void edgetag_context_set(Scene *scene, EditEdge *eed, int val); int edgetag_shortest_path(Scene *scene, EditMesh *em, EditEdge *source, EditEdge *target); -/* ******************* meshtools.c */ - - -/* XXX move to uv editor? */ -enum { - B_UVAUTO_REDRAW = 3301, - B_UVAUTO_SPHERE, - B_UVAUTO_CYLINDER, - B_UVAUTO_CYLRADIUS, - B_UVAUTO_WINDOW, - B_UVAUTO_CUBE, - B_UVAUTO_CUBESIZE, - B_UVAUTO_RESET, - B_UVAUTO_BOUNDS, - B_UVAUTO_TOP, - B_UVAUTO_FACE, - B_UVAUTO_OBJECT, - B_UVAUTO_ALIGNX, - B_UVAUTO_ALIGNY, - B_UVAUTO_UNWRAP, - B_UVAUTO_DRAWFACES -}; - - /* ******************* editmesh.c */ extern void free_editvert(EditMesh *em, EditVert *eve); diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index f119c347915..fe50c1ec27a 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -285,7 +285,7 @@ void ED_keymap_mesh(wmWindowManager *wm) WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0); - - + /* UV's */ + WM_keymap_add_item(keymap, "UV_OT_mapping_menu", UKEY, KM_PRESS, 0, 0); } diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 70a05d52376..42c91d7ea1b 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -52,6 +52,7 @@ #include "BIF_gl.h" #include "BIF_glutil.h" +#include "ED_image.h" #include "ED_screen.h" #include "UI_resources.h" @@ -663,16 +664,16 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene) } } /* and we check for spare */ - ibuf= get_space_image_buffer(sima); + ibuf= ED_space_image_buffer(sima); } #endif /* put scene context variable in iuser */ sima->iuser.scene= scene; /* retrieve the image and information about it */ - ima= get_space_image(sima); - ibuf= get_space_image_buffer(sima); - get_space_image_zoom(sima, ar, &zoomx, &zoomy); + ima= ED_space_image(sima); + ibuf= ED_space_image_buffer(sima); + ED_space_image_zoom(sima, ar, &zoomx, &zoomy); show_viewer= (ima && ima->source == IMA_SRC_VIEWER); show_render= (show_viewer && ima->type == IMA_TYPE_R_RESULT); diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index 7f9171e87b3..3a1b623c09e 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -51,6 +51,7 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" +#include "ED_image.h" #include "ED_mesh.h" #include "ED_screen.h" #include "ED_types.h" @@ -61,6 +62,7 @@ #include "BIF_gl.h" #include "BIF_glutil.h" +#include "BIF_transform.h" #include "UI_interface.h" #include "UI_resources.h" @@ -132,9 +134,9 @@ static void image_viewmenu(bContext *C, uiMenuItem *head, void *arg_unused) RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr); RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr); - show_render= get_space_image_show_render(sima); - show_paint= get_space_image_show_paint(sima); - show_uvedit= get_space_image_show_uvedit(sima, CTX_data_edit_object(C)); + show_render= ED_space_image_show_render(sima); + show_paint= ED_space_image_show_paint(sima); + show_uvedit= ED_space_image_show_uvedit(sima, CTX_data_edit_object(C)); /* create menu */ uiMenuItemO(head, ICON_MENU_PANEL, "IMAGE_OT_toggle_view_properties_panel"); // View Properties... @@ -251,10 +253,10 @@ static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused) int show_render; /* retrieve state */ - ima= get_space_image(sima); - ibuf= get_space_image_buffer(sima); + ima= ED_space_image(sima); + ibuf= ED_space_image_buffer(sima); - show_render= get_space_image_show_render(sima); + show_render= ED_space_image_show_render(sima); RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr); @@ -306,56 +308,18 @@ static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused) #endif } -#if 0 -static void do_image_uvs_showhidemenu(void *arg, int event) -{ - switch(event) { - case 4: /* show hidden faces */ - reveal_tface_uv(); - break; - case 5: /* hide selected faces */ - hide_tface_uv(0); - break; - case 6: /* hide deselected faces */ - hide_tface_uv(1); - break; - } - allqueue(REDRAWVIEW3D, 0); -} -#endif - static void image_uvs_showhidemenu(bContext *C, uiMenuItem *head, void *arg_unused) { - uiMenuItemO(head, 0, "UV_OT_show_hidden_faces"); // Show Hidden Faces|Alt H - uiMenuItemO(head, 0, "UV_OT_hide_selected_faces"); // Hide Selected Faces|H - uiMenuItemO(head, 0, "UV_OT_hide_deselected_faces"); // Hide Deselected Faces|Shift H + uiMenuItemO(head, 0, "UV_OT_show_hidden"); + uiMenuItemO(head, 0, "UV_OT_hide_selected"); + uiMenuItemO(head, 0, "UV_OT_hide_deselected"); } -#if 0 -static void do_image_uvs_transformmenu(void *arg, int event) -{ - switch(event) { - case 0: /* Grab */ - initTransform(TFM_TRANSLATION, CTX_NONE); - Transform(); - break; - case 1: /* Rotate */ - initTransform(TFM_ROTATION, CTX_NONE); - Transform(); - break; - case 2: /* Scale */ - initTransform(TFM_RESIZE, CTX_NONE); - Transform(); - break; - } -} -#endif - static void image_uvs_transformmenu(bContext *C, uiMenuItem *head, void *arg_unused) { - uiMenuItemO(head, 0, "UV_OT_grab"); // Grab/Move|G - uiMenuItemO(head, 0, "UV_OT_rotate"); // Rotate|R - uiMenuItemO(head, 0, "UV_OT_scale"); // Scale|S + uiMenuItemEnumO(head, 0, "TFM_OT_transform", "mode", TFM_TRANSLATION); + uiMenuItemEnumO(head, 0, "TFM_OT_transform", "mode", TFM_ROTATION); + uiMenuItemEnumO(head, 0, "TFM_OT_transform", "mode", TFM_RESIZE); } static void image_uvs_mirrormenu(bContext *C, uiMenuItem *head, void *arg_unused) @@ -435,8 +399,8 @@ static void image_uvsmenu(bContext *C, uiMenuItem *head, void *arg_unused) ImBuf *ibuf; /* retrieve state */ - ima= get_space_image(sima); - ibuf= get_space_image_buffer(sima); + ima= ED_space_image(sima); + ibuf= ED_space_image_buffer(sima); RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr); RNA_id_pointer_create(&scene->id, &sceneptr); @@ -806,11 +770,14 @@ static void sima_idpoin_handle(bContext *C, ID *id, int event) switch(event) { case UI_ID_BROWSE: case UI_ID_DELETE: - set_space_image(sima, scene, obedit, sima->image); + ED_space_image_set(sima, scene, obedit, sima->image); if(sima->image && sima->image->id.us==0) sima->image->id.us= 1; + if(obedit) + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + ED_area_tag_redraw(CTX_wm_area(C)); ED_undo_push(C, "Assign Image UV"); break; @@ -844,12 +811,12 @@ void image_header_buttons(const bContext *C, ARegion *ar) int xco, yco= 3, show_uvedit, show_render, show_paint; /* retrieve state */ - ima= get_space_image(sima); - ibuf= get_space_image_buffer(sima); + ima= ED_space_image(sima); + ibuf= ED_space_image_buffer(sima); - show_render= get_space_image_show_render(sima); - show_paint= get_space_image_show_paint(sima); - show_uvedit= get_space_image_show_uvedit(sima, CTX_data_edit_object(C)); + show_render= ED_space_image_show_render(sima); + show_paint= ED_space_image_show_paint(sima); + show_uvedit= ED_space_image_show_uvedit(sima, CTX_data_edit_object(C)); RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr); RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr); @@ -1076,7 +1043,7 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event) uiMenuItem *head; int show_uvedit; - show_uvedit= get_space_image_show_uvedit(sima, obedit); + show_uvedit= ED_space_image_show_uvedit(sima, obedit); head= uiPupMenuBegin("Toolbox", 0); @@ -1101,4 +1068,3 @@ void IMAGE_OT_toolbox(wmOperatorType *ot) ot->poll= space_image_main_area_poll; } - diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h index 3f61ec6207a..bbf0ed792c0 100644 --- a/source/blender/editors/space_image/image_intern.h +++ b/source/blender/editors/space_image/image_intern.h @@ -39,21 +39,6 @@ struct ImBuf; struct wmOperatorType; struct Scene; -/* space_image.c */ -struct Image *get_space_image(struct SpaceImage *sima); -void set_space_image(struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima); - -struct ImBuf *get_space_image_buffer(struct SpaceImage *sima); -void get_space_image_size(struct SpaceImage *sima, int *width, int *height); -void get_space_image_aspect(struct SpaceImage *sima, float *aspx, float *aspy); -void get_space_image_zoom(struct SpaceImage *sima, struct ARegion *ar, float *zoomx, float *zoomy); -void get_space_image_uv_aspect(struct SpaceImage *sima, float *aspx, float *aspy); - -int get_space_image_show_render(struct SpaceImage *sima); -int get_space_image_show_paint(struct SpaceImage *sima); -int get_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit); -int get_space_image_show_uvshadow(struct SpaceImage *sima, struct Object *obedit); - /* image_header.c */ void image_header_buttons(const struct bContext *C, struct ARegion *ar); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index e8f5b6956fd..afda954b074 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -61,6 +61,7 @@ #include "RNA_define.h" #include "RNA_types.h" +#include "ED_image.h" #include "ED_screen.h" #include "ED_uvedit.h" @@ -126,7 +127,7 @@ static void sima_zoom_set(SpaceImage *sima, ARegion *ar, float zoom) return; /* check zoom limits */ - get_space_image_size(sima, &width, &height); + ED_space_image_size(sima, &width, &height); width *= sima->zoom; height *= sima->zoom; @@ -413,10 +414,10 @@ static int view_all_exec(bContext *C, wmOperator *op) scene= (Scene*)CTX_data_scene(C); obedit= CTX_data_edit_object(C); - ima= get_space_image(sima); - ibuf= get_space_image_buffer(sima); - get_space_image_size(sima, &width, &height); - get_space_image_aspect(sima, &aspx, &aspy); + ima= ED_space_image(sima); + ibuf= ED_space_image_buffer(sima); + ED_space_image_size(sima, &width, &height); + ED_space_image_aspect(sima, &aspx, &aspy); w= width*aspx; h= height*aspy; @@ -474,9 +475,9 @@ static int view_selected_exec(bContext *C, wmOperator *op) scene= (Scene*)CTX_data_scene(C); obedit= CTX_data_edit_object(C); - ima= get_space_image(sima); - ibuf= get_space_image_buffer(sima); - get_space_image_size(sima, &width, &height); + ima= ED_space_image(sima); + ibuf= ED_space_image_buffer(sima); + ED_space_image_size(sima, &width, &height); /* get bounds */ if(!ED_uvedit_minmax(scene, ima, obedit, min, max)) @@ -621,7 +622,7 @@ static void load_image_filesel(SpaceImage *sima, Scene *scene, Object *obedit, c ima= BKE_add_image_file(str, scene->r.cfra); if(ima) { BKE_image_signal(ima, &sima->iuser, IMA_SIGNAL_RELOAD); - set_space_image(sima, scene, obedit, ima); + ED_space_image_set(sima, scene, obedit, ima); } // XXX BIF_undo_push("Load image UV"); // XXX allqueue(REDRAWIMAGE, 0); @@ -642,8 +643,8 @@ static void replace_image_filesel(SpaceImage *sima, char *str) /* called from f static void save_image_doit(SpaceImage *sima, Scene *scene, char *name) { - Image *ima= get_space_image(sima); - ImBuf *ibuf= get_space_image_buffer(sima); + Image *ima= ED_space_image(sima); + ImBuf *ibuf= ED_space_image_buffer(sima); int len; char str[FILE_MAXDIR+FILE_MAXFILE]; @@ -775,7 +776,7 @@ static char *filesel_imagetype_string(Image *ima) void save_as_image_sima(SpaceImage *sima, Scene *scene) { Image *ima = sima->image; - ImBuf *ibuf= get_space_image_buffer(sima); + ImBuf *ibuf= ED_space_image_buffer(sima); char name[FILE_MAXDIR+FILE_MAXFILE]; if (ima) { @@ -801,8 +802,8 @@ void save_as_image_sima(SpaceImage *sima, Scene *scene) /* if exists, saves over without fileselect */ void save_image_sima(SpaceImage *sima, Scene *scene) { - Image *ima = get_space_image(sima); - ImBuf *ibuf= get_space_image_buffer(sima); + Image *ima = ED_space_image(sima); + ImBuf *ibuf= ED_space_image_buffer(sima); char name[FILE_MAXDIR+FILE_MAXFILE]; if (ima) { @@ -880,7 +881,7 @@ void reload_image_sima(SpaceImage *sima) { if (sima ) { BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); - /* set_space_image(sima, scene, obedit, NULL); - do we really need this? */ + /* ED_space_image_set(sima, scene, obedit, NULL); - do we really need this? */ } // XXX allqueue(REDRAWIMAGE, 0); @@ -912,7 +913,7 @@ void new_image_sima(SpaceImage *sima, Scene *scene, Object *obedit) #endif ima = BKE_add_image_size(width, height, name, floatbuf, uvtestgrid, color); - set_space_image(sima, scene, obedit, ima); + ED_space_image_set(sima, scene, obedit, ima); BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE); // XXX BIF_undo_push("Add image"); @@ -937,7 +938,7 @@ void pack_image_sima(SpaceImage *sima) } } else { - ImBuf *ibuf= get_space_image_buffer(sima); + ImBuf *ibuf= ED_space_image_buffer(sima); if (ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) { if(1) // XXX okee("Can't pack painted image. Use Repack as PNG?")) BKE_image_memorypack(ima); @@ -1045,7 +1046,7 @@ void image_final_aspect(Image *image, float *x, float *y) void sima_sample_color(SpaceImage *sima) { - ImBuf *ibuf= get_space_image_buffer(sima); + ImBuf *ibuf= ED_space_image_buffer(sima); float fx, fy; short mval[2], mvalo[2], firsttime=1; @@ -1143,7 +1144,7 @@ void mouseco_to_curtile(SpaceImage *sima, struct Object *obedit) short mval[2]; int show_uvedit; - show_uvedit= get_space_image_show_uvedit(sima, obedit); + show_uvedit= ED_space_image_show_uvedit(sima, obedit); if(!show_uvedit) return; if(sima->image && sima->image->tpageflag & IMA_TILES) { diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 19ba040ea8c..4f40dff378b 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -181,7 +181,7 @@ static void image_refresh(const bContext *C, ScrArea *sa) Object *obedit= CTX_data_edit_object(C); Image *ima; - ima= get_space_image(sima); + ima= ED_space_image(sima); /* check if we have to set the image from the editmesh */ if(ima && (ima->source==IMA_SRC_VIEWER || sima->pin)); @@ -235,11 +235,11 @@ static int image_context(const bContext *C, bContextDataMember member, bContextD SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); if(member == CTX_DATA_EDIT_IMAGE) { - CTX_data_pointer_set(result, get_space_image(sima)); + CTX_data_pointer_set(result, ED_space_image(sima)); return 1; } else if(member == CTX_DATA_EDIT_IMAGE_BUFFER) { - CTX_data_pointer_set(result, get_space_image_buffer(sima)); + CTX_data_pointer_set(result, ED_space_image_buffer(sima)); return 1; } @@ -251,7 +251,7 @@ static int image_context(const bContext *C, bContextDataMember member, bContextD /* sets up the fields of the View2D from zoom and offset */ static void image_main_area_set_view2d(SpaceImage *sima, ARegion *ar) { - Image *ima= get_space_image(sima); + Image *ima= ED_space_image(sima); float x1, y1, w, h; int width, height, winx, winy; @@ -274,7 +274,7 @@ static void image_main_area_set_view2d(SpaceImage *sima, ARegion *ar) } #endif - get_space_image_size(sima, &width, &height); + ED_space_image_size(sima, &width, &height); w= width; h= height; @@ -354,6 +354,7 @@ static void image_main_area_draw(const bContext *C, ARegion *ar) /* and uvs in 0.0-1.0 space */ UI_view2d_view_ortho(C, v2d); draw_uvedit_main(sima, ar, scene, obedit); + ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST); UI_view2d_view_restore(C); /* scrollers? */ @@ -472,13 +473,13 @@ void ED_spacetype_image(void) /**************************** common state *****************************/ -Image *get_space_image(SpaceImage *sima) +Image *ED_space_image(SpaceImage *sima) { return sima->image; } /* called to assign images to UV faces */ -void set_space_image(SpaceImage *sima, Scene *scene, Object *obedit, Image *ima) +void ED_space_image_set(SpaceImage *sima, Scene *scene, Object *obedit, Image *ima) { ED_uvedit_assign_image(scene, obedit, ima, sima->image); @@ -493,7 +494,7 @@ void set_space_image(SpaceImage *sima, Scene *scene, Object *obedit, Image *ima) BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE); } -ImBuf *get_space_image_buffer(SpaceImage *sima) +ImBuf *ED_space_image_buffer(SpaceImage *sima) { ImBuf *ibuf; @@ -512,11 +513,27 @@ ImBuf *get_space_image_buffer(SpaceImage *sima) return NULL; } -void get_space_image_size(SpaceImage *sima, int *width, int *height) +void ED_image_size(Image *ima, int *width, int *height) { ImBuf *ibuf; - ibuf= get_space_image_buffer(sima); + ibuf= (ima)? BKE_image_get_ibuf(ima, NULL): NULL; + + if(ibuf && ibuf->x > 0 && ibuf->y > 0) { + *width= ibuf->x; + *height= ibuf->y; + } + else { + *width= 256; + *height= 256; + } +} + +void ED_space_image_size(SpaceImage *sima, int *width, int *height) +{ + ImBuf *ibuf; + + ibuf= ED_space_image_buffer(sima); if(ibuf && ibuf->x > 0 && ibuf->y > 0) { *width= ibuf->x; @@ -530,12 +547,8 @@ void get_space_image_size(SpaceImage *sima, int *width, int *height) } } -void get_space_image_aspect(SpaceImage *sima, float *aspx, float *aspy) +void ED_image_aspect(Image *ima, float *aspx, float *aspy) { - Image *ima; - - ima= get_space_image(sima); - *aspx= *aspy= 1.0; if((ima == NULL) || (ima->type == IMA_TYPE_R_RESULT) || (ima->type == IMA_TYPE_COMPOSITE) || @@ -546,45 +559,61 @@ void get_space_image_aspect(SpaceImage *sima, float *aspx, float *aspy) *aspy = ima->aspy/ima->aspx; } -void get_space_image_zoom(SpaceImage *sima, ARegion *ar, float *zoomx, float *zoomy) +void ED_space_image_aspect(SpaceImage *sima, float *aspx, float *aspy) +{ + ED_image_aspect(ED_space_image(sima), aspx, aspy); +} + +void ED_space_image_zoom(SpaceImage *sima, ARegion *ar, float *zoomx, float *zoomy) { int width, height; - get_space_image_size(sima, &width, &height); + ED_space_image_size(sima, &width, &height); *zoomx= (float)(ar->winrct.xmax - ar->winrct.xmin)/(float)((ar->v2d.cur.xmax - ar->v2d.cur.xmin)*width); *zoomy= (float)(ar->winrct.ymax - ar->winrct.ymin)/(float)((ar->v2d.cur.ymax - ar->v2d.cur.ymin)*height); } -void get_space_image_uv_aspect(SpaceImage *sima, float *aspx, float *aspy) +void ED_space_image_uv_aspect(SpaceImage *sima, float *aspx, float *aspy) { int w, h; - get_space_image_aspect(sima, aspx, aspy); - get_space_image_size(sima, &w, &h); + ED_space_image_aspect(sima, aspx, aspy); + ED_space_image_size(sima, &w, &h); + + *aspx *= (float)w/256.0f; + *aspy *= (float)h/256.0f; +} + +void ED_image_uv_aspect(Image *ima, float *aspx, float *aspy) +{ + int w, h; + + ED_image_aspect(ima, aspx, aspy); + ED_image_size(ima, &w, &h); *aspx *= (float)w; *aspy *= (float)h; } -int get_space_image_show_render(SpaceImage *sima) +int ED_space_image_show_render(SpaceImage *sima) { return (sima->image && ELEM(sima->image->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE)); } -int get_space_image_show_paint(SpaceImage *sima) +int ED_space_image_show_paint(SpaceImage *sima) { - if(get_space_image_show_render(sima)) + if(ED_space_image_show_render(sima)) return 0; return (sima->flag & SI_DRAWTOOL); } -int get_space_image_show_uvedit(SpaceImage *sima, Object *obedit) +int ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit) { - if(get_space_image_show_render(sima)) + if(ED_space_image_show_render(sima)) return 0; - if(get_space_image_show_paint(sima)) + if(ED_space_image_show_paint(sima)) return 0; if(obedit && obedit->type == OB_MESH) @@ -593,33 +622,15 @@ int get_space_image_show_uvedit(SpaceImage *sima, Object *obedit) return 0; } -int get_space_image_show_uvshadow(SpaceImage *sima, Object *obedit) +int ED_space_image_show_uvshadow(SpaceImage *sima, Object *obedit) { - if(get_space_image_show_render(sima)) + if(ED_space_image_show_render(sima)) return 0; - if(get_space_image_show_paint(sima)) + if(ED_space_image_show_paint(sima)) if(obedit && obedit->type == OB_MESH) return EM_texFaceCheck(((Mesh*)obedit->data)->edit_mesh); return 0; } -/* Exported Functions */ - -Image *ED_space_image(SpaceImage *sima) -{ - return get_space_image(sima); -} - -void ED_space_image_size(SpaceImage *sima, int *width, int *height) -{ - get_space_image_size(sima, width, height); -} - -void ED_space_image_uv_aspect(SpaceImage *sima, float *aspx, float *aspy) -{ - get_space_image_uv_aspect(sima, aspx, aspy); -} - - diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 37781f68179..8c7bb0463c2 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -980,6 +980,10 @@ void initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) t->draw_handle = ED_region_draw_cb_activate(t->ar->type, drawTransform, t, REGION_DRAW_POST); } + else if(t->spacetype == SPACE_IMAGE) { + Mat3One(t->spacemtx); + t->draw_handle = ED_region_draw_cb_activate(t->ar->type, drawTransform, t, REGION_DRAW_POST); + } else Mat3One(t->spacemtx); diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index 58bfdc99d34..26d240be3fc 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -72,6 +72,7 @@ #include "BKE_global.h" #include "BKE_utildefines.h" +#include "ED_image.h" #include "ED_view3d.h" #include "BLI_arithb.h" @@ -681,7 +682,7 @@ void drawConstraint(TransInfo *t) { TransCon *tc = &(t->con); - if (t->spacetype!=SPACE_VIEW3D) + if (!ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE)) return; if (!(tc->mode & CON_APPLY)) return; @@ -743,7 +744,7 @@ void drawPropCircle(TransInfo *t) UI_ThemeColor(TH_GRID); - if (t->spacetype == SPACE_VIEW3D) + if(t->spacetype == SPACE_VIEW3D) { RegionView3D *rv3d = t->ar->regiondata; @@ -756,21 +757,25 @@ void drawPropCircle(TransInfo *t) Mat4One(imat); } - - if(t->obedit) + glPushMatrix(); + + if((t->spacetype == SPACE_VIEW3D) && t->obedit) { - glPushMatrix(); glMultMatrixf(t->obedit->obmat); /* because t->center is in local space */ } + else if(t->spacetype == SPACE_IMAGE) + { + float aspx, aspy; + + ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); + glScalef(1.0f/aspx, 1.0f/aspy, 1.0); + } set_inverted_drawing(1); drawcircball(GL_LINE_LOOP, t->center, t->propsize, imat); set_inverted_drawing(0); - if(t->obedit) - { - glPopMatrix(); - } + glPopMatrix(); } } diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 1e7c67c7cd3..49f0020420a 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -341,10 +341,11 @@ void transform_keymap_for_space(struct wmWindowManager *wm, struct ListBase *key km = WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, 0, 0); RNA_int_set(km->ptr, "mode", TFM_RESIZE); - km = WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0); - RNA_int_set(km->ptr, "mode", TFM_SHEAR); + km = WM_keymap_add_item(keymap, "TFM_OT_transform", MKEY, KM_PRESS, 0, 0); + RNA_int_set(km->ptr, "mode", TFM_MIRROR); break; default: break; } } + diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index 5bffe6b1124..9686d4d6094 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -38,7 +38,6 @@ #include "BKE_customdata.h" #include "BKE_DerivedMesh.h" -#include "BKE_global.h" // XXX make edge and face drawing flags local #include "BKE_object.h" #include "BKE_utildefines.h" @@ -48,54 +47,21 @@ #include "BIF_gl.h" #include "BIF_glutil.h" +#include "ED_image.h" #include "ED_mesh.h" #include "UI_resources.h" -#include "../space_image/image_intern.h" #include "uvedit_intern.h" -/* XXX make this draw extra for transform operator */ -#if 0 -static void draw_image_transform(ImBuf *ibuf, float xuser_asp, float yuser_asp) -{ -#if 0 - if(G.moving) { - float aspx, aspy, center[3]; - - BIF_drawConstraint(); - - if(ibuf==0 || ibuf->rect==0 || ibuf->x==0 || ibuf->y==0) { - aspx= aspy= 1.0; - } - else { - aspx= (256.0/ibuf->x) * xuser_asp; - aspy= (256.0/ibuf->y) * yuser_asp; - } - BIF_getPropCenter(center); - - /* scale and translate the circle into place and draw it */ - glPushMatrix(); - glScalef(aspx, aspy, 1.0); - glTranslatef((1/aspx)*center[0] - center[0], - (1/aspy)*center[1] - center[1], 0.0); - - BIF_drawPropCircle(); - - glPopMatrix(); - } -#endif -} -#endif - static void drawcursor_sima(SpaceImage *sima, ARegion *ar) { View2D *v2d= &ar->v2d; float zoomx, zoomy, w, h; int width, height; - get_space_image_size(sima, &width, &height); - get_space_image_zoom(sima, ar, &zoomx, &zoomy); + ED_space_image_size(sima, &width, &height); + ED_space_image_zoom(sima, ar, &zoomx, &zoomy); w= zoomx*width/256.0f; h= zoomy*height/256.0f; @@ -191,9 +157,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, EditMesh *em, MTFac Image *ima= sima->image; float aspx, aspy, col[4], tf_uv[4][2]; - aspx= 1.0f; - aspy= 1.0f; - //XXX transform_aspect_ratio_tf_uv(&aspx, &aspy); + ED_space_image_uv_aspect(sima, &aspx, &aspy); switch(sima->dt_uvstretch) { case SI_UVDT_STRETCH_AREA: @@ -823,8 +787,8 @@ void draw_uvedit_main(SpaceImage *sima, ARegion *ar, Scene *scene, Object *obedi { int show_uvedit, show_uvshadow; - show_uvedit= get_space_image_show_uvedit(sima, obedit); - show_uvshadow= get_space_image_show_uvshadow(sima, obedit); + show_uvedit= ED_space_image_show_uvedit(sima, obedit); + show_uvshadow= ED_space_image_show_uvshadow(sima, obedit); if(show_uvedit || show_uvshadow) { /* this is basically the same object_handle_update as in the 3d view, @@ -840,9 +804,6 @@ void draw_uvedit_main(SpaceImage *sima, ARegion *ar, Scene *scene, Object *obedi if(show_uvedit) drawcursor_sima(sima, ar); - - // XXX becomes operator draw extra: - // draw_image_transform(ibuf, xuser_asp, yuser_asp); } } diff --git a/source/blender/editors/uvedit/uvedit_intern.h b/source/blender/editors/uvedit/uvedit_intern.h index a66c9ea2fb8..cca357c8685 100644 --- a/source/blender/editors/uvedit/uvedit_intern.h +++ b/source/blender/editors/uvedit/uvedit_intern.h @@ -66,10 +66,16 @@ float uv_area(float uv[][2], int quad); void uv_copy_aspect(float uv_orig[][2], float uv[][2], float aspx, float aspy); /* operators */ -void UV_OT_pack_islands(struct wmOperatorType *ot); -void UV_OT_unwrap(struct wmOperatorType *ot); -void UV_OT_minimize_stretch(struct wmOperatorType *ot); void UV_OT_average_islands_scale(struct wmOperatorType *ot); +void UV_OT_cube_project(struct wmOperatorType *ot); +void UV_OT_cylinder_project(struct wmOperatorType *ot); +void UV_OT_from_view(struct wmOperatorType *ot); +void UV_OT_mapping_menu(struct wmOperatorType *ot); +void UV_OT_minimize_stretch(struct wmOperatorType *ot); +void UV_OT_pack_islands(struct wmOperatorType *ot); +void UV_OT_reset(struct wmOperatorType *ot); +void UV_OT_sphere_project(struct wmOperatorType *ot); +void UV_OT_unwrap(struct wmOperatorType *ot); #endif /* ED_UVEDIT_INTERN_H */ diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 86f5c782ca3..4c27151acef 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -56,6 +56,7 @@ #include "BIF_transform.h" +#include "ED_image.h" #include "ED_mesh.h" #include "ED_screen.h" @@ -69,7 +70,6 @@ #include "UI_view2d.h" #include "uvedit_intern.h" -#include "../space_image/image_intern.h" /************************* state testing ************************/ @@ -99,7 +99,7 @@ void ED_uvedit_assign_image(Scene *scene, Object *obedit, Image *ima, Image *pre return; em= ((Mesh*)obedit->data)->edit_mesh; - if(!em || !em->faces.first); + if(!em || !em->faces.first) return; /* ensure we have a uv layer */ @@ -133,15 +133,13 @@ void ED_uvedit_assign_image(Scene *scene, Object *obedit, Image *ima, Image *pre } /* and update depdency graph */ - if(update) { + if(update) DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - /* XXX ensure undo, notifiers? */ - } } /* dotile - 1, set the tile flag (from the space image) * 2, set the tile index for the faces. */ -void ED_uvedit_set_tile(Scene *scene, Object *obedit, Image *ima, int curtile, int dotile) +void ED_uvedit_set_tile(bContext *C, Scene *scene, Object *obedit, Image *ima, int curtile, int dotile) { EditMesh *em; EditFace *efa; @@ -174,7 +172,7 @@ void ED_uvedit_set_tile(Scene *scene, Object *obedit, Image *ima, int curtile, i } DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - // XXX WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); } /*********************** space conversion *********************/ @@ -183,7 +181,7 @@ static void uvedit_pixel_to_float(SpaceImage *sima, float *dist, float pixeldist { int width, height; - get_space_image_size(sima, &width, &height); + ED_space_image_size(sima, &width, &height); dist[0]= pixeldist/width; dist[1]= pixeldist/height; @@ -2183,8 +2181,8 @@ int circle_select_exec(bContext *C, wmOperator *op) /* compute ellipse size and location, not a circle since we deal * with non square image. ellipse is normalized, r = 1.0. */ - get_space_image_size(sima, &width, &height); - get_space_image_zoom(sima, ar, &zoomx, &zoomy); + ED_space_image_size(sima, &width, &height); + ED_space_image_zoom(sima, ar, &zoomx, &zoomy); ellipse[0]= width*zoomx/radius; ellipse[1]= height*zoomy/radius; @@ -2243,7 +2241,7 @@ static void snap_cursor_to_pixels(SpaceImage *sima, View2D *v2d) { int width= 0, height= 0; - get_space_image_size(sima, &width, &height); + ED_space_image_size(sima, &width, &height); snap_uv_to_pixel(v2d->cursor, width, height); } @@ -2460,7 +2458,7 @@ static int snap_uvs_to_pixels(SpaceImage *sima, Scene *scene, Object *obedit) float w, h; short change = 0; - get_space_image_size(sima, &width, &height); + ED_space_image_size(sima, &width, &height); w = (float)width; h = (float)height; @@ -2515,7 +2513,7 @@ void UV_OT_snap_selection(wmOperatorType *ot) static EnumPropertyItem target_items[] = { {0, "PIXELS", "Pixels", ""}, {1, "CURSOR", "Cursor", ""}, - {2, "ADJACENT_UNSELECTED", "Adjacent Unselected", ""}, + {2, "ADJACENT_DESELECTED", "Adjacent Deselected", ""}, {0, NULL, NULL, NULL}}; /* identifiers */ @@ -2584,7 +2582,7 @@ void UV_OT_pin(wmOperatorType *ot) RNA_def_boolean(ot->srna, "clear", 0, "Clear", "Clear pinning for the selection instead of setting it."); } -/* ******************** select pinned operator **************** */ +/******************* select pinned operator ***************/ static int select_pinned_exec(bContext *C, wmOperator *op) { @@ -2625,6 +2623,280 @@ void UV_OT_select_pinned(wmOperatorType *ot) ot->poll= ED_operator_uvedit; } +/********************** hide operator *********************/ + +static int hide_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + EditFace *efa; + MTFace *tf; + int swap= (strcmp(op->idname, "UV_OT_hide_deselected") == 0); + + if(scene->toolsettings->uv_flag & UV_SYNC_SELECTION) { + EM_hide_mesh(em, swap); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; + } + + if(swap) { + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + if(sima->flag & SI_SELACTFACE) { + /* Pretend face mode */ + if(( (efa->v4==NULL && + ( tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) == (TF_SEL1|TF_SEL2|TF_SEL3) ) || + ( tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) == (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) ) == 0) { + + if(em->selectmode == SCE_SELECT_FACE) { + efa->f &= ~SELECT; + /* must re-select after */ + efa->e1->f &= ~SELECT; + efa->e2->f &= ~SELECT; + efa->e3->f &= ~SELECT; + if(efa->e4) efa->e4->f &= ~SELECT; + } + else + EM_select_face(efa, 0); + } + tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); + } + else if(em->selectmode == SCE_SELECT_FACE) { + if((tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3))==0) { + if(!efa->v4) + EM_select_face(efa, 0); + else if(!(tf->flag & TF_SEL4)) + EM_select_face(efa, 0); + tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); + } + } + else { + /* EM_deselect_flush will deselect the face */ + if((tf->flag & TF_SEL1)==0) efa->v1->f &= ~SELECT; + if((tf->flag & TF_SEL2)==0) efa->v2->f &= ~SELECT; + if((tf->flag & TF_SEL3)==0) efa->v3->f &= ~SELECT; + if((efa->v4) && (tf->flag & TF_SEL4)==0) efa->v4->f &= ~SELECT; + + tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); + } + } + } + } + else { + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + if(sima->flag & SI_SELACTFACE) { + if( (efa->v4==NULL && + ( tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) == (TF_SEL1|TF_SEL2|TF_SEL3) ) || + ( tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) == (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) ) { + + if(em->selectmode == SCE_SELECT_FACE) { + efa->f &= ~SELECT; + /* must re-select after */ + efa->e1->f &= ~SELECT; + efa->e2->f &= ~SELECT; + efa->e3->f &= ~SELECT; + if(efa->e4) efa->e4->f &= ~SELECT; + } + else + EM_select_face(efa, 0); + } + + tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); + } + else if(em->selectmode == SCE_SELECT_FACE) { + if(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) + EM_select_face(efa, 0); + else if(efa->v4 && tf->flag & TF_SEL4) + EM_select_face(efa, 0); + + tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); + } + else { + /* EM_deselect_flush will deselect the face */ + if(tf->flag & TF_SEL1) efa->v1->f &= ~SELECT; + if(tf->flag & TF_SEL2) efa->v2->f &= ~SELECT; + if(tf->flag & TF_SEL3) efa->v3->f &= ~SELECT; + if((efa->v4) && tf->flag & TF_SEL4) efa->v4->f &= ~SELECT; + + tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4); + } + } + } + } + + /*deselects too many but ok for now*/ + if(em->selectmode & (SCE_SELECT_EDGE|SCE_SELECT_VERTEX)) + EM_deselect_flush(em); + + if(em->selectmode==SCE_SELECT_FACE) { + /* de-selected all edges from faces that were de-selected. + * now make sure all faces that are selected also have selected edges */ + for(efa= em->faces.first; efa; efa= efa->next) + if(efa->f & SELECT) + EM_select_face(efa, 1); + } + + EM_validate_selections(em); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void UV_OT_hide_selected(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Hide Selected"; + ot->idname= "UV_OT_hide_selected"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= hide_exec; + ot->poll= ED_operator_uvedit; +} + +void UV_OT_hide_deselected(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Hide Deselected"; + ot->idname= "UV_OT_hide_deselected"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= hide_exec; + ot->poll= ED_operator_uvedit; +} + +/****************** show hidden operator ******************/ + +static int show_hidden_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + EditFace *efa; + MTFace *tf; + + /* call the mesh function if we are in mesh sync sel */ + if(scene->toolsettings->uv_flag & UV_SYNC_SELECTION) { + EM_reveal_mesh(em); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; + } + + if(sima->flag & SI_SELACTFACE) { + if(em->selectmode == SCE_SELECT_FACE) { + for(efa= em->faces.first; efa; efa= efa->next) { + if(!(efa->h) && !(efa->f & SELECT)) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + EM_select_face(efa, 1); + tf->flag |= TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4; + } + } + } + else { + /* enable adjacent faces to have disconnected UV selections if sticky is disabled */ + if(sima->sticky == SI_STICKY_DISABLE) { + for(efa= em->faces.first; efa; efa= efa->next) { + if(!(efa->h) && !(efa->f & SELECT)) { + /* All verts must be unselected for the face to be selected in the UV view */ + if((efa->v1->f&SELECT)==0 && (efa->v2->f&SELECT)==0 && (efa->v3->f&SELECT)==0 && (efa->v4==0 || (efa->v4->f&SELECT)==0)) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + tf->flag |= TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4; + /* Cant use EM_select_face here because it unselects the verts + * and we cant tell if the face was totally unselected or not */ + /*EM_select_face(efa, 1); + * + * See Loop with EM_select_face() below... */ + efa->f |= SELECT; + } + } + } + } + else { + for(efa= em->faces.first; efa; efa= efa->next) { + if(!(efa->h) && !(efa->f & SELECT)) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + if((efa->v1->f & SELECT)==0) {tf->flag |= TF_SEL1;} + if((efa->v2->f & SELECT)==0) {tf->flag |= TF_SEL2;} + if((efa->v3->f & SELECT)==0) {tf->flag |= TF_SEL3;} + if((efa->v4 && (efa->v4->f & SELECT)==0)) {tf->flag |= TF_SEL4;} + + efa->f |= SELECT; + } + } + } + + /* Select all edges and verts now */ + for(efa= em->faces.first; efa; efa= efa->next) + /* we only selected the face flags, and didnt changes edges or verts, fix this now */ + if(!(efa->h) && (efa->f & SELECT)) + EM_select_face(efa, 1); + + EM_select_flush(em); + } + } + else if(em->selectmode == SCE_SELECT_FACE) { + for(efa= em->faces.first; efa; efa= efa->next) { + if(!(efa->h) && !(efa->f & SELECT)) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + efa->f |= SELECT; + tf->flag |= TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4; + } + } + + /* Select all edges and verts now */ + for(efa= em->faces.first; efa; efa= efa->next) + /* we only selected the face flags, and didnt changes edges or verts, fix this now */ + if(!(efa->h) && (efa->f & SELECT)) + EM_select_face(efa, 1); + } + else { + for(efa= em->faces.first; efa; efa= efa->next) { + if(!(efa->h) && !(efa->f & SELECT)) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + if((efa->v1->f & SELECT)==0) {tf->flag |= TF_SEL1;} + if((efa->v2->f & SELECT)==0) {tf->flag |= TF_SEL2;} + if((efa->v3->f & SELECT)==0) {tf->flag |= TF_SEL3;} + if((efa->v4 && (efa->v4->f & SELECT)==0)) {tf->flag |= TF_SEL4;} + + efa->f |= SELECT; + } + } + + /* Select all edges and verts now */ + for(efa= em->faces.first; efa; efa= efa->next) + /* we only selected the face flags, and didnt changes edges or verts, fix this now */ + if(!(efa->h) && (efa->f & SELECT)) + EM_select_face(efa, 1); + } + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void UV_OT_show_hidden(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Show Hidden"; + ot->idname= "UV_OT_show_hidden"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= show_hidden_exec; + ot->poll= ED_operator_uvedit; +} + /* ************************** registration **********************************/ void ED_operatortypes_uvedit(void) @@ -2648,10 +2920,20 @@ void ED_operatortypes_uvedit(void) WM_operatortype_append(UV_OT_weld); WM_operatortype_append(UV_OT_pin); - WM_operatortype_append(UV_OT_unwrap); - WM_operatortype_append(UV_OT_minimize_stretch); WM_operatortype_append(UV_OT_average_islands_scale); + WM_operatortype_append(UV_OT_cube_project); + WM_operatortype_append(UV_OT_cylinder_project); + WM_operatortype_append(UV_OT_from_view); + WM_operatortype_append(UV_OT_mapping_menu); + WM_operatortype_append(UV_OT_minimize_stretch); WM_operatortype_append(UV_OT_pack_islands); + WM_operatortype_append(UV_OT_reset); + WM_operatortype_append(UV_OT_sphere_project); + WM_operatortype_append(UV_OT_unwrap); + + WM_operatortype_append(UV_OT_show_hidden); + WM_operatortype_append(UV_OT_hide_selected); + WM_operatortype_append(UV_OT_hide_deselected); } void ED_keymap_uvedit(wmWindowManager *wm) @@ -2662,8 +2944,7 @@ void ED_keymap_uvedit(wmWindowManager *wm) WM_keymap_add_item(keymap, "UV_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); WM_keymap_add_item(keymap, "UV_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0); - // XXX not working? - RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, KM_ALT)->ptr, "extend", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "extend", 1); /* border/circle selection */ WM_keymap_add_item(keymap, "UV_OT_border_select", BKEY, KM_PRESS, 0, 0); @@ -2688,6 +2969,11 @@ void ED_keymap_uvedit(wmWindowManager *wm) WM_keymap_add_item(keymap, "UV_OT_pack_islands", PKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "UV_OT_average_islands_scale", AKEY, KM_PRESS, KM_CTRL, 0); + /* hide */ + WM_keymap_add_item(keymap, "UV_OT_hide_selected", HKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "UV_OT_hide_deselected", HKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "UV_OT_show_hidden", HKEY, KM_PRESS, KM_ALT, 0); + transform_keymap_for_space(wm, keymap, SPACE_IMAGE); } diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c index 635a7903d6f..0fcd0062044 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.c +++ b/source/blender/editors/uvedit/uvedit_parametrizer.c @@ -3828,7 +3828,7 @@ static void p_smooth(PChart *chart) if (hedges) MEM_freeN(hedges); if (vedges) MEM_freeN(vedges); - // XXX error("Not enough memory for area smoothing grid."); + // printf("Not enough memory for area smoothing grid."); return; } @@ -3978,7 +3978,7 @@ static void p_smooth(PChart *chart) if (triangles) MEM_freeN(triangles); if (tri) MEM_freeN(tri); - // XXX error("Not enough memory for area smoothing grid."); + // printf("Not enough memory for area smoothing grid."); return; } diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index c7e0dfd7bc7..ccad3acfd56 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -53,46 +53,54 @@ #include "PIL_time.h" +#include "ED_image.h" #include "ED_mesh.h" #include "ED_screen.h" #include "ED_uvedit.h" +#include "ED_view3d.h" #include "RNA_access.h" #include "RNA_define.h" +#include "UI_interface.h" + #include "WM_api.h" #include "WM_types.h" #include "uvedit_intern.h" #include "uvedit_parametrizer.h" -static void ED_uvedit_create_uvs(EditMesh *em) +static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit) { -#if 0 - if (em && em->faces.first) - EM_add_data_layer(&em->fdata, CD_MTFACE); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + EditFace *efa; + MTFace *tf; + + if(ED_uvedit_test(obedit)) + return 1; + + if(em && em->faces.first) + EM_add_data_layer(em, &em->fdata, CD_MTFACE); - if (!ED_uvedit_test(obedit)) - return; + if(!ED_uvedit_test(obedit)) + return 0; - if (G.sima && G.sima->image) /* this is a bit of a kludge, but assume they want the image on their mesh when UVs are added */ - image_changed(G.sima, G.sima->image); + // XXX this image is not in context in 3d view .. only + // way to get would be to find the first image window? + ED_uvedit_assign_image(scene, obedit, CTX_data_edit_image(C), NULL); /* select new UV's */ - if ((G.sima==0 || G.sima->flag & SI_SYNC_UVSEL)==0) { - EditFace *efa; - MTFace *tf; - for(efa=em->faces.first; efa; efa=efa->next) { - tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - simaFaceSel_Set(efa, tf); - } + for(efa=em->faces.first; efa; efa=efa->next) { + tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + uvedit_face_select(scene, efa, tf); } -#endif + + return 1; } /****************** Parametrizer Conversion ***************/ -ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, short fill, short sel) +ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, short fill, short sel, short correct_aspect) { ParamHandle *handle; EditFace *efa; @@ -103,37 +111,37 @@ ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, handle = param_construct_begin(); - if((scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT)==0) { + if(correct_aspect) { efa = EM_get_actFace(em, 1); - if (efa) { - float aspx = 1.0f, aspy= 1.0f; - // XXX MTFace *tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - // XXX image_final_aspect(tf->tpage, &aspx, &aspy); - // XXX get_space_image_aspect(sima, &aspx, &aspy); + if(efa) { + MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + float aspx, aspy; + + ED_image_uv_aspect(tf->tpage, &aspx, &aspy); - if (aspx!=aspy) + if(aspx!=aspy) param_aspect_ratio(handle, aspx, aspy); } } /* we need the vert indicies */ - for (ev= em->verts.first, a=0; ev; ev= ev->next, a++) + for(ev= em->verts.first, a=0; ev; ev= ev->next, a++) ev->tmp.l = a; - for (efa= em->faces.first; efa; efa= efa->next) { + for(efa= em->faces.first; efa; efa= efa->next) { ParamKey key, vkeys[4]; ParamBool pin[4], select[4]; float *co[4]; float *uv[4]; int nverts; - if ((efa->h) || (sel && (efa->f & SELECT)==0)) + if((efa->h) || (sel && (efa->f & SELECT)==0)) continue; tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - if (implicit && + if(implicit && !( uvedit_uv_selected(scene, efa, tf, 0) || uvedit_uv_selected(scene, efa, tf, 1) || uvedit_uv_selected(scene, efa, tf, 2) || @@ -163,7 +171,7 @@ ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, select[1] = ((uvedit_uv_selected(scene, efa, tf, 1)) != 0); select[2] = ((uvedit_uv_selected(scene, efa, tf, 2)) != 0); - if (efa->v4) { + if(efa->v4) { vkeys[3] = (ParamKey)efa->v4->tmp.l; co[3] = efa->v4->co; uv[3] = tf->uv[3]; @@ -177,8 +185,8 @@ ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, param_face_add(handle, key, nverts, vkeys, co, uv, pin, select); } - if (!implicit) { - for (eed= em->edges.first; eed; eed= eed->next) { + if(!implicit) { + for(eed= em->edges.first; eed; eed= eed->next) { if(eed->seam) { ParamKey vkeys[2]; vkeys[0] = (ParamKey)eed->v1->tmp.l; @@ -193,61 +201,7 @@ ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, return handle; } -/* ******************** unwrap operator **************** */ - -static int unwrap_exec(bContext *C, wmOperator *op) -{ - Scene *scene= CTX_data_scene(C); - Object *obedit= CTX_data_edit_object(C); - EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; - ParamHandle *handle; - int method = RNA_enum_get(op->ptr, "method"); - int fill_holes = RNA_boolean_get(op->ptr, "fill_holes"); - - /* add uvs if they don't exist yet */ - if(!ED_uvedit_test(obedit)) - ED_uvedit_create_uvs(em); - - handle= construct_param_handle(scene, em, 0, fill_holes, 0); - - param_lscm_begin(handle, PARAM_FALSE, method == 0); - param_lscm_solve(handle); - param_lscm_end(handle); - - param_pack(handle); - - param_flush(handle); - - param_delete(handle); - - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); - - return OPERATOR_FINISHED; -} - -void UV_OT_unwrap(wmOperatorType *ot) -{ - static EnumPropertyItem method_items[] = { - {0, "ANGLE_BASED", "Angle Based", ""}, - {1, "CONFORMAL", "Conformal", ""}, - {0, NULL, NULL, NULL}}; - - /* identifiers */ - ot->name= "Unwrap"; - ot->idname= "UV_OT_unwrap"; - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* api callbacks */ - ot->exec= unwrap_exec; - ot->poll= ED_operator_uvmap; - - /* properties */ - RNA_def_enum(ot->srna, "method", method_items, 0, "Method", "Unwrapping method. Angle Based usually gives better results than Conformal, while being somewhat slower."); - RNA_def_boolean(ot->srna, "fill_holes", 1, "Fill Holes", "Virtual fill holes in mesh before unwrapping, to better avoid overlaps and preserve symmetry."); -} - -/* ******************** minimize stretch operator **************** */ +/* ******************** Minimize Stretch operator **************** */ typedef struct MinStretch { Scene *scene; @@ -274,7 +228,7 @@ static void minimize_stretch_init(bContext *C, wmOperator *op) ms->em= em; ms->blend= RNA_float_get(op->ptr, "blend"); ms->iterations= RNA_int_get(op->ptr, "iterations"); - ms->handle= construct_param_handle(scene, em, 1, fill_holes, 1); + ms->handle= construct_param_handle(scene, em, 1, fill_holes, 1, 1); ms->lasttime= PIL_check_seconds_timer(); param_stretch_begin(ms->handle); @@ -440,7 +394,7 @@ void UV_OT_minimize_stretch(wmOperatorType *ot) RNA_def_int(ot->srna, "iterations", 0, 0, INT_MAX, "Iterations", "Number of iterations to run, 0 is unlimited when run interactively.", 0, 100); } -/* ******************** pack islands operator **************** */ +/* ******************** Pack Islands operator **************** */ static int pack_islands_exec(bContext *C, wmOperator *op) { @@ -449,7 +403,7 @@ static int pack_islands_exec(bContext *C, wmOperator *op) EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; ParamHandle *handle; - handle = construct_param_handle(scene, em, 1, 0, 1); + handle = construct_param_handle(scene, em, 1, 0, 1, 1); param_pack(handle); param_flush(handle); param_delete(handle); @@ -472,7 +426,7 @@ void UV_OT_pack_islands(wmOperatorType *ot) ot->poll= ED_operator_uvedit; } -/* ******************** average islands scale operator **************** */ +/* ******************** Average Islands Scale operator **************** */ static int average_islands_scale_exec(bContext *C, wmOperator *op) { @@ -481,7 +435,7 @@ static int average_islands_scale_exec(bContext *C, wmOperator *op) EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; ParamHandle *handle; - handle= construct_param_handle(scene, em, 1, 0, 1); + handle= construct_param_handle(scene, em, 1, 0, 1, 1); param_average(handle); param_flush(handle); param_delete(handle); @@ -516,14 +470,14 @@ void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit) if(!ED_uvedit_test(obedit)) return; - liveHandle = construct_param_handle(scene, em, 0, fillholes, 1); + liveHandle = construct_param_handle(scene, em, 0, fillholes, 1, 1); param_lscm_begin(liveHandle, PARAM_TRUE, abf); } void ED_uvedit_live_unwrap_re_solve(void) { - if (liveHandle) { + if(liveHandle) { param_lscm_solve(liveHandle); param_flush(liveHandle); } @@ -531,12 +485,831 @@ void ED_uvedit_live_unwrap_re_solve(void) void ED_uvedit_live_unwrap_end(short cancel) { - if (liveHandle) { + if(liveHandle) { param_lscm_end(liveHandle); - if (cancel) + if(cancel) param_flush_restore(liveHandle); param_delete(liveHandle); liveHandle = NULL; } } +/*************** UV Map Common Transforms *****************/ + +#define VIEW_ON_EQUATOR 0 +#define VIEW_ON_POLES 1 +#define ALIGN_TO_OBJECT 2 + +#define POLAR_ZX 0 +#define POLAR_ZY 1 + +static void uv_map_transform_center(Scene *scene, View3D *v3d, float *result, Object *ob, EditMesh *em) +{ + EditFace *efa; + float min[3], max[3], *cursx; + int around= (v3d)? v3d->around: V3D_CENTER; + + /* only operates on the edit object - this is all that's needed now */ + + switch(around) { + case V3D_CENTER: /* bounding box center */ + min[0]= min[1]= min[2]= 1e20f; + max[0]= max[1]= max[2]= -1e20f; + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + DO_MINMAX(efa->v1->co, min, max); + DO_MINMAX(efa->v2->co, min, max); + DO_MINMAX(efa->v3->co, min, max); + if(efa->v4) DO_MINMAX(efa->v4->co, min, max); + } + } + VecMidf(result, min, max); + break; + + case V3D_CURSOR: /*cursor center*/ + cursx= give_cursor(scene, v3d); + /* shift to objects world */ + result[0]= cursx[0]-ob->obmat[3][0]; + result[1]= cursx[1]-ob->obmat[3][1]; + result[2]= cursx[2]-ob->obmat[3][2]; + break; + + case V3D_LOCAL: /*object center*/ + case V3D_CENTROID: /* multiple objects centers, only one object here*/ + default: + result[0]= result[1]= result[2]= 0.0; + break; + } +} + +static void uv_map_rotation_matrix(float result[][4], RegionView3D *rv3d, Object *ob, float upangledeg, float sideangledeg, float radius) +{ + float rotup[4][4], rotside[4][4], viewmatrix[4][4], rotobj[4][4]; + float sideangle= 0.0f, upangle= 0.0f; + int k; + + /* get rotation of the current view matrix */ + if(rv3d) + Mat4CpyMat4(viewmatrix, rv3d->viewmat); + else + Mat4One(viewmatrix); + + /* but shifting */ + for(k=0; k<4; k++) + viewmatrix[3][k] =0.0f; + + /* get rotation of the current object matrix */ + Mat4CpyMat4(rotobj,ob->obmat); + + /* but shifting */ + for(k=0; k<4; k++) + rotobj[3][k] =0.0f; + + Mat4Clr(*rotup); + Mat4Clr(*rotside); + + /* compensate front/side.. against opengl x,y,z world definition */ + /* this is "kanonen gegen spatzen", a few plus minus 1 will do here */ + /* i wanted to keep the reason here, so we're rotating*/ + sideangle= (float)M_PI*(sideangledeg + 180.0f)/180.0f; + rotside[0][0]= (float)cos(sideangle); + rotside[0][1]= -(float)sin(sideangle); + rotside[1][0]= (float)sin(sideangle); + rotside[1][1]= (float)cos(sideangle); + rotside[2][2]= 1.0f; + + upangle= (float)M_PI*upangledeg/180.0f; + rotup[1][1]= (float)cos(upangle)/radius; + rotup[1][2]= -(float)sin(upangle)/radius; + rotup[2][1]= (float)sin(upangle)/radius; + rotup[2][2]= (float)cos(upangle)/radius; + rotup[0][0]= (float)1.0f/radius; + + /* calculate transforms*/ + Mat4MulSerie(result, rotup, rotside, viewmatrix, rotobj, NULL, NULL, NULL, NULL); +} + +static void uv_map_transform(bContext *C, wmOperator *op, float center[3], float rotmat[4][4]) +{ + /* context checks are messy here, making it work in both 3d view and uv editor */ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + SpaceLink *sl= CTX_wm_space_data(C); + View3D *v3d= (sl->spacetype == SPACE_VIEW3D)? (View3D*)sl: NULL; + ARegion *ar= CTX_wm_region(C); + RegionView3D *rv3d= (v3d && ar->regiontype == RGN_TYPE_WINDOW)? ar->regiondata: NULL; + /* common operator properties */ + int align= RNA_enum_get(op->ptr, "align"); + int direction= RNA_enum_get(op->ptr, "direction"); + float radius= RNA_struct_find_property(op->ptr, "radius")? RNA_float_get(op->ptr, "radius"): 1.0f; + float upangledeg, sideangledeg; + + uv_map_transform_center(scene, v3d, center, obedit, em); + + if(direction == VIEW_ON_EQUATOR) { + upangledeg= 90.0f; + sideangledeg= 0.0f; + } + else { + upangledeg= 0.0f; + if(align == POLAR_ZY) sideangledeg= 0.0f; + else sideangledeg= 90.0f; + } + + /* be compatible to the "old" sphere/cylinder mode */ + if(direction == ALIGN_TO_OBJECT) + Mat4One(rotmat); + else + uv_map_rotation_matrix(rotmat, rv3d, obedit, upangledeg, sideangledeg, radius); +} + +static void uv_transform_properties(wmOperatorType *ot, int radius) +{ + static EnumPropertyItem direction_items[]= { + {VIEW_ON_EQUATOR, "VIEW_ON_EQUATOR", "View on Equator", "3D view is on the equator."}, + {VIEW_ON_POLES, "VIEW_ON_POLES", "View on Poles", "3D view is on the poles."}, + {ALIGN_TO_OBJECT, "ALIGN_TO_OBJECT", "Align to Object", "Align according to object transform."}, + {0, NULL, NULL, NULL} + }; + static EnumPropertyItem align_items[]= { + {POLAR_ZX, "POLAR_ZX", "Polar ZX", "Polar 0 is X."}, + {POLAR_ZY, "POLAR_ZY", "Polar ZY", "Polar 0 is Y."}, + {0, NULL, NULL, NULL} + }; + + RNA_def_enum(ot->srna, "direction", direction_items, VIEW_ON_EQUATOR, "Direction", "Direction of the sphere or cylinder."); + RNA_def_enum(ot->srna, "align", align_items, VIEW_ON_EQUATOR, "Align", "How to determine rotation around the pole."); + if(radius) + RNA_def_float(ot->srna, "radius", 1.0f, 0.0f, FLT_MAX, "Radius", "Radius of the sphere or cylinder.", 0.0001f, 100.0f); +} + +static void correct_uv_aspect(EditMesh *em) +{ + EditFace *efa= EM_get_actFace(em, 1); + MTFace *tf; + float scale, aspx= 1.0f, aspy=1.0f; + + if(efa) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + ED_image_uv_aspect(tf->tpage, &aspx, &aspy); + } + + if(aspx == aspy) + return; + + if(aspx > aspy) { + scale= aspy/aspx; + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + tf->uv[0][0]= ((tf->uv[0][0]-0.5)*scale)+0.5; + tf->uv[1][0]= ((tf->uv[1][0]-0.5)*scale)+0.5; + tf->uv[2][0]= ((tf->uv[2][0]-0.5)*scale)+0.5; + if(efa->v4) + tf->uv[3][0]= ((tf->uv[3][0]-0.5)*scale)+0.5; + } + } + } + else { + scale= aspx/aspy; + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + tf->uv[0][1]= ((tf->uv[0][1]-0.5)*scale)+0.5; + tf->uv[1][1]= ((tf->uv[1][1]-0.5)*scale)+0.5; + tf->uv[2][1]= ((tf->uv[2][1]-0.5)*scale)+0.5; + if(efa->v4) + tf->uv[3][1]= ((tf->uv[3][1]-0.5)*scale)+0.5; + } + } + } +} + +/******************** Map Clip & Correct ******************/ + +static void uv_map_clip_correct_properties(wmOperatorType *ot) +{ + RNA_def_boolean(ot->srna, "correct_aspect", 1, "Correct Aspect", "Map UV's taking image aspect ratio into account."); + RNA_def_boolean(ot->srna, "clip_to_bounds", 0, "Clip to Bounds", "Clip UV coordinates to bounds after unwrapping."); + RNA_def_boolean(ot->srna, "scale_to_bounds", 0, "Scale to Bounds", "Scale UV coordinates to bounds after unwrapping."); +} + +static void uv_map_clip_correct(EditMesh *em, wmOperator *op) +{ + EditFace *efa; + MTFace *tf; + float dx, dy, min[2], max[2]; + int b, nverts; + int correct_aspect= RNA_boolean_get(op->ptr, "correct_aspect"); + int clip_to_bounds= RNA_boolean_get(op->ptr, "clip_to_bounds"); + int scale_to_bounds= RNA_boolean_get(op->ptr, "scale_to_bounds"); + + /* correct for image aspect ratio */ + if(correct_aspect) + correct_uv_aspect(em); + + if(scale_to_bounds) { + INIT_MINMAX2(min, max); + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + DO_MINMAX2(tf->uv[0], min, max); + DO_MINMAX2(tf->uv[1], min, max); + DO_MINMAX2(tf->uv[2], min, max); + + if(efa->v4) + DO_MINMAX2(tf->uv[3], min, max); + } + } + + /* rescale UV to be in 1/1 */ + dx= (max[0]-min[0]); + dy= (max[1]-min[1]); + + if(dx > 0.0f) + dx= 1.0f/dx; + if(dy > 0.0f) + dy= 1.0f/dy; + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + nverts= (efa->v4)? 4: 3; + + for(b=0; buv[b][0]= (tf->uv[b][0]-min[0])*dx; + tf->uv[b][1]= (tf->uv[b][1]-min[1])*dy; + } + } + } + } + else if(clip_to_bounds) { + /* clipping and wrapping */ + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + nverts= (efa->v4)? 4: 3; + + for(b=0; buv[b][0], 0.0, 1.0); + CLAMP(tf->uv[b][1], 0.0, 1.0); + } + } + } + } +} + +/* ******************** Unwrap operator **************** */ + +static int unwrap_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + ParamHandle *handle; + int method = RNA_enum_get(op->ptr, "method"); + int fill_holes = RNA_boolean_get(op->ptr, "fill_holes"); + int correct_aspect = RNA_boolean_get(op->ptr, "correct_aspect"); + + /* add uvs if they don't exist yet */ + if(!ED_uvedit_ensure_uvs(C, scene, obedit)) + return OPERATOR_CANCELLED; + + handle= construct_param_handle(scene, em, 0, fill_holes, 0, correct_aspect); + + param_lscm_begin(handle, PARAM_FALSE, method == 0); + param_lscm_solve(handle); + param_lscm_end(handle); + + param_pack(handle); + + param_flush(handle); + + param_delete(handle); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + return OPERATOR_FINISHED; +} + +void UV_OT_unwrap(wmOperatorType *ot) +{ + static EnumPropertyItem method_items[] = { + {0, "ANGLE_BASED", "Angle Based", ""}, + {1, "CONFORMAL", "Conformal", ""}, + {0, NULL, NULL, NULL}}; + + /* identifiers */ + ot->name= "Unwrap"; + ot->idname= "UV_OT_unwrap"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= unwrap_exec; + ot->poll= ED_operator_uvmap; + + /* properties */ + RNA_def_enum(ot->srna, "method", method_items, 0, "Method", "Unwrapping method. Angle Based usually gives better results than Conformal, while being somewhat slower."); + RNA_def_boolean(ot->srna, "fill_holes", 1, "Fill Holes", "Virtual fill holes in mesh before unwrapping, to better avoid overlaps and preserve symmetry."); + RNA_def_boolean(ot->srna, "correct_aspect", 1, "Correct Aspect", "Map UV's taking image aspect ratio into account."); +} + +/**************** Project From View operator **************/ + +static void uv_from_view_bounds(float target[2], float source[3], float rotmat[4][4]) +{ + float pv[3]; + + Mat4MulVecfl(rotmat, pv); + + /* ortho projection */ + target[0] = -pv[0]; + target[1] = pv[2]; +} + +static void uv_from_view(ARegion *ar, float target[2], float source[3], float rotmat[4][4]) +{ + RegionView3D *rv3d= ar->regiondata; + float pv[3], pv4[4], dx, dy, x= 0.0, y= 0.0; + + Mat4MulVecfl(rotmat, pv); + + dx= ar->winx; + dy= ar->winy; + + VecCopyf(pv4, source); + pv4[3]= 1.0; + + /* rotmat is the object matrix in this case */ + Mat4MulVec4fl(rotmat, pv4); + + /* almost project_short */ + Mat4MulVec4fl(rv3d->persmat, pv4); + if(fabs(pv4[3]) > 0.00001) { /* avoid division by zero */ + target[0] = dx/2.0 + (dx/2.0)*pv4[0]/pv4[3]; + target[1] = dy/2.0 + (dy/2.0)*pv4[1]/pv4[3]; + } + else { + /* scaling is lost but give a valid result */ + target[0] = dx/2.0 + (dx/2.0)*pv4[0]; + target[1] = dy/2.0 + (dy/2.0)*pv4[1]; + } + + /* v3d->persmat seems to do this funky scaling */ + if(dx > dy) { + y= (dx-dy)/2.0; + dy = dx; + } + else { + x= (dy-dx)/2.0; + dx = dy; + } + + target[0]= (x + target[0])/dx; + target[1]= (y + target[1])/dy; +} + +static int from_view_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + ARegion *ar= CTX_wm_region(C); + EditFace *efa; + MTFace *tf; + float rotmat[4][4]; + + /* add uvs if they don't exist yet */ + if(!ED_uvedit_ensure_uvs(C, scene, obedit)) + return OPERATOR_CANCELLED; + + if(RNA_boolean_get(op->ptr, "orthographic")) { + uv_map_rotation_matrix(rotmat, ar->regiondata, obedit, 90.0f, 0.0f, 1.0f); + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + uv_from_view_bounds(tf->uv[0], efa->v1->co, rotmat); + uv_from_view_bounds(tf->uv[1], efa->v2->co, rotmat); + uv_from_view_bounds(tf->uv[2], efa->v3->co, rotmat); + if(efa->v4) + uv_from_view_bounds(tf->uv[3], efa->v4->co, rotmat); + } + } + } + else { + Mat4CpyMat4(rotmat, obedit->obmat); + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + uv_from_view(ar, tf->uv[0], efa->v1->co, rotmat); + uv_from_view(ar, tf->uv[1], efa->v2->co, rotmat); + uv_from_view(ar, tf->uv[2], efa->v3->co, rotmat); + if(efa->v4) + uv_from_view(ar, tf->uv[3], efa->v4->co, rotmat); + } + } + } + + uv_map_clip_correct(em, op); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + return OPERATOR_FINISHED; +} + +static int from_view_poll(bContext *C) +{ + SpaceLink *sl= CTX_wm_space_data(C); + ARegion *ar= CTX_wm_region(C); + + if(!ED_operator_uvmap(C)) + return 0; + + return (sl->spacetype == SPACE_VIEW3D && ar->regiontype == RGN_TYPE_WINDOW); +} + +void UV_OT_from_view(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Project From View"; + ot->idname= "UV_OT_project_from_view"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= from_view_exec; + ot->poll= from_view_poll; + + /* properties */ + RNA_def_boolean(ot->srna, "orthographic", 0, "Orthographic", "Use orthographic projection."); + uv_map_clip_correct_properties(ot); +} + +/********************** Reset operator ********************/ + +static int reset_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + EditFace *efa; + MTFace *tf; + + /* add uvs if they don't exist yet */ + if(!ED_uvedit_ensure_uvs(C, scene, obedit)) + return OPERATOR_CANCELLED; + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + tf->uv[0][0]= 0.0f; + tf->uv[0][1]= 0.0f; + + tf->uv[1][0]= 1.0f; + tf->uv[1][1]= 0.0f; + + tf->uv[2][0]= 1.0f; + tf->uv[2][1]= 1.0f; + + tf->uv[3][0]= 0.0f; + tf->uv[3][1]= 1.0f; + } + } + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + return OPERATOR_FINISHED; +} + +void UV_OT_reset(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Reset"; + ot->idname= "UV_OT_reset"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= reset_exec; + ot->poll= ED_operator_uvmap; +} + +/****************** Sphere Project operator ***************/ + +static void uv_sphere_project(float target[2], float source[3], float center[3], float rotmat[4][4]) +{ + float pv[3]; + + VecSubf(pv, source, center); + Mat4MulVecfl(rotmat, pv); + + spheremap(pv[0], pv[1], pv[2], &target[0], &target[1]); + + /* split line is always zero */ + if(target[0] >= 1.0f) + target[0] -= 1.0f; +} + +static void uv_map_mirror(EditFace *efa, MTFace *tf) +{ + float dx; + int nverts, i, mi; + + nverts= (efa->v4)? 4: 3; + + mi = 0; + for(i=1; iuv[i][0] > tf->uv[mi][0]) + mi = i; + + for(i=0; iuv[mi][0] - tf->uv[i][0]; + if(dx > 0.5) tf->uv[i][0] += 1.0; + } + } +} + +static int sphere_project_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + EditFace *efa; + MTFace *tf; + float center[3], rotmat[4][4]; + + /* add uvs if they don't exist yet */ + if(!ED_uvedit_ensure_uvs(C, scene, obedit)) + return OPERATOR_CANCELLED; + + uv_map_transform(C, op, center, rotmat); + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + uv_sphere_project(tf->uv[0], efa->v1->co, center, rotmat); + uv_sphere_project(tf->uv[1], efa->v2->co, center, rotmat); + uv_sphere_project(tf->uv[2], efa->v3->co, center, rotmat); + if(efa->v4) + uv_sphere_project(tf->uv[3], efa->v4->co, center, rotmat); + + uv_map_mirror(efa, tf); + } + } + + uv_map_clip_correct(em, op); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + return OPERATOR_FINISHED; +} + +void UV_OT_sphere_project(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Sphere Projection"; + ot->idname= "UV_OT_sphere_project"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= sphere_project_exec; + ot->poll= ED_operator_uvmap; + + /* properties */ + uv_transform_properties(ot, 0); + uv_map_clip_correct_properties(ot); +} + +/***************** Cylinder Project operator **************/ + +static void uv_cylinder_project(float target[2], float source[3], float center[3], float rotmat[4][4]) +{ + float pv[3]; + + VecSubf(pv, source, center); + Mat4MulVecfl(rotmat, pv); + + tubemap(pv[0], pv[1], pv[2], &target[0], &target[1]); + + /* split line is always zero */ + if(target[0] >= 1.0f) + target[0] -= 1.0f; +} + +static int cylinder_project_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + EditFace *efa; + MTFace *tf; + float center[3], rotmat[4][4]; + + /* add uvs if they don't exist yet */ + if(!ED_uvedit_ensure_uvs(C, scene, obedit)) + return OPERATOR_CANCELLED; + + uv_map_transform(C, op, center, rotmat); + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + + uv_cylinder_project(tf->uv[0], efa->v1->co, center, rotmat); + uv_cylinder_project(tf->uv[1], efa->v2->co, center, rotmat); + uv_cylinder_project(tf->uv[2], efa->v3->co, center, rotmat); + if(efa->v4) + uv_cylinder_project(tf->uv[3], efa->v4->co, center, rotmat); + + uv_map_mirror(efa, tf); + } + } + + uv_map_clip_correct(em, op); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + return OPERATOR_FINISHED; +} + +void UV_OT_cylinder_project(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Cylinder Projection"; + ot->idname= "UV_OT_cylinder_project"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= cylinder_project_exec; + ot->poll= ED_operator_uvmap; + + /* properties */ + uv_transform_properties(ot, 1); + uv_map_clip_correct_properties(ot); +} + +/******************* Cube Project operator ****************/ + +static int cube_project_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; + EditFace *efa; + MTFace *tf; + float no[3], cube_size, *loc, dx, dy; + int cox, coy; + + /* add uvs if they don't exist yet */ + if(!ED_uvedit_ensure_uvs(C, scene, obedit)) + return OPERATOR_CANCELLED; + + loc= obedit->obmat[3]; + cube_size= RNA_float_get(op->ptr, "cube_size"); + + /* choose x,y,z axis for projection depending on the largest normal + * component, but clusters all together around the center of map. */ + + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->f & SELECT) { + tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + CalcNormFloat(efa->v1->co, efa->v2->co, efa->v3->co, no); + + no[0]= fabs(no[0]); + no[1]= fabs(no[1]); + no[2]= fabs(no[2]); + + cox=0; coy= 1; + if(no[2]>=no[0] && no[2]>=no[1]); + else if(no[1]>=no[0] && no[1]>=no[2]) coy= 2; + else { cox= 1; coy= 2; } + + tf->uv[0][0]= 0.5+0.5*cube_size*(loc[cox] + efa->v1->co[cox]); + tf->uv[0][1]= 0.5+0.5*cube_size*(loc[coy] + efa->v1->co[coy]); + dx = floor(tf->uv[0][0]); + dy = floor(tf->uv[0][1]); + tf->uv[0][0] -= dx; + tf->uv[0][1] -= dy; + tf->uv[1][0]= 0.5+0.5*cube_size*(loc[cox] + efa->v2->co[cox]); + tf->uv[1][1]= 0.5+0.5*cube_size*(loc[coy] + efa->v2->co[coy]); + tf->uv[1][0] -= dx; + tf->uv[1][1] -= dy; + tf->uv[2][0]= 0.5+0.5*cube_size*(loc[cox] + efa->v3->co[cox]); + tf->uv[2][1]= 0.5+0.5*cube_size*(loc[coy] + efa->v3->co[coy]); + tf->uv[2][0] -= dx; + tf->uv[2][1] -= dy; + + if(efa->v4) { + tf->uv[3][0]= 0.5+0.5*cube_size*(loc[cox] + efa->v4->co[cox]); + tf->uv[3][1]= 0.5+0.5*cube_size*(loc[coy] + efa->v4->co[coy]); + tf->uv[3][0] -= dx; + tf->uv[3][1] -= dy; + } + } + } + + uv_map_clip_correct(em, op); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + return OPERATOR_FINISHED; +} + +void UV_OT_cube_project(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Cube Projection"; + ot->idname= "UV_OT_cube_project"; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->exec= cube_project_exec; + ot->poll= ED_operator_uvmap; + + /* properties */ + RNA_def_float(ot->srna, "cube_size", 1.0f, 0.0f, FLT_MAX, "Cube Size", "Size of the cube to project on.", 0.001f, 100.0f); + uv_map_clip_correct_properties(ot); +} + +/******************* Mapping Menu operator ****************/ + +static int mapping_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + uiMenuItem *head; + + head= uiPupMenuBegin("UV Mapping", 0); + uiMenuItemO(head, 0, "UV_OT_unwrap"); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "UV_OT_cube_project"); + uiMenuItemO(head, 0, "UV_OT_cylinder_project"); + uiMenuItemO(head, 0, "UV_OT_sphere_project"); + uiMenuItemO(head, 0, "UV_OT_project_from_view"); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "UV_OT_reset"); + uiPupMenuEnd(C, head); + + /* XXX python */ +#ifndef DISABLE_PYTHON +#if 0 + /* note that we account for the 10 previous entries with i+10: */ + for(pym = BPyMenuTable[PYMENU_UVCALCULATION]; pym; pym = pym->next, i++) { + + if(!has_pymenu) { + strcat(uvmenu, "|%l"); + has_pymenu = 1; + } + + strcat(uvmenu, "|"); + strcat(uvmenu, pym->name); + strcat(uvmenu, " %x"); + sprintf(menu_number, "%d", i+10); + strcat(uvmenu, menu_number); + } +#endif +#endif + +#ifndef DISABLE_PYTHON +#if 0 + mode= pupmenu(uvmenu); + if(mode >= 10) { + BPY_menu_do_python(PYMENU_UVCALCULATION, mode - 10); + return; + } +#endif +#endif + + return OPERATOR_CANCELLED; +} + +void UV_OT_mapping_menu(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Mapping Menu"; + ot->idname= "UV_OT_mapping_menu"; + + /* api callbacks */ + ot->invoke= mapping_menu_invoke; + ot->poll= ED_operator_uvmap; +} + From 2249c61d034bf35d26f3508e0397136c66f52da0 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 22:59:26 +0000 Subject: [PATCH 18/63] 2.5 Bugfixes: Adjusted ranges for subdivide operators (Mesh + Armature). * The Mesh one was causing lockups as its range started from 0. Now it starts from 1. * Tweaked the soft-limits for subdivide operators to be easier to use (1-10 instead of 0-100) --- source/blender/editors/armature/editarmature.c | 4 ++-- source/blender/editors/mesh/editmesh_tools.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index b82c0d2a6c8..48078a77e85 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3323,7 +3323,7 @@ void ARMATURE_OT_subdivide_multi(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* Properties */ - RNA_def_int(ot->srna, "number_cuts", 2, 1, 100, "Number of Cuts", "", 1, INT_MAX); + RNA_def_int(ot->srna, "number_cuts", 2, 1, 10, "Number of Cuts", "", 1, INT_MAX); } @@ -3379,7 +3379,7 @@ void ARMATURE_OT_subdivs(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", type_items, 0, "Type", ""); /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/ - RNA_def_int(ot->srna, "number_cuts", 2, 1, 100, "Number of Cuts", "", 1, INT_MAX); + RNA_def_int(ot->srna, "number_cuts", 2, 1, 10, "Number of Cuts", "", 1, INT_MAX); } /* ----------- */ diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 419971eff10..7830d4d0ae8 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -6611,7 +6611,7 @@ void MESH_OT_subdivide_multi(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* props */ - RNA_def_int(ot->srna, "number_cuts", 4, 0, 100, "Number of Cuts", "", 0, INT_MAX); + RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX); } static int subdivide_multi_fractal_exec(bContext *C, wmOperator *op) @@ -6641,7 +6641,7 @@ void MESH_OT_subdivide_multi_fractal(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_int(ot->srna, "number_cuts", 4, 0, 100, "Number of Cuts", "", 0, INT_MAX); + RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX); RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f); } @@ -6733,7 +6733,7 @@ void MESH_OT_subdivs(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", type_items, 0, "Type", ""); /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/ - RNA_def_int(ot->srna, "number_cuts", 4, 0, 100, "Number of Cuts", "", 0, INT_MAX); + RNA_def_int(ot->srna, "number_cuts", 4, 1, 10, "Number of Cuts", "", 1, INT_MAX); RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f); RNA_def_float(ot->srna, "smoothness", 5.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); From 97c5d50cffd5fcd3d96808392e29444a257d8a99 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 23:06:29 +0000 Subject: [PATCH 19/63] 2.5: Added missing colour/theme entries from Graph Editor in RNA --- source/blender/makesrna/intern/rna_userdef.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 112ac8af042..c53976b5002 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -431,6 +431,26 @@ static void rna_def_userdef_theme_space_ipo(BlenderRNA *brna) prop= RNA_def_property(srna, "handle_vertex_size", PROP_INT, PROP_NONE); RNA_def_property_range(prop, 0, 255); RNA_def_property_ui_text(prop, "Handle Vertex Size", ""); + + prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "group"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Channel Group", ""); + + prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "group_active"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Active Channel Group", ""); + + prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "ds_channel"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "DopeSheet Channel", ""); + + prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "ds_subchannel"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "DopeSheet Sub-Channel", ""); } static void rna_def_userdef_theme_space_file(BlenderRNA *brna) From 181068454f7f6f18eba72b52339a65058945ff25 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 Feb 2009 23:46:13 +0000 Subject: [PATCH 20/63] Graph Editor - Drawing Tweaks * Handles now draw with anti-aliased lines for a 'tidier' appearance at certain scales * Added new drawing code for 'samples' --- .../blender/editors/space_graph/graph_draw.c | 88 ++++++++++++++++++- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 8de273c9428..1924fc0b508 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -154,9 +154,16 @@ static void draw_fcurve_handle_control (float x, float y, float xscale, float ys glTranslatef(x, y, 0.0f); glScalef(1.0f/xscale*hsize, 1.0f/yscale*hsize, 1.0f); + /* anti-aliased lines for more consistent appearance */ + glEnable(GL_LINE_SMOOTH); + glEnable(GL_BLEND); + /* draw! */ glCallList(displist); + glDisable(GL_LINE_SMOOTH); + glDisable(GL_BLEND); + /* restore view transform */ glScalef(xscale/hsize, yscale/hsize, 1.0); glTranslatef(-x, -y, 0.0f); @@ -323,6 +330,74 @@ static void draw_fcurve_handles (SpaceIpo *sipo, ARegion *ar, FCurve *fcu) } } +/* Samples ---------------- */ + +/* helper func - draw sample-range marker for an F-Curve as a cross */ +static void draw_fcurve_sample_control (float x, float y, float xscale, float yscale, float hsize) +{ + static GLuint displist=0; + + /* initialise X shape */ + if (displist == 0) { + displist= glGenLists(1); + glNewList(displist, GL_COMPILE); + + glBegin(GL_LINES); + glVertex2f(-0.7f, -0.7f); + glVertex2f(+0.7f, +0.7f); + + glVertex2f(-0.7f, +0.7f); + glVertex2f(+0.7f, -0.7f); + glEnd(); // GL_LINES + + glEndList(); + } + + /* adjust view transform before starting */ + glTranslatef(x, y, 0.0f); + glScalef(1.0f/xscale*hsize, 1.0f/yscale*hsize, 1.0f); + + /* anti-aliased lines for more consistent appearance */ + // XXX needed here? + glEnable(GL_LINE_SMOOTH); + glEnable(GL_BLEND); + + /* draw! */ + glCallList(displist); + + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + + /* restore view transform */ + glScalef(xscale/hsize, yscale/hsize, 1.0); + glTranslatef(-x, -y, 0.0f); +} + +/* helper func - draw keyframe vertices only for an F-Curve */ +static void draw_fcurve_samples (SpaceIpo *sipo, ARegion *ar, FCurve *fcu) +{ + FPoint *first, *last; + float hsize, xscale, yscale; + + /* get view settings */ + hsize= UI_GetThemeValuef(TH_VERTEX_SIZE); + UI_view2d_getscale(&ar->v2d, &xscale, &yscale); + + /* set vertex color */ + if (fcu->flag & (FCURVE_ACTIVE|FCURVE_SELECTED)) UI_ThemeColor(TH_TEXT_HI); + else UI_ThemeColor(TH_TEXT); + + /* get verts */ + first= fcu->fpt; + last= (first) ? (first + fcu->totvert) : (NULL); + + /* draw */ + if (first && last) { + draw_fcurve_sample_control(first->vec[0], first->vec[1], xscale, yscale, hsize); + draw_fcurve_sample_control(last->vec[0], last->vec[1], xscale, yscale, hsize); + } +} + /* Curve ---------------- */ /* helper func - draw one repeat of an F-Curve */ @@ -627,7 +702,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) Object *nob= ANIM_nla_mapping_get(ac, ale); float fac=0.0f; // dummy var - /* map ipo-points for drawing if scaled F-Curve */ + /* map keyframes for drawing if scaled F-Curve */ if (nob) ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 0); @@ -639,8 +714,15 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) draw_fcurve_repeat(fcu, &ar->v2d, 0, 0, &fac); // XXX this call still needs a lot more work /* draw handles and vertices as appropriate */ - draw_fcurve_handles(sipo, ar, fcu); - draw_fcurve_vertices(sipo, ar, fcu); + if (fcu->bezt) { + /* only draw handles/vertices on keyframes */ + draw_fcurve_handles(sipo, ar, fcu); + draw_fcurve_vertices(sipo, ar, fcu); + } + else { + /* samples: should we only draw two indicators at either end as indicators? */ + draw_fcurve_samples(sipo, ar, fcu); + } } /* undo mapping of keyframes for drawing if scaled F-Curve */ From d262cde5f86a912c52212cbc849e9555112ed728 Mon Sep 17 00:00:00 2001 From: Matt Ebb Date: Tue, 10 Feb 2009 02:39:19 +0000 Subject: [PATCH 21/63] * Some more icon file updates (thanks jendrzych), and associated UI tweaks. --- release/datafiles/blenderbuttons | Bin 125039 -> 123826 bytes .../editors/datafiles/blenderbuttons.c | 7780 ++++++++--------- source/blender/editors/include/UI_resources.h | 66 +- .../editors/interface/interface_icons.c | 2 +- .../editors/interface/interface_utils.c | 4 +- .../editors/space_image/image_header.c | 2 +- .../blender/editors/space_outliner/outliner.c | 12 +- .../editors/space_view3d/view3d_header.c | 2 +- source/blender/makesrna/intern/rna_userdef.c | 8 +- 9 files changed, 3934 insertions(+), 3942 deletions(-) diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons index e7410ade694887b0d6a564410c44fccd597fe385..4d70dd9b09595a1ac0c4c9b56771fcba962e6b8f 100644 GIT binary patch literal 123826 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 %l4yr)LIu)K@&{(jHX>r;1o8jOf4+fZ){s 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 NQcGVmPs1+ge*jryI8guq literal 125039 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≫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 diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c index dfe870ea3c7..d60237e98ea 100644 --- a/source/blender/editors/datafiles/blenderbuttons.c +++ b/source/blender/editors/datafiles/blenderbuttons.c @@ -1,3914 +1,3876 @@ /* DataToC output of file */ -int datatoc_blenderbuttons_size= 125039; +int datatoc_blenderbuttons_size= 123826; char datatoc_blenderbuttons[]= { -137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, - 82, 0, 0, 2, 88, 0, 0, 2, 0, 8, 6, 0, 0, 0, 94,187, 18, 70, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, - 13,215, 1, 66, 40,155,120, 0, 0, 1, 57,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111, -102,105,108,101, 0, 0,120,218,173,145,177, 74,195, 80, 20,134,191, 27, 69,197,161, 86, 8,226,224,112, 39, 81, 80,108,213,193, -140, 73, 91,138, 32, 88,171, 67,146,173, 73, 67,149,210, 36,220,220,170,125, 8, 71,183, 14, 46,238, 62,129,147,163,224,160,248, - 4,190,129,226,212,193, 33, 72,112, 18,193,111,250,206,207,225,112,224, 7,163, 98,215,157,134, 81,134, 65,172, 85,187,233, 72, -215,243,229,236, 19, 51, 76, 1, 64, 39,204, 82,187,213, 58, 0,136,147, 56,226, 39, 2, 62, 95, 17, 0,207,155,118,221,105,240, - 55,230,195, 84,105, 96, 2,108,119,163, 44, 4, 81, 1,250, 23, 58,213, 32,198,128, 25,244, 83, 13,226, 14, 48,213, 73,187, 6, -226, 1, 40,245,114,127, 1, 74, 65,238,111, 64, 73,185,158, 15,226, 3, 48,123,174,231,131, 49, 7,152, 65,238, 43,128,169,163, - 75, 13, 80, 75,210,145, 58,235,157,106, 89,181, 44, 75,218,221, 36,136,228,241, 40,211,209, 32,147,251,113,152,168, 52, 81, 29, - 29,117,129,252, 63, 0, 22,243,197,118,211,145,107, 85,203,218, 91,231,159,113, 61, 95,230,246,126,132, 0,196,210, 99,145, 21, -132, 67,117,254,221,133,177,243,251, 92,220, 24, 47,195,225, 45, 76, 79,138,108,247, 10,110, 54, 96,225,186,200, 86,171, 80,222, -130,251,241, 23,194,179, 79,254, 28, 9,179, 39, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131, 0, 0,249,255, - 0, 0,128,232, 0, 0, 82, 8, 0, 1, 21, 88, 0, 0, 58,151, 0, 0, 23,111,215, 90, 31,144, 0, 1,230,176, 73, 68, 65, 84, -120,218,236,157,119,120, 20,197,255,199,223, 91,174, 95, 46,119,105,132, 64, 40,161,132, 46, 82,148, 34, 68, 58,130, 20,169, 82, - 84, 16, 21,144, 42, 85, 20,105, 34, 34, 32, 69, 20, 1, 5, 68, 58,248,149,222, 3, 33,116, 33,145, 94, 2, 82, 2, 9, 9, 9, -228,210,175,108,251,253, 65,238,126, 73, 72,217, 75,129, 0,243,122,158,123, 82,118,239,189,179,179,187, 51,239,249,204,236, 12, - 37, 73, 18, 8, 4, 2,129, 64, 32, 16, 8, 69, 7, 77,178,128, 64, 32, 16, 8, 4, 2,129, 24, 44, 2,129, 64, 32, 16, 8, 4, - 98,176, 8, 4, 2,129, 64, 32, 16,136,193, 34, 16, 8, 4, 2,129, 64, 32, 16,131, 69, 32, 16, 8, 4, 2,129, 64, 12, 22,129, - 64, 32, 16, 8, 4, 2, 49, 88, 4, 2,129, 64, 32, 16, 8, 4, 57,176,153,255,184,145,120, 20, 0,208,189,217,176, 19,141, 27, - 55,174,254,239,191,255,218, 69, 81, 4, 77,211,160, 40,202,249, 17, 69, 49,250,236,217,179,245, 73,246, 17, 8,132,236, 56,202, - 17, 7,129,166, 32, 58, 83, 99, 78, 4, 32, 69,152, 67,115,157,128,175,170,177, 57,201, 68, 2,129,240,114, 25, 44, 7, 12,195, -248, 47, 93,186,212,180,127,255,126,104,181, 90,232,245,122,184,185,185, 65,175,215, 67,175,215,227,221,119,223, 21, 92, 61, 80, -227,198,141, 35, 57,142, 43,231,202,119,148, 74,101,188, 74,165,242, 11, 9, 9,225,115,218,238,231,231, 23, 73, 81,148, 75,154, - 20, 69,197, 71, 71, 71,251, 73,146,244,204, 52, 9, 47, 6, 26,141,230,177,213,106,245,200,227, 58, 75, 74,165,146, 87,169, 84, -105, 42,149,202,202,178, 44, 43, 8, 66, 92, 92, 92, 92,125, 73,146,172, 57,236,175, 2, 16, 3,192,148,199, 97, 69, 0,233, 0, - 30, 1, 72,202, 48, 34,209, 0,222,149, 36, 73,120, 81,243,178,170,177, 57, 13, 0, 35, 70,140, 80,116,234,212,105, 53,128,222, -153,183,143,251,112, 94,150,253, 21, 10, 69,124,237,218,181,203, 78,155, 54,141,207,200, 19, 2,129, 64,120,185, 12, 86, 85, 99, -115, 8,130,112,127,232,208,161,250,240,240,240,220, 34, 88,177,174, 30, 72, 16, 4,191,144,144, 16,232,245,122, 57,134, 5,169, -169,169,104,213,170,149, 71, 70, 26,115, 51, 46,126, 35, 71,142,132,193, 96,128,197, 98,129,197, 98,129,213,106,133,213,106,133, -205,102,131,205,102,131,221,110,135,221,110, 7,199,113,176, 90,173, 8, 15, 15,247,168, 80,161, 66,158,154, 35, 70,140,128,155, -155,155, 83,207, 98,177, 56,181,172, 86,171, 83,211,102,179,193,106,181,226,252,249,243,249,105, 18, 94, 0, 56,142, 51,218,206, -159, 7,109, 50, 65,124,244, 8,246,202,149,193,139, 34, 4, 65, 0,179,116, 41,132,244,116,138,231, 56,133,229,179,207, 52, 60, - 32,196,197,197,241,131, 7, 15, 86,199,197,197,177,121, 60, 95,110,201,201,201,143,221,220,220, 20, 0, 30,197,196,196,208, 22, -139, 37, 57, 32, 32,224, 2,128, 71,135, 14, 29,242, 77, 78, 78, 54,191,247,222,123,135,108, 54,219, 3,181, 90,173, 1, 48, 54, -195,104, 9, 47,114,126,142, 24, 49, 66, 17, 25, 25,185,186, 92,185,114, 29,231,207,159,143,157, 59,119, 34, 32, 32, 0, 74,165, - 18, 12,195,128,166,105, 48, 12, 3,134, 97, 48,122,244,104,143, 7, 15, 30,144,103,136, 64, 32,188,156, 6,203, 17,154,255,223, -177, 95,154, 86, 53, 54, 71,173, 90,181, 78, 52,106,212,168,122, 88, 88,152, 93,146,164,204, 38,171, 76,131, 6, 13, 98, 51,119, - 25,134,133,133,229,219,101,168, 82,169, 16, 26, 26, 10,134, 97, 80,179, 85, 43, 80, 28,135,123,255,252, 3, 86,167, 67,233,122, -245, 64,217,237, 72,185,113, 3, 10,189, 30, 44,203,202, 58, 1, 55, 55, 55,180,107,215, 14, 42,149, 10, 13, 26, 52,128, 82,169, -132, 66,161,200,245, 35, 7,157, 78,135,233,211,167, 63,201, 32,150,133,155, 70,131,207,223,120, 3, 90, 73,194,239, 17, 17,176, -138, 34, 88,150, 5,203,178,178, 53, 9, 47, 4, 34,237,230, 70, 63,168, 82, 5,146,221,142,228,179,103, 1,149,234,201, 61,177, -116, 41, 36,131, 1,146,201, 36, 36,116,237,106,229, 36,137,119,115,115,139,210,235,245, 9,121,152, 2, 1,128,224,230,230,166, -160, 40,106, 60, 0, 65,146,164, 21, 20, 69, 49, 0,122, 1,176, 73,146,244, 55, 69, 81, 52,128,214, 0,212,146, 36,133, 80, 20, -245, 46,128, 23,122, 13,171,105,211,166,209,119,239,222,253,189,124,249,242,237,230,207,159,175, 87, 42,149, 88,178,100, 9, 20, - 10, 5, 58,118,236, 8, 47, 47, 47,236,223,191, 31, 74,165, 18,227,199,143, 39,119, 30,129,240,146, 81,140,207,181, 4,128, 42, - 41,231, 57,119,238, 92,249, 17,172,204,208, 52,237,191,108,217, 50,211,218,181,107,161, 86,171,161,213,106,161,211,233,160,211, -233,178,252,222,163, 71, 15, 89, 45,109, 65, 16,160, 80, 40, 64,211, 52, 64, 61,201, 31, 5,203,130, 97, 89,103,110, 57,140,139, - 92,131,101,179,217,208,171, 87, 47, 0,200,215, 92,201, 53, 67, 54,155, 13, 44,203,162,114, 57, 31, 76,233,218, 0,205,236, 60, -210, 98, 69,208,177,169,248, 88, 16, 16, 94,163, 6, 22,153,205,184,155,154, 42, 59,157,132, 23,196, 97, 37, 36,228,188,193,203, - 11,146, 94,207, 75,238,238,118,158,231, 45,118, 65,176, 2, 72, 86,171,213, 41, 50,204, 80,124, 38,195,229,128,203,102,204,248, -140,255, 1,128,249, 69,206,195, 64, 83, 16,213,163, 71, 15,154,101,217,190,115,230,204,161,149, 74,101, 70, 22,122, 65,161, 80, -160,118,237,218, 48, 24, 12, 56,118,236, 24, 4, 65,128, 99, 59,129, 64, 32,184,104,174, 74,148,217,202,211, 96,221, 72, 60,154, -101,128,169, 40,138,247,135, 12, 25,162, 63,123,246,172, 29,120,210,117,231,248,153,185,219, 80,146, 36, 89, 93,134,162, 40,162, -122,139, 22,206,200, 21,163,213,194,175,126,125,103,228,138,213,233,160,169, 88, 17,176,219,161,136,143,151,109,134, 98, 99, 99, - 65,211,116,145, 24, 44,138,162, 96,183,219,161, 81,171,112,104, 73,115,196,222,224,240,237,222, 88,108, 13,187, 3,150,101,209, -169, 82, 21,244,182, 73,152,199,177, 24,164,213,194, 78, 22,203,126,153,160,173, 85,171, 34, 57, 60, 28,146, 36,193,173,113, 99, - 72,110,110,144, 60, 61,145,246,231,159, 41, 22,158,231,237,118,187,213,107,243,102,187,100, 48,164,196, 50, 76, 89,187,205,166, - 66,238,111,227, 50, 0,152,152,152, 24, 74,146,164,229, 20, 69, 49, 20, 69,245,193,147,200,213, 95, 25,247, 91, 91, 0,188, 36, - 73,135, 41,138,162, 41,138,106, 0, 64,139, 23, 60,130,149,241,188, 75,123,246,236,193,146, 37, 75,224,229,229,133,118,237,218, -161,116,233,210,216,178,101, 11, 36, 73,194,240,225,195,161,213,106,161,213,106,201,157, 71, 32, 16, 10, 2, 85,146, 19,151,103, -248,229,242,229,203, 77,179,255,175, 70,141, 26, 39,154, 54,109, 90, 61, 44, 44,204,158,201,108,149,121,227,141, 55, 98, 37, 73, -202,243,237, 66, 81, 20,157,145, 43,150, 97,192, 42, 20, 79, 69,174,156,219,101, 68,134, 40,138, 2,199,113,206,168,216,129, 3, - 7,160,213,106,209,177, 99,199, 92, 13,150,195, 36,230,103,218, 52, 26, 21, 20,222, 12, 62, 28,117, 26,113, 9,105,206,244, 29, -124, 16,133,127, 52, 90, 76,245,169, 1,189, 53, 10,201,118, 27,185,197, 95, 34,120,254,255,131, 74,162,167, 39, 96, 48, 64, 52, - 26,121, 0,201,118,187,157,178,219,237, 54,193,104, 76,165, 77, 38,115, 58,199,233,105,134, 73,207,207, 12,165,167,167,167,100, - 62, 4,114,143, 92, 33,227,119,243,139,108,176, 34,204,161,210,250,133,135,197,115,231,206, 73, 1, 1, 1,206,103,207,215,215, - 23, 38,147, 9,162, 40, 66, 20, 69,104, 52, 26,104,181, 90, 40,149, 74, 89,207, 37,129, 64,120, 33, 35, 78, 57,153, 33, 41, 15, -147, 36,185, 96,162, 50, 71,176,114,250,158,220,227,184,146, 6, 73,174,193,123,202,197,100,127,197,250,169, 47,176,172,255,210, -165, 75, 77, 91,183,110,133,155,155, 27, 76, 38, 19,140, 70, 35,140, 70, 99,190, 93,133,146, 36, 61, 25,115,197,178,206,200, 85, -114, 68, 4, 20,122,189, 51,114,197,198,197, 65,225,230, 38,187,235,205,110,183, 59, 13,214,208,161, 67,157,227,162, 10,211, 69, -104,183,219, 65, 51, 44,160, 14,128,136,211, 89,186, 45, 89,150, 5,171, 84,226,118,213,215, 65, 95,123, 8, 86, 20,200, 35,244, -242, 32,242, 60,255,255,209, 40, 15, 15,136,110,110, 28,103, 48,136, 73,201,201,148,193,195,227, 62, 69, 81, 73, 15, 41,170,124, - 58,199,185,149,127,253,245,179,254,231,207, 71, 33,159, 49, 88, 21, 43, 86,188, 64, 81, 84,223,140,200,213,150,140, 72, 85,187, -140,191, 51, 71,174,236,146, 36, 93,160, 40,170,204,139,158,145, 53,107,214,148,206,157, 59, 7,133, 66,129,182,109,219,162, 78, -157, 58,216,182,109, 27, 68, 81,196,176, 97,195,160,213,106,177,112,225, 66,240, 60,143,217,179,103,147, 59,143, 64,120, 57,205, - 21, 37,227,255,217, 77, 82,110,102, 70, 78,119, 32, 37,243, 56, 40,162, 52,228,153, 38,151, 7, 16, 57,186, 13,195,195,195,237, -146, 36,129, 97, 24,103,151, 97,126,111, 23, 74,146, 4,133, 66,241,228, 59,121, 68,174, 88,150, 5,195, 48,178,210,195,113,156, -115,255, 71,143, 30, 21,201, 24, 44,187,221, 14,134,101,113,202, 77, 1, 73,193,100, 49, 87, 10,133, 2,180, 66,129,219,229,170, -131,190,121, 24,172, 64, 94,122,122, 89,160,105, 90, 84,174, 90, 5,253,146, 37, 16, 12, 6,164,173, 94,109,134, 66,145,156,152, -152,200,106,214,175, 87, 42,188,188,212,146,135,135,229, 81,141, 26,241, 22,171,213,230,239,227, 19,167,211,233,242,139, 54,217, -241,100, 12, 22,151, 45, 82,149, 83, 36,203,241,247, 11, 29,193, 2,128,158, 61,123, 74,107,215,174, 5,195, 48, 48, 26,141, 48, - 24, 12,144, 36, 41, 75,228,138,231,121,240, 60, 79, 94, 20, 33, 16, 94, 78, 50, 71,144,242,139, 16, 61, 47, 3, 88,172,223,203, -209, 96,117,111, 54,236, 68,147, 38, 77,170,103,158,166, 33,195, 64, 69, 95,190,124,185,192, 19,140, 74,146,228,124, 91, 48, 57, - 34, 2,172, 78, 7,109, 64,128, 51,114,197,234,245,176,154, 76,176,218,108,112, 79, 79,151,109,176, 28,166,205, 97,162, 86,175, - 94, 13, 55, 55, 55, 12, 28, 56,176, 64, 6,139,227, 56, 48, 10, 6,219,149, 17,128,130,125, 42,130, 69,179, 10,220,245, 44, 15, - 74,193,130, 21, 88,210,189,241,146,160, 84, 42, 5,129,227, 32, 26,141,146,232,238,206,165,165,167, 11,118, 81,100,141, 70, 99, -164,210,199, 71, 19, 45, 73,234, 52,187,221, 80,165,106,213,227, 44,203, 38, 30, 58,116,168,218,173, 91,183,124,145,251,148, 10, - 12, 0,251,161, 67,135, 74,101,138, 92,181,207,136, 92, 29, 2, 0,138,162, 26, 2,224, 36, 73, 58, 79, 61, 33, 0,128,234, 37, - 50,173, 56,114,228, 8,194,194,194, 48,116,232, 80,104,181, 90,252,244,211, 79,224,121, 30, 51,102,204,128, 86,171,133, 74,165, - 34, 55, 31,129,240,242,154,172,252,162, 71,207,203, 92, 81, 5, 52, 91,178,211,158,235, 68,163,191,254,250,171, 41, 52, 52, 20, - 58,157,206, 57,193,104,223,190,125,133,162,202,237,220, 34, 87,174,226,232, 34,204,108,176,166, 78,157, 10,150,101,241,219,111, -191, 1, 0,198,141, 27,231,114, 4, 11, 18,133,211,226, 49,248,253, 90, 11, 88,173, 69,204,145, 43, 80, 40, 20, 40,253,102, 91, -136, 13,123,226,177,218, 8, 93,198,116, 13,132,151, 3,181, 90,109,231,237,118,181, 96, 50,113,112,115,179,113, 28,103,177, 11, -130, 13, 64,146,232,225, 97, 73,183, 90,221,146,117,186,116, 73,146,146, 0, 36,165,166,166, 90, 0,228,245, 22,161, 4, 32, 45, - 41, 41, 41, 49,179,127, 71,214,200, 85, 78,111, 19, 38, 72,210,203,241,246,132,227, 69, 24, 65, 16,158,138, 92,105, 52, 26,168, -213,106,114,227, 17, 8, 47, 39,185,141, 85,162,144,251, 24, 39, 42,151,242,180,168,223, 22,164,242, 40,183, 93,221,230, 90, 23, -161, 40,138,206,137, 70, 51, 23,146, 5,153, 96, 52, 51, 60,207, 67,253,248, 49,104,154,134, 58,163, 91,145, 78, 73,113,190,145, - 72,211, 52, 76,214, 39, 19, 98,203,173, 95, 4, 65,200,210,125,167, 80, 40, 96, 54,155,161, 80, 40, 48,115,230, 76,208, 52,141, - 31,126,248, 1,101,203,150,197,131, 7, 15,176,119,239, 94, 89,233,132, 8, 40, 63,240,132,118,168, 59, 48,184, 50,106,117, 26, -140,164,228, 10,184, 96,211,163, 70,234,117,152, 14, 77,131, 93,228,137,193,122,185, 12,214,227,180, 1, 3,240,232,157,119,236, -118,187,221, 90,234,239,191,109, 48, 24,146,163, 40,170, 66,124,181,106,143,106,212,172,121,156,166,233,164,131, 7, 15,214, 72, - 77, 77,181,189,251,238,187,123,235,212,169,115,237,240,225,195,121,141,193,186,219,181,107,215,224,204,145,171,140, 72, 86, 67, - 60, 25,115,149, 57,114,197, 73,146,116,143,162,168,184,151, 37, 79,105,154,198,192,129, 3,225,231,231,135,197,139, 23, 67, 16, - 4, 76,159, 62, 29, 90,173, 22, 95,125,245, 21, 56,142,195,194,133, 11,201,205, 71, 32,188,124, 80, 69,176, 77,114,225, 24, 84, - 62,199,160,138, 40, 13,133,139, 96,253,117,244,231,166,185,173, 7, 86,187,118,109,103,247,161,195,124, 73,146, 36,107,162,209, - 21,191, 78,193,245,219,233,144,219, 54,151,211,245,230, 24,195,145,125,112, 59,203,178, 72, 76, 76,132, 66,161,192,226,197,139, -225,238,238, 14,171,213, 42,235,184,142,113, 93,105,247, 82,113,235,155,243, 80,235,110,162, 90, 91, 3,220, 20, 55, 81,245,216, -223,224,121, 59,224,226,124, 93,132,146,143, 74,165, 74,227,121, 94,101,183,219, 5,187,221,110,149,140,198, 20,152, 76,230, 52, -171,213, 96,177, 90, 45,146, 36, 37, 35, 35,114,149,146,146, 98,147, 36, 41,169, 98,197,138, 73,249,180,224,204,130, 32,196, 2, -112, 67,238, 99,174,178,252,157,211,178, 59, 47,106,244,138,166,105,120,123,123, 67,167,211, 65, 16, 4,103,228, 74,163,209,128, -227, 56,240, 60, 15,137, 76,117, 66, 32, 16, 10,110,214,138, 3,169, 40,142,237,178, 59,112,116, 31,158, 58,117, 10, 6,131, 1, - 70,163, 81, 86,215,161, 82,169,188, 59,238, 99,223,202,235, 15,249, 67, 16,229,165,247,246,237,219,201,222,222,222, 92, 94,251, -164,167,167,231,104,174, 50,255,157,146,146, 2,171,213, 42,187,139, 48, 45, 45, 13, 12,195, 56,117, 40, 81,196,173,224, 45, 79, -191, 77, 72,102,114,127,169, 96, 24, 70,123,239,222, 61,209,199,199,231, 14, 69, 81,201,209, 64, 64,170,205,230, 30,240,198, 27, - 39, 3,188,189, 31, 29, 56,112,160,122, 74, 74, 10,247,206, 59,239,236,213,106,181,230, 89,179,102, 5, 93,190,124,185,214,229, -203,151,231,231,178,110, 32, 13, 64,171, 86,171,117,146, 36, 5,103, 68,174,222,192,147,200,213,185, 12, 19, 82, 9,255, 31,185, -162, 40,138, 50,102,252,157,246,146,228, 41,140, 70, 35, 84, 42, 21,190,253,246, 91, 40,149, 74,231,188, 87, 11, 23, 46,116,190, -248, 66, 32, 16, 94, 46,242,154,225,188, 4, 27,171, 34, 61,110,129,222, 34, 28, 58,116,168,254,223,127,255,205, 28,193,202,183, -235,208,110,183, 55,123,251,253,131, 39, 44, 22, 75,128,156,227,104, 52,154,232,244,244,244,183, 55,111,222, 44,228,209, 66,126, - 16, 18, 18,226,210,194,204, 12,195, 36,220,189,123,151,207, 75,243,212,169, 83, 46,105,210, 52,157,167, 38,225,197, 32, 61, 61, -253,222,216,177, 99, 61, 13, 6, 67,140, 90,173, 78, 74, 77, 77, 85,208, 52,109,171,120,233,210, 45,131,193,240,248,234,213,171, - 38, 65, 16,236, 13, 26, 52,184, 88,190,124,249,148,115,231,206,213,120,248,240, 97, 94, 13, 0, 1, 64, 28,128, 1, 20, 69,213, -199,147,241, 90, 70, 0, 73, 20, 69,233,240,100,113,103, 55, 0, 9, 20, 69, 81,146, 36, 73, 20, 69,101,143,108,189,176,176, 44, -251, 96,228,200,145,178,158, 37,165, 82,153,224,231,231, 71,158, 33, 2,129,240,210, 64,145,240, 60,129, 64, 40, 74, 50, 86,132, -160, 11, 33, 33,146, 92, 36, 16, 8, 47, 58, 52,201, 2, 2,129, 64, 32, 16, 8,132,162,133, 68,176, 8, 4, 2,129, 64, 32, 16, -138, 24, 18,193, 34, 16, 8, 4, 2,129, 64, 32, 6,139, 64, 32, 16, 8, 4, 2,161,100, 67, 38,113, 34, 16, 50,200,190,208,121, - 78,115,193,229,183, 24,122,126,188,202,154,174, 30,143, 64, 32, 16, 94,100,114, 28,131, 85,156, 5,105,118,250,182, 30,227,190, - 62,120,126,210,171,122, 1,170, 26,155, 63,211,252, 38,149, 25, 33,243,115, 94,213,216, 28,160,168, 66, 69,178,111,152, 67,197, -167,238,175, 66,106, 66,146,200,155,132, 4, 2,225,133, 38,199, 8,214,132, 1,243, 99, 69, 81, 44, 37, 91,132,101, 31,206, 94, - 57,218, 87,166,161,162, 1, 12, 86,169, 84, 93, 37, 73,106, 8,192, 52,160,195,151, 73, 20, 69,157,181,217,108, 59, 0, 44, 89, - 31, 60,191, 64,107, 30,246,110, 49,170, 2, 77,211,125, 41,138,122, 31, 79,186, 63, 55,209, 52,189,110,237,129,121,183, 75,234, - 5,104,208,160,193,151, 12,195,140, 20, 4, 97,127,120,120,248,199, 17,230,208, 2,191,117, 16,104, 10,178, 34,231,133,130, 53, - 17,230, 80,235,203,116,227,102, 54,165,121, 25, 70,185,251,189,202,188,249,198, 27, 15, 4, 65, 40,229,234,247,148, 74,229,195, -147,167, 78,249, 21,165,166, 74,165,186,119,226,228,201,138, 57,106,190,249,102,108, 65, 53, 87,237,254,190,124, 78,219, 62,104, - 55,190,192,154, 39, 78,156, 40,159,215, 62,141, 27, 55,142,228, 56, 78,238, 60, 96,241, 42,149,202,111,217,214,233,121,206, 5, -246,209, 59, 19, 93,214, 12, 9, 9,225,229, 60, 31,153,202,232, 93, 0, 58,102,252,185,123,125,240,252,119, 73, 35,141, 64, 40, - 34,131, 37,138, 98,169,245,235,215, 67,175,215, 59,254,134, 32, 8,206,143, 36, 73, 16, 69, 17,146, 36,129,231,121, 12, 28, 56, - 80, 86, 1,213,183,245,152, 42, 42,149,106, 67,205,154, 53,235,140, 30, 61, 90, 81,174, 92, 57,232,116, 58,164,165,165,185,223, -187,119,175,245,226,197,139,131, 46, 94,188, 56,168,111,235, 49,125,214, 7,207,191, 38, 71,179, 71,243,225, 38,133, 66,209,147, -162,168,254,129,129,129,111, 13, 29, 58,148,122,243,205, 55, 33, 73, 18, 78,156, 56, 49, 99,197,138, 21, 51,250,180,250,226, 36, - 69, 81,107, 25,134,217,188,102,255,220,199, 37, 37,243,223,111, 57,218,175, 66,133, 10,227,102,206,156,233,249,231,159,127,246, -145, 36, 41, 26,192,100,114, 91,202, 67, 78, 33,239,216,231, 89, 71, 9, 95, 36, 4, 65, 40,117,228,200, 17,232,245,122,231,179, -206,243, 60, 68, 81,116,126, 36, 73,130, 36, 73,206,229,171, 36, 73, 66,155, 54,109, 74,185,162,153,147, 94,230, 8,186, 32, 8, -104,215,174,157, 95, 65, 52, 29,101,146, 35,109, 14,120,158, 71,251,246,237,159,169,102, 38,109,191, 67,135, 14,193,221,221, 61, -207,253,204,102, 51,218,183,111,239,145, 81, 30,243,249,105,134,132,132,192,205,205,205,249,191,152,152, 24,252,254,251,239, 24, - 54,108, 24, 60, 60, 60,156,255,235,213,171,151, 44,205,190,173,199,248, 2, 88,154,209, 56, 27, 5,160,227,222,189,123, 33, 8, - 2,222,125,247,221,142,125, 91,143,169, 10, 96,145, 94,175, 23, 83, 83, 83, 7,173, 15,158, 31, 75,158, 26, 2,161,128, 6, 11, - 0,244,122, 61, 54,109,218,148,101,201,153,156, 62,229,203,151,151,117,160,190,173,199, 84, 87, 40, 20,231,166, 78,157,170,104, -211,166, 13,157,121,157, 65,138,162,224,231,231,135,133, 11, 23, 42,246,238,221, 91,123,206,156, 57,231,251,182, 30,211,112,125, -240,252,139,249,104,134,122,123,123,191, 53,120,240, 96,186,109,219,182, 48, 26,141, 89,182,183,110,221, 26,173, 90,181, 66, 84, - 84, 84,147, 61,123,246, 52,217,184,113,227,207,125, 91,143, 9, 95, 31, 60,255, 13, 57,105,110, 85,187, 95,149, 82,165, 74,109, - 44, 87,174, 92,249, 51,103,206, 28,161, 40,234, 75, 65, 16,166,213,171, 87,175,125,116,116,244,253,184,184,184, 62, 33, 87, 54, - 92,119, 37,195,251,181, 25,187,145,162,168,198,162, 40, 94,178,219,237,239, 39, 38, 38,166,216,237,118,207,161, 67,135,170,254, -251,239,191,161,125, 91,143,217,185, 62,120,254, 63, 5,137, 92,137,162,104,203,105,187, 86,171, 77, 12, 52, 5,169, 10, 18,201, -202,107, 92,210,203, 56, 38,199,217,109,230, 66,139,191,176,231,147,223, 49,243, 75, 75,110,223,149,147, 86,199, 62,122,189, 30, - 27, 55,110,132, 66,161,128, 82,169,116,254,204,252,123,230,159,158,158,158,249,106, 23, 80,147, 42, 74, 77, 47, 47, 47, 72,146, - 68, 63,107,205, 76,145, 46,108,223,190, 29, 44,203, 58, 53, 51,127, 84, 42, 21,148, 74,165,171,209, 51, 28, 57,114, 36,139,166, -227, 60, 14, 31, 62, 12,131,193, 0,147,201,228,138,228,210, 57,115,230,116, 49, 24, 12,152, 48, 97,194,245,138, 21, 43,194,221, -221, 29,203,150, 45,131,135,135, 7, 4, 65,184, 62,111,222, 60,234,222,189,123, 88,180,104,209,138, 76,209, 45, 2,129, 80, 16, -131, 5, 32, 71, 67,229, 40,100, 28, 31, 57, 11, 50,247,109, 61,134, 81, 42,149, 27,166, 79,159,174,104,211,166, 77,150,130, 41, - 57, 57, 25, 73, 73, 73, 72, 78, 78, 70,122,122, 58,234,215,175, 79, 15, 31, 62,156,253,249,231,159, 55,245,109, 61,166,206,250, -224,249,121, 45, 69,242,214,254,253,251,105,142,227,160,209,104,114,220,129,162, 40,248,251,251,163,103,207,158,168, 93,187, 54, - 61,114,228,200,134,114, 51, 71,161, 80,108, 56,114,228, 72, 77,157, 78,167, 58,112,224, 64,211,229,203,151,159,237,211,167,143, -181, 69,139, 22,158,137,137,137,134,246,237,219,255, 5,160,150, 92,189,254,109,199,213, 44, 87,174, 92,155, 25, 51,102,120, 28, - 58,116,168,236,218,181,107,195,147,146,146,126, 91,188,120,241,196,239,191,255,222, 48,105,210, 36,143, 17, 35, 70,172, 15, 52, - 5, 85,137,200, 54,174,229, 69,137, 24,149,212,180,200, 29,235,150,159,110, 65,198,204,201,209, 44,142,124,112, 37,173,162, 40, - 66,161, 80,160, 71,143, 30,160, 40, 42,203, 90,156,142,159, 71,143, 30, 69,219,182,109,161, 80, 40,240,201, 39,159,200,214,236, -211,167, 15,120,158,127, 74, 51, 56, 56, 56, 75, 89, 66,211,180,108, 77,185, 31, 57,229, 83,113,104, 58,224, 56, 14, 61,123,246, -132, 32, 8, 79,149,161, 14,115,117,228,200, 17,151,174,185,221,110, 71,219,182,109,157,233, 62,117,234,148,115, 91,239,222,189, - 1, 0,255,252,227, 82, 27, 77,121,254,252,121,212,173, 91, 23,235,214,173,163, 24,134,193,233,211,167,161,213,106, 49, 96,192, - 0,212,169, 83,135,210,104, 52,248,239,191,255,144,156,156, 76,129, 64,144,193,248,241,227,115,219, 36,161,104,214,250,115, 85, -167,168,142,155, 35, 57,173,189,200,230, 85,232,100, 55, 83,133, 40,108, 62,175, 83,167, 78,141,214,173, 91,103, 41, 65, 83, 82, - 82,144,156,156,236, 52, 89, 73, 73, 73,184,119,239, 30,234,214,173, 75, 87,172, 88,177, 82, 68, 68,196,104, 0,121,173, 24,201, -179, 44,171, 12, 15, 15, 71,114,114, 50,252,253,253, 81,173, 90,181, 44, 59, 92,187,118, 13,135, 15, 31,198,195,135, 15,209,176, - 97,254,222,170,101,173,190, 85, 61, 60, 60,190,229,121,190,109,171, 86,173,220, 35, 34, 34, 40, 73,146, 96, 52, 26,125, 87,173, - 90,133,176,176, 48,156, 57,115, 6, 54,155, 77,209,176, 97,195, 26,157,222,252, 52, 81,173, 86, 31,138,139,139,251, 38,244,218, -166,171,121,186, 89,150,141,121,252,248,177, 37, 54, 54, 22,221,186,117,163, 43, 87,174, 92,117,222,188,121,195, 46, 94,188,120, -229,239,191,255,126,243,131, 15, 62,160,155, 53,107, 86,202,106,181,182, 0,112, 40,191,138,149,162,168,236,145,171, 44,227,175, - 36, 73, 66,114,114, 50, 34, 34, 34, 84, 41, 41, 41,168, 87,175,158, 37,208, 20, 4, 73,146, 92,190,201,138,195, 92, 61,171,104, -216,203,138,220, 46, 82, 57,121,203,243, 60, 20, 10, 5,246,236,217,147,103, 20,231,248,241,227, 80, 40, 20,112,115,115,195,150, - 45, 91,100,105,110,223,190, 61, 79, 77, 87,202, 18,135,102, 78,159,223,127,255, 29,163, 70,141,114,217,180,229,165, 89,175,126, -125, 68, 92,191,238,178,102,102,237, 61,123,246,228, 26,193,114,228,129, 43,240, 60,143,147, 39, 79,102,201, 79, 71,222,237,221, -187, 23,238,238,238, 48, 24, 12,174, 72, 14,223,176, 97, 67, 68, 66, 66, 2, 27, 22, 22, 6,141, 70, 3,173, 86, 11,173, 86, 11, -141, 70,131,152,152, 24,216,108, 54,108,222,188,153, 7, 48,130, 60,121,132, 23,144,236,230,234,153,152,188, 92, 13, 86,230, 22, - 87, 97, 13,150, 74,165,234, 56,124,248,112, 69,230,125, 83, 82, 82,156,145, 43,135,185,114,252,126,233,210, 37, 4, 5, 5, 41, - 34, 35, 35,223,205,199, 96, 73,142, 40,149,187,187, 59,146,147,147, 17, 28, 28, 12,147,201, 4,155,205,134,195,135, 15,227,241, -227,199,206,150,162,221,110,207, 55,173, 94, 94, 94, 43, 38, 76,152,240, 86,175, 94,189,176,111,223, 62,212,171, 87, 15, 26,141, - 6,247,238,221,131,213,106, 69,229,202,149, 81,165, 74, 21, 28, 63,126, 28,245,234,213,163,198,142, 29,235,126,225,194,133,110, - 63,255,252,115, 5, 0,245,243,136,226,173,167, 40,170,169,221,110, 79,154, 50,101, 10, 53,108,216,176,210,109,219,182,165,198, -141, 27,231, 55,101,202,148,248, 93,187,118,197, 15, 28, 56,176, 84,235,214,173,117,135, 14, 29,250, 34, 63,131, 37,167,229,156, -217,192,166,164,164,148,168,200, 85,118,205,231,241, 54, 37,225,233,231,189,123,247,238, 96, 89,214, 25,105, 10, 14, 14, 70,167, - 78,157,158,234, 42,235,208,161,131,108,205,247,223,127, 31,146, 36,101,137, 94,237,221,187,247,169,178,164,176, 17, 44,134, 97, -138, 60,130, 5,160, 80, 17, 44,158,231,209,189,123,119, 80, 20,229,252,190,163, 60, 82,169, 84, 80,169, 84, 56,120,240,160,203, - 6,171, 83,167, 78,144, 36, 9, 74,165, 18, 33, 33, 33,206,109,253,250,245, 3, 69, 81, 56,113,226,132, 44, 45,199,128,246,218, -181,107, 99,232,208,161,248,251,239,191,177,122,245,106,231,246,158, 61,123,226,189,247,222, 67,106,106, 42,124,125,125,217,232, -232,232,255,250,182, 30,179, 59, 44, 44,236, 93,242,212, 16, 8,121,243, 76, 12,150, 36, 73,245,203,149,251,255, 23, 95, 82, 83, - 83,157, 21,127, 98, 98,226, 83, 81,172,196,196, 68,148, 42, 85, 10,130, 32,212,117,245,132, 12, 6, 3, 4, 65,192,234,213,171, -157,173, 70, 7,114, 12,150, 40,138,158,175,191,254, 58, 46, 94,188,136,219,183,111,195,110,183,227,225,195,135,176, 90,173,206, -207,153, 51,103, 96,181, 90,113,235,214, 45,152, 76, 38, 4, 4, 4,192,110,183, 27,115, 51, 18, 13, 26, 52,168, 86,177, 98,197, -118, 63,252,240,131,199,238,221,187,197, 63,255,252, 51,122,254,252,249,209,110,110,110,101, 91,182,108,137,150, 45, 91, 86, 62, -124,248, 48,115,245,234, 85, 52,107,214, 12, 26,141,230,181,194, 92, 84,171,213,154,197, 88, 57,126, 47,200,178, 72,207,194, 92, - 17,147, 85,114, 12,214,222,189,123,179, 68, 86, 20, 10, 5, 14, 29, 58,244, 84,212, 73,173, 86, 99,215,174, 93,178,140,203,142, - 29, 59,242,140, 92,101, 54, 72,249,181, 42, 51,151, 75,127,254,249, 39, 24,134,193,176, 97,195,156, 6, 45, 39,205,252,238,251, -204,154, 65, 63, 63, 25, 91,118, 97,178,144,171,193,146,163,153, 89,219, 97, 38,139, 42,130, 37,138, 34, 66, 66, 66,178,152, 53, - 7, 59,119,238,132,187,187,123,150, 65,240,249,208,209, 17,245,114,116, 11, 2, 64,135, 14, 29, 70, 24,141,198,183, 45, 22, 75, -247, 93,187,118,193,108, 54,163, 82,165, 74, 40, 85,170, 20, 78,159, 62, 77,198, 96, 17, 92,137,240, 56,160,100,252,223,149,109, -112,225,123, 57,237, 39,101,219, 55,175,180,230,244,119,110, 58,249, 27,172,220, 90,117,217, 11,199,140, 66, 49,175, 22,146, 6, -128,151,227,141,196,212,212, 84,167,145,114, 68,173, 50,155,171,164,164, 36,164,165,165,193,211,211, 19, 28,199, 25,250,182, 30, - 99, 92, 31, 60, 63,177, 40,174,180,205,102,203,119,159,199,143, 31,127,250,233,167,159,238,154, 59,119,174,177, 71,143, 30, 8, - 13, 13, 69,173, 90,181, 96,183,219, 81,170, 84, 41,220,184,113, 3,105,105,105, 56,115,230, 12,222,120,227, 13, 48, 12,131,111, -190,249, 38, 49, 49, 49,241,179, 60,100, 99, 30, 63,126,156, 30, 27, 27,235,209,183,111, 95,186,122,245,234,254,223,125,247,157, -121,217,178,101,143,130,130,130,188, 6, 12, 24,160, 59,124,248, 48,127,235,214, 45,212,173, 91, 23,222,222,222,138,158, 65, 35, -116, 91, 66, 23,167,185,122,142, 14,243,154, 61,122,149,156,156, 92, 34,158,182,226, 24,227, 68, 40, 60,142,231,189, 87,175, 94, -206, 72, 83,230,103,126,223,190,125,232,222,189,187,179, 66,111,208,160,129,108,205,190,125,251, 58,141,202,246,237,219,243,140, - 64,185, 18,109, 26, 50,100, 8,148, 74, 37,150, 47, 95,142, 47,190,248, 2, 12,195,224,167,159,126, 2, 77,211,152, 60,121,114, -129, 52,207, 78,176, 64,169, 84,226,181,153, 12,254,251,254,137,241,241,207,104, 28,166, 36, 39,203,214,204,108,176,122,245,234, - 5,138,162,156,134, 74,173, 86, 67,165, 82, 57,127,230,103, 84,115,104,176, 58, 53, 51,127,159,162, 40, 12, 24, 48, 0, 12,195, - 32, 56, 56,216,165, 52, 46, 91,182,204,217, 45, 8, 0, 42,149,234,173, 49, 99,198,116,207,105,255, 90,181,106,145, 7,134, 32, -215, 92,229,102,116,242, 50, 48,185,109,147,242, 48,105,146, 11,223,163,144,127,151, 97,230,191,169,108,166,138,202, 67, 71,190, -193,146, 51, 6, 43,191,194,102,125,240,124,203,128, 14, 95, 62, 74, 77, 77,245, 82, 40, 20, 79,117, 9,102,143, 98, 37, 39, 39, - 67, 20, 69,220,190,125, 27, 10,133, 34,121,245,222, 31, 18,139,234,106,203, 49, 88, 33, 87, 54,156,104, 81,179, 79,207,207, 63, -255,124,180,205,102,107, 34, 73,146, 70, 16, 4,213,246,237,219,169,109,219,182,161, 92,185,114, 24, 48, 96,128, 4,192, 70,211, -180, 69,173, 86,255, 19, 31, 31,191,232,200,213,141, 57,118,233,221, 72, 60,138,245,193,243,147,222,111, 57,186,221,132, 9, 19, -118,142, 31, 63,190, 98,235,214,173,169, 33, 67,134,152,230,206,157, 43, 94,184,112, 1, 77,154, 52,129, 78,167, 75, 78, 77, 77, -245, 0, 0,189, 94,207, 50, 12,227, 5, 64,182,193, 18, 69, 49, 87, 99,229,248,249,188, 23,246,150, 27, 13, 35,115,236, 60, 63, -131,181,107,215,174, 92,163, 77,142,232,150, 35, 90,180,111,223, 62, 89,154,219,182,109,123, 42, 42,150, 91, 52, 60,191,123, 52, -179, 25, 90,177, 98, 5, 24,134,113,118, 13,210, 52,141, 47,191,252, 18, 10,133, 2,115,230,204,193,180,105,211, 92,238, 34,108, - 56,231,255, 95,150,113, 68,150, 30, 63,122, 4,133, 66,241, 36, 58,206,243, 46,117, 17, 74,146,132,221,187,119,231, 25,193, 98, - 89,215, 22,212,144, 36,201, 57, 86, 46,243, 91,132, 0,240,247,223,127,195,104, 52,186,242,102,226,246,119,223,125,183,139,135, -135, 7, 6, 14, 28, 8,173, 86,139,110,221,186,193, 98,177,244, 6,128,217,179,103, 99,210,164, 73, 0,128,169, 83,167, 98,218, -180,105, 72, 75, 75,179,146, 39,134, 32, 3, 42,175,232,142,204, 72, 20,158,193,247,228,124, 63, 95, 51,229,146,193,146, 36, 73, - 86, 23,161,156,214, 28, 69, 81,225,119,239,222,109, 87,161, 66,133, 28,163, 86,217, 35, 88, 25,115, 99,129, 97,152,243,114, 90, - 95,114,145,211, 69,152, 97,178,130, 1, 56,155,128,111, 85,237,113, 56, 61, 61,189, 69,185,114,229, 28,221,132,103, 14, 93, 90, -215,200,149,140,222,120,120,225,213, 15,219, 79,120,253,219,111,191,253,183,124,249,242,149,186,116,233,130,229,203,151,115, 23, - 47, 94, 84,189,245,214, 91,168, 94,189,186, 58, 45,237,137,159,210,235,245, 10,138,162,188, 0, 68,202, 61,175,156,140, 85,118, -147, 85, 16, 10, 58,133, 0,225,197, 52, 88,114, 62,114, 7,121, 59,202,144,190,125,251,102,137,134,101,254,108,222,188,217,169, -153, 97,174, 40, 57,154, 43, 87,174,196,136, 17, 35,160, 84, 42,241,203, 47,191, 60, 53, 6,139,166,105,151, 53,223,152,171,197, -149,105, 79, 34, 77, 85,190,178, 61,213, 69, 8, 64,182,166,156,114,180, 32,221,131,142, 72,149, 35,146,152,217, 96, 37, 37, 37, - 57,199,118,201,101,125,240,252,174,125, 91,143,169,194,113,220,213,218,181,107,179,177,177,177,232,217,179, 39, 54,110,220, 8, - 0,248,242,203, 47,241,229,151, 95,102,249, 78, 74, 74,138,133, 60, 49, 4, 23, 76, 86,126,209, 44,228, 19, 73,114,245, 88,133, - 77,107, 94,233,114,201,100,185,220, 69, 88,144,194,214,102,179,237,254,229,151, 95, 90,254,252,243,207, 10,139,197,146, 99, 20, -203,241,187,197, 98,129,167,167, 39,194,195,195,121,171,213,154, 95,236, 92,224, 56, 14,222,222,222,120,244,232, 81,174,173, 95, -138,162,160, 86,171, 97,177, 88, 0,192,229,233, 15, 4, 65,176,166,165,165, 9,173, 91,183,102, 54,110,220, 8,139,197, 82,160, - 22,220,159,251,230, 36,247,109, 61,102,255,233,211,167, 63,127,237,181,215, 80,161, 66, 5, 58, 49,241, 73,128, 78,167,211, 41, - 82, 83, 83, 1, 0, 90,173, 86, 13,192, 43, 63,189, 8,115,168, 26, 0,212,106,181, 21, 0,194,194,194,108,201,201,201,170,236, - 6,107,242,228,201, 54,158,231, 11, 52, 15, 86, 81,154, 44, 87,186,254,242, 59,158,171,105,146,123,236,226,152, 7, 75,142,102, - 65,231,193,146,147, 79,114, 41, 74,115,149,217, 92,100,143, 96,101,255, 89, 16,205,225,195,135, 99,233,210,165, 79, 69,176,230, -204,153, 3,134, 97, 48,109,218, 52,151, 53, 47, 79, 5,106, 78,147, 0,216,178, 68,176, 12, 25, 19,133, 74,162,235, 51,167,252, - 23, 54, 7,107,119,165, 66, 16,164,124, 77,147, 92,115,117, 62,228, 27,108, 62,200, 61,165, 57,110,220,184, 44,127,115, 28, 39, - 55, 58,246,211,156, 57,115, 88,173, 86, 11,155,205,134,148,148, 20, 60,122,244, 8,121, 68,176, 52,196, 55, 16, 92,140, 8,201, - 53, 37, 84, 30,166,202,213,109,121, 25,162,236,209,181,220,190,159,221,244,229,214, 77,152,227, 57,230,250,244,241, 60, 15,199, -192,116,138,162, 64, 81, 20,104,154, 6,195, 48, 89,126,202,100,201,165, 75,151, 6,237,218,181,171,118,163, 70,141,232,168,168, -168, 28,163, 88, 22,139, 5, 62, 62, 62,136,137,137, 17, 57,142,251, 15,192,194,124,116, 23,124,252,241,199, 95,143, 26, 53, 10, - 1, 1, 1,120,244,232,209, 83,145, 26,189, 94, 15,119,119,119, 68, 70, 70,226,194,133, 11, 0, 48,223,213,187, 68,161, 80,220, -188,125,251,118,243,255,253,239,127,186,168,168,168,116,150,101,111, 20,248,142,147,164,157, 15, 30, 60,248, 24,128,218,219,219, -155, 77, 75, 75, 19, 1,208, 26,141,134, 77, 73, 73, 17, 0, 48,106,181, 90, 65,211,180,135,171,166,195,108, 54,231, 24,193, 42, -138,174,193, 87, 41,146,149,219,242, 58,114, 22,131, 46, 8,133,209,201,235,186,184, 98,174,228, 68,172, 93, 25,123,148, 89,243, -163,143, 62,202, 53,114,149, 93, 83,206,189,234, 72,207,152, 49, 99,178,116, 59,126,243,205, 55, 80, 42,149,133,210,188, 51, 39, -107, 87,102,122, 90, 90, 97, 52,239, 54,175, 29, 95, 57, 42,165, 45, 4, 49,239,178,242,238,221,187, 15,143, 28, 57, 98,151,163, -217,186, 65,114,229, 56,123,254,154,145,145,145,177,114, 52, 1, 88,246,238,221, 11,141, 70,131,191,254,250,139,247,245,245,101, - 29, 19,149,230, 20,193,178, 90,173,106,226, 29, 8,133,136, 8, 81, 46,254, 93, 20,219, 10,146,142, 66,167, 55, 71,131,197,178, -236, 67,185,203,223,100, 60,244, 15,243,218,190, 62,120,190,208,183,245,152, 62,115,230,204, 57, 55,100,200, 16, 69,147, 38, 77, -104, 81, 20,145,146,146, 2,171,213, 10,154,166,225,238,238, 14, 47, 47, 47,252,247,223,127, 98, 76, 76, 12, 47, 8, 66,239,124, - 38, 25,197,250,224,249,147,251,182, 30,179,125,216,176, 97,223,215,171, 87,175,213,199, 31,127, 12, 95, 95, 95, 36, 38, 38,194, - 96, 48,192,199,199, 7, 9, 9, 9, 56,112,224, 0, 18, 18, 18,142, 1,152,184, 62,120,254, 41, 87,239, 18,150,101,103,204,152, - 49, 35,192,211,211,179, 97, 66, 66,194,191,162, 40, 78, 41,240, 29, 71, 81, 55, 15, 29, 58,148, 86,166, 76, 25,245,201,147, 39, -205,146, 36,241, 75,151, 46,245, 57,126,252,120, 2,207,243,194,175,191,254,234,115,236,216, 49, 51,199,113,178,107, 71, 71, 36, - 43, 99, 70,247,156, 48, 22,197, 90,132, 37,205,100,229, 55,147,121, 94,102,233, 89, 27,161,226,160,176, 19,152,102, 55, 96, 50, -222,240,115, 25,133, 66,129,191,254,250, 43,199,200, 85,118, 77,185, 81, 28, 87,210,249, 60, 53, 57,142,107, 22, 52, 32,234,132, -213,186, 36, 32,175,253, 52, 26,205, 3,139,197,210, 88,206,228,194,118,187,189,217,219, 3,163, 79, 88, 44,121,107,106,181,218, -251,118,187,189,137,204, 9,139, 7,239,216,177,131, 7,160, 3, 48, 50, 58, 58,250, 63, 71,227, 57,167, 8, 22,129, 32,135,156, - 38,222, 44, 65, 38,239,217, 28, 60,167,150, 88,113,189,197,229, 88,139,176,116,233,210,175,117,236,216,145,117, 60,196,247,238, -221, 67, 84, 84, 20, 34, 34, 34, 56,142,227,174,218,108, 54,217,107, 17,102,210,110, 3,224,251,183,222,122,171,126,175, 94,189, -112,228,200, 17,156, 61,123, 22,247,239,223,191, 4,224,171,245,193,243,119,149,148, 27,175, 95,155,177,109, 0,120,138,162,152, - 72,211,180,144,211,239, 27, 14, 45,216,151, 95,133,153,253, 58, 5,154,130, 18, 1,228,212,186,116,143, 48,135,218, 74,170, 81, - 40,108,148, 41,123, 30,229,181,141,240,116, 30,246,109, 61, 70,218,187,119, 47, 88,150,117,142, 93,114, 68,169, 89,150,205,213, - 92, 53,108,216, 16, 97,225,225,204,141,108,149,120,198,212, 36,210,190,125,251,178,104, 58,162,222,142,255,229,165, 9, 73,122, -202, 24, 52,104,208, 64,218,191,127,191,243,251,142, 25,231,229,104,174, 15,158, 79,229, 82,110, 20, 88, 51, 44, 44,140, 42,238, -251,185, 48,247,111, 65,187,144,251,182, 30,179, 45, 37, 37,165, 75, 68, 68, 68,110,141,196, 2, 77, 86, 76, 32,188,114, 33,188, -103,105,176, 50, 30, 94, 26,192, 96,149, 74,213, 85,146,164,134,118,187,221,164, 84, 42,147, 40,138, 58,107,179,217,118, 0, 88, -178, 62,120,190, 80, 64,109, 10, 64, 79,154,166,127,147, 36, 73, 33, 73,210, 80, 0,107,214, 7,207, 23, 95,134,139, 69, 12, 2, -161, 56, 12,214,128,119, 38,198,218, 57,174,148,171,223, 87,169, 84, 15, 79,156, 60,233,151,147,193,106,210,184,113, 65, 53, 99, - 79,156, 60, 89, 38, 39,131,213,184,113,227, 88,174, 0,154,106,181, 58,118,229,174, 89,165,115,218,246,209, 59, 19, 11,172,121, -252,248,241,210, 47,107, 67,165, 69,205, 62,225, 54,155,173,138,197, 98, 81, 89, 44, 22,101,230,122, 66,171,213,198,165,165,165, -149, 34, 79, 16,129, 80,194, 12, 86, 14,166,200,125,125,240,252, 36,114, 41,136,193, 34, 20,144,163, 53, 85, 0,124, 33, 81,129, - 96,196,255, 32, 82, 15,208,252, 74,190, 93,194,121,118,159, 58, 52, 41,170, 22, 4, 46, 2, 52, 27,149,155, 38,153,183,140,148, - 69, 4, 2, 65,166,193, 34, 16, 8, 4, 2,129, 64, 32, 20, 28,154,100, 1,129, 64, 32, 16, 8, 4, 2, 49, 88, 4, 2,129, 64, - 32, 16, 8, 37, 26,150,100, 1,129,240, 4, 57,243, 92, 21,118,188,209,171,172,233,234,241, 8, 4, 2,225, 69,230,185, 15,114, -127,213, 23,247,125, 30,231, 79, 42, 51,130,227, 57, 47,142, 25,250,201,253, 69, 32, 16, 8,185, 68,176, 10,186,108, 71, 65, 43, -247,252,230,119, 42,172,113, 40,233, 6, 46,175,217,194,139,202, 56,189,108, 38, 86,238, 4,162, 69, 57,209, 40,225,229,184, 95, - 74,178, 25,204,239, 57, 45,234,244,230,116, 60, 57,229, 49,121,150, 8,132, 2, 26,172,103, 97, 36,242,219,175, 48,134,173,184, - 12,204,243,202, 15, 66,225,175, 61,153, 74,128, 64, 40,216,115, 84, 84, 13, 96, 2,129, 24,172, 18, 98, 38,228,152,172,130, 24, -148,162, 54,111,174, 22, 54,114, 10,179,162,214, 44,140,209,200,171,251,231,101, 28,147, 83, 28,139, 61,231,119, 62,133, 89,236, - 57, 47,109, 57,105,125,149,214,152, 36, 60,187,103,232,121, 52,122,179,107,146,251,154,240, 74, 24,172,130,222,232, 47,219,248, -172,226,136,224,149,196,244,191,168,134,253,121, 25,224,194,228,107, 94,223,125,213,199, 55, 18, 74,118, 57,232, 48, 65, 69,113, -159,102,127, 14,228, 62, 83,121,117,127, 62,171,103,135, 24, 65, 98,176, 94,185,135,191,160,173,166,146,110,118,158,245,247, 74, - 98,222,189, 74,247, 42, 49, 89,132,146,106,174, 74,146, 65,201,111,108, 48,121,134, 8,196, 96,189, 68,198,237,101, 79,123, 78, - 45, 78, 82,136, 17, 8, 37,255,217, 46,108, 35,173, 40,187,239, 10,171,227, 74,175, 66, 65,141, 22, 25, 7, 74, 12, 22,129, 24, -171,231,102,174,136,201, 34, 16, 94,141,114,208, 97,174, 10,107,178, 74,122,185, 42,231,109,121, 2, 49, 88, 37,162,133,241, 42, - 86,186, 47,235,121, 23,199, 24, 39, 2,129, 80,242,159,243,204,166,170, 32,221,111,174,212, 37,207,115,144, 59, 49, 82, 4, 7, -197,190, 84, 78, 97, 43,203,103, 93,217, 22,244,120,185,125,239, 70,226, 81, 98, 24, 92, 44,120, 72, 1, 69, 32,188,188,230,170, - 32,229,173,171,230,138, 64, 40, 9,144, 46, 66, 25, 15,104, 81, 44, 27,242,162,190, 54, 76, 94,119, 38, 16, 94,238,178,238, 89, - 60,223,197, 61, 96,188, 48, 13,227,194,188,113, 88, 20,154,164,124,125,121, 33,139, 61, 63, 71,227, 86, 20,122,133,157,215,234, - 89,166,219,145, 94, 57,159,162, 78,147, 43,133,227,179,206,191,162,142,154,146,214, 60,161,164,150,125, 37,201, 92, 21,231,115, - 68,158, 77, 2, 64, 34, 88, 47, 20,207,179,165,243, 42,181,180,114, 91, 94,167,184,214,220, 43,140, 78, 94,215,133, 20,224, 4, - 82,118, 21, 77,186,158,229,203, 62, 4, 98,176,158, 73,229, 44,167,229,239,170,238,203, 88,233,228, 55,163,119, 81,157,119, 73, - 51, 89,174,158,247,179,122,165,187,164, 84, 14,249,109, 39, 6,172,228, 26,251,151,165, 97, 68,186,192, 8,196, 96,149,192, 7, -221,213, 46,157,226,172, 76,138, 50, 63,228,230, 67, 73,169,252,242,155, 41,188,164, 85, 76,228, 45, 68,194,203,106,174, 10,210, -152, 44, 72, 89, 83,216,231,186,176,111, 11,186,114, 46,228, 89, 39,148,100, 40, 73,146,158,233, 77, 91,156,230,226,101,239, 42, - 33, 45, 65, 66,113, 84,234, 69, 81,161,150,244,251, 52,183, 50,224, 85,127,166, 72,190, 16, 8, 47,145,193,202,233, 65, 38,173, - 16, 98,176, 8,207,183,114, 45,236, 56, 48, 2, 41,139, 8, 4,130, 12,131, 69, 32, 16, 8, 4, 2,129, 64, 40, 56,100,154, 6, - 2,129, 64, 32, 16, 8,132, 34, 38,203, 32,247,220, 66,253,129,166, 32, 42,194, 28, 42, 59,212, 85,220,225,227,156,210, 25,104, - 10,162, 0,192,149,116,202,193,213,115,127, 17, 32,225,125, 2,129, 64, 32, 16,158,161,193,202,193, 92,208,120, 18,229,162, 2, - 77, 65, 34, 0,209, 85,179,145,221, 12,101,210, 4, 0, 17,128,148,159,102, 94,134, 32,195, 88, 49,142,115, 9, 52, 5,241, 0, -132,194,154,162,162, 56,247, 23,137,204,215, 41, 35, 79,169,140, 63,165,140,107, 84, 98, 76, 91,126,131,170, 41,138, 66,126,233, - 45,136, 9, 45,204, 88,163,130,228,169, 11,247,168,236,103,233,101, 33, 83,126,210,142,115, 47,108,158,102,228, 39,155, 81,158, - 8, 25,159, 66, 61,247, 5,209, 36, 13, 32, 2,225,229, 32,203, 24, 44, 71, 5, 18,104, 10,162,106,214,172,169,240,240,240, 56, -103, 52, 26,107,228,244, 69,158,231, 69,139,197,162, 91,182,117,186, 53,175, 2, 34,115,165,212,175,205, 88,165, 86,171, 61,231, -238,238,158,163,166, 40,138,162, 32, 8,186, 69, 27, 38, 89,243, 42,112, 50,167,179, 66,133, 10,170,114,229,202,253,235,238,238, - 94, 61, 55,205,180,180,180, 28,211,153, 91,193,157,223,185, 11,130, 32,166,167,167,203,214, 44,105,228,101, 30, 2, 77, 65,116, -213,170, 85,123,154, 76, 38,119,187,221,158,197,180,100,124,196,138, 21, 43,174,156,185,124,184,248,162, 87, 10, 69, 57, 71, 86, -118,205,159, 38,111,182, 2, 80, 1,128, 36, 73, 72, 75, 75,203,243,123, 58,157, 14, 20, 69,101,249, 95, 90, 90,154,102,210,130, -129,206,123, 44,187,102, 84, 84, 20,114, 27, 67, 41, 73, 18,202,149, 43,231,146,102,246,239, 59,174,123,126,100,214,172,106,108, -142,225,195,135, 63,165, 41, 73, 82, 22,205,188,116,127,254,249,103,106,248,240,225, 82,102,221,159, 38,111,182, 74,148,228, 60, -247,244,212,244,188,243, 83,175,251,127, 59, 11,128,146,168,167,210, 57,108,196,176, 44,154,209,145,209,121,106,150, 41, 95, 38, - 75,186, 41,137, 66,122,106,122, 22, 77, 10,148,211,244,214, 26, 95, 75, 91,238, 90,185,155, 12,205,248,228,166, 25, 87, 61,206, -244,207, 15,255,164,102, 46,178, 36, 72, 34,169,154, 8,132,151, 52,130, 85,185,114,101,165,143,143,207,201,178,101,203, 86, 91, -185,114, 37,206,157, 59,135,134, 13, 27,130,227, 56,240, 60, 15, 81, 20,209,183,111, 95,218, 98,177,168, 1,200, 50, 25,253,218, -140, 85,186,185,185,157,114,104,198,198,198, 66,167,211,101, 54, 45,248,248,227,143,105,138,162,100,105, 58,204, 85,133, 10, 21, - 78,150, 43, 87, 46,112,197,138, 21,184,118,237, 26, 42, 85,170, 4,138,162,192,243, 60, 44, 22, 11, 6, 15, 30, 76, 3,144,157, -206,220,206, 93, 20, 69,112, 28, 7, 65, 16,208,175, 95, 63, 58, 61, 61, 93,182,166,131,143,222,153, 24,201,113, 92, 57, 57,251, - 42,149,202,120,149, 74,229,183,108,235,116,190,168, 53, 67, 66, 66,248,220, 90,219, 85,171, 86,237, 93,177, 98, 69,253,186,117, -235, 16, 31, 31, 15,157, 78, 7, 81, 20, 33, 8, 2,108, 54, 27, 62,248,224, 3, 58, 62, 62,158, 5, 96, 39,143, 79,254, 72,146, -132,244,244,116, 40,149, 74,188,253,246,219,120,244,232, 17,188,189,189,179,108, 15, 14, 14,118, 89, 51, 42, 42, 10, 6,131, 1, -171, 86,173,194,249,243,231,209,160, 65,131, 44,207, 82,175, 94,189, 32, 73,146, 44,131,148, 29,171,213, 10,158,207,243,182, 3, -195, 48,208,104, 52,178,211,251,248,241, 99,164,167,167,231,119,127,194,215,215, 55, 31, 49, 32, 61, 53, 29, 52, 77,163,101,203, -150,136,139,139,131,187,187, 59,196, 12, 79, 34, 73, 18, 78,158, 56,233,218,185, 75, 64,244,189,104, 40, 20, 10,172, 91,183, 14, -167,207,156, 70, 96,149, 64,112, 60, 7, 9, 18, 4, 81,192,232, 17,163, 33,138, 34, 24,134,145, 37, 89,119, 74, 93, 77,153,107, -101,110,169, 84, 42,207,188, 52,117,102,157, 14, 64,234,243,184, 55, 27, 53,106, 20,203,243,124, 41, 87,191,167, 84, 42, 31,158, - 60,121,210,151, 60,221, 4,130,139, 6, 43,208, 20, 68,183,108,217,242,128,159,159, 95,221,149, 43, 87,210, 44,203,226,204,153, - 51,136,142,142, 70,153, 50,101, 96, 48, 24,160,209,104, 32,138,242, 27, 89, 25,154, 7, 51,107,238,221,187, 23,190,190,190, 40, - 93,186, 52,220,220,220,156,133, 53,203,202,158, 92,158,169, 88,177,226,193,178,101,203,190,182, 98,197, 10,154,101, 89,156, 58, -117, 10,209,209,209,240,245,245,133,221,110, 71, 74, 74, 10, 4, 65,128,209,104,148, 21,213,161, 40, 74,214,185, 11,130, 80,160, -204, 22, 4,193,239,208,161, 67,112,119,119,207,115, 63,179,217,140,246,237,219,123,100, 92, 31, 62, 63,205,144,144, 16,184,185, -185, 57,255, 23, 19, 19,131,223,127,255, 29,195,134, 13,131,135,135,135,243,127,189,122,245,202, 85, 51,208, 20, 68, 85,169, 82, -165, 87,133, 10, 21,244, 91,183,110,165, 52, 26, 13,254,252,243, 79,120,123,123,195,195,195,131, 82,169, 84,148, 90,173, 6, 0, - 73,161, 80, 80,228,209,145, 71, 90, 90,154,211, 92, 81, 20,133,248,248,120,164,165,165, 65,163,209, 64,161, 80,128, 97, 24,136, -162,232,140,112,229, 20,201,202,203, 92,177, 44,139,179,103,207, 34, 42, 42, 10,165, 74,149,130, 94,175,135, 90,173, 6,207,243, -136,138,138, 2, 0,248,251,251,203, 54, 27, 86,171, 21,106,181, 26,141, 27, 55, 70,100,100, 36, 12, 6, 3,104,154,206, 28,193, - 4, 69, 81, 56,117,234,148, 44, 19,227, 48, 87, 94, 94, 94,152, 63,127, 62,118,238,220,137,128,128, 0, 40,149, 74, 48, 12, 3, -134, 97, 64,211, 52, 24,134,193,232,209,163,145,223, 91,205,105,169,105, 78,115,197, 48, 12, 46, 93,186, 4, 0,168, 95,191, 62, - 84, 42,149,243,217, 76, 79, 75,207, 49,146,149, 83,250,162, 35,255,223, 92,169,213,106, 44,156,191, 16, 20, 69, 97,234,212,169, -240,240,240,128,205,110,123,242, 12,221,143,201, 49,146,245, 20, 91, 64,251,253,235,119, 51,195, 92, 81,106,181, 26, 73, 29, 59, -225, 78,106, 42,220,195,195,225,230,229,229,212,212,197,234,162, 58,117,238,148, 83, 36, 43, 11, 77,155, 54,141,180,217,108,206, -134,148, 66,161,136, 87,171,213,249, 54,192,242,138,206,242, 60, 95,234,232,209,163,208,106,181, 89,242,221,209,160, 18, 4, 1, -162, 40, 58,163,143, 20, 69, 65,146, 36,180,104,209,162, 20,121,178, 9,121, 49,126,252,248, 76,205, 23, 0, 79, 63,133, 18,242, -124, 50,139,182,157, 91, 20,199,154, 59,119,110,225, 12, 86,198,184, 6, 90,175,215, 55,255,237,183,223,156,102, 71,161, 80, 64, -163,209,100,249, 0,128,155,155,155,121,220,135,243,156,223,231, 56, 78,188,126,253,186,238,206,157, 59,214,130,104, 82, 20, 5, - 65, 16,156,154, 54,155, 77,140,140,140,212, 93,191,126,221,154, 67, 58, 89, 55, 55,183,183,150, 47, 95,238,212, 76, 79, 79, 71, -122,122, 58,146,146,146, 96,179,217,144,146,146, 34,215, 0, 82,210,147, 18, 70,246,185, 23, 20,149, 74,133,237,219,183,131,101, - 89, 40,149,202,167, 62, 42,149, 10, 74,165,210,101,205, 35, 71,142,100,209, 4, 0,189, 94,143,195,135, 15,195, 96, 48,192,100, - 50,229, 39, 67, 25,141, 70,195,150, 45, 91,156,231,152,113, 61,152,121,243,230, 77, 51, 24, 12, 62,118,187, 29, 62, 62, 62, 0, -176,244,139,126, 63, 56, 10, 92,187, 78,167,115,219,188,185, 57,137,104,229, 80,121, 3, 64,243,230,205,157, 21,178,195, 84,176, - 44,235,252,169, 86,171, 81,171, 86, 45,132,133,133,201,214,204,124,143,170, 84, 42,168,213,106,104, 52, 26,231, 79, 15, 15, 15, -140, 26, 53, 10, 83,166, 76,113, 41,114,229, 48, 87, 52, 77,227,234,213,171,160, 40, 10,229,203,151,135, 90,173,198,253,251,247, -193, 48, 12,234,212,169,227, 82,228,202,211,211, 19,243,231,207,135, 82,169,196,146, 37, 75,192,178, 44,222,125,247, 93,120,121, -121, 97,255,254,253, 80, 42,149, 24, 63,126,124,222,198, 18,255,223,197, 24, 20, 20,228,140, 36,137,162, 8,154,166,161,209,104, - 32, 73, 18, 24,150,129, 66,169, 64,237, 58,181,241,111,216,191,249,154, 64, 73,124,162,185, 98,197, 10,100, 52, 32,192,243, 60, - 88,150,133,143,143, 15, 4, 65,128, 90,173,134,222,168,199, 23, 95,124,129,111,167,126,155,119, 36,107, 11, 40, 28, 4,203,208, - 76,169,204,154,233, 20, 5, 1,128,143,143, 15,172,146,244,148,166,234,145, 42,207, 72, 22,199,113,126,199,143, 31,135, 90,173, -134,221,110, 71,199,142, 29,245,102,179,153,235,219,122, 76,150,253, 92, 49, 94, 0,160,213,106,177,111,223, 62, 40,149, 74, 40, - 20, 10,176, 44,235, 52,254, 42,149, 10, 10,133,194,249, 97, 89, 54, 75, 67,142, 64,112,209,216, 60, 75, 83, 85, 34,204, 89, 78, -225, 34, 74, 16, 4,132,135,135,227,220,185,115, 96, 89, 22,222,222,222, 48,153, 76,208,233,116,206, 66,188, 79,159, 62,232,219, -183, 47, 56,142,115,118,157,125,240,193, 7,180,209,104,204,177,235, 76, 16, 4, 60,126,252, 24,187,118,237,130, 66,161,128,167, -167, 39,140, 70, 35,180, 90,173, 83,211,100, 50, 97,229,202,149,160, 40, 10, 81, 81, 81, 24, 58,116,104,174,122, 14,205,136,136, - 8,156, 60,121, 18,105,105,105, 48, 24, 12,160, 40, 10,102,179, 25, 17, 17, 17,184,119,239, 30, 82, 83, 83,161,213,106, 23,143, -253, 96,238,151, 63,174, 25, 31,157,159,201, 16, 4, 1,231,206,157, 67,120,120,120,174,231, 14, 64, 86, 84, 44,151,130, 18, 61, -123,246,132, 32, 8,206,130,203, 81,184, 57,204,213,145, 35, 71, 92,210,180,219,237,104,219,182, 45, 68, 81,132, 66,161,192,169, - 83,167,156,219,122,247,238, 13, 0,248,231,159,127,228, 68,216, 16, 23, 23,135, 21, 43, 86, 56, 10, 88,230,143, 63,254,152, 81, -186,116,105,207, 37, 75,150, 32, 54, 54, 22,122,189, 30,162, 40,130,231,121,216,237,118, 76,152, 48, 65, 25, 31, 31,175, 5,233, - 50,204,213,100, 36, 36, 36,224,209,163, 71,160, 40,202,121,141, 89,150,205, 98,178, 24,134, 1, 69, 81, 72, 75, 75,131, 40,138, -121, 86,100,130, 32,224,226,197,139, 56,127,254, 60,104,154,134,135,135, 7,220,221,221,161,213,106,161,213,106,161, 82,169,160, -211,233,160, 86,171, 65,211, 52,238,223,191, 15,142,227, 80,177, 98,197, 60,211, 41, 8, 2,222,124,243, 77,208,244,147,113,243, -142,239,123,120,120, 64,161, 80, 32, 38, 38,230,137,137,145,217, 77, 38, 73, 18,108, 54, 27,230,206,157,235, 52,253, 94, 94, 94, - 80, 40, 20,168, 93,187, 54, 12, 6, 3,142, 29, 59, 6, 65, 16,228, 53, 42, 50,218,194,241,143,226,113,233,226, 37, 8,130,128, - 26, 53,106,192,221,221, 29, 97, 97, 97,160, 40, 10,245, 26,212, 3,171, 96,193, 50,236,211,145,172, 28,210,231,232, 90, 12,251, - 55, 12, 11,231, 47,132,197, 98,193,176, 97,195, 80,185,114,101, 76,153, 50, 5, 52, 77, 99,202,140, 41,206,231, 63,115, 36,171, -108,185,178, 79,167,241, 10, 40,196,130,113,104,166,116,120, 23,105, 54, 27,220, 54,111,134,123, 96, 32, 80,185, 50,188,109, 54, - 36, 69,221,205,162,233, 30,239, 30,213,169,115, 39, 36,123, 39,187, 99, 5,146,243, 50,215,146, 36, 97,214,172, 89, 26, 73,146, - 32,138,162, 51,202, 36,138, 34,198,142, 29,235, 41, 39,242,157,165, 18,200,184,255, 82, 83, 83, 17, 18, 18,130,171, 87,175,226, -200,145, 35,176,217,108,240,241,241,129,201,100, 66,171, 86,173, 48,112,224,192,124,163,239, 4, 66, 94,245,235,171,118,194, 89, - 12, 86,132, 57, 84,202,120, 99, 14,245,235,215,135,217,108,134, 82,169,132,209,104,196,155,111,190, 9, 0,184,127,255, 62,140, - 70, 35,130,131,131, 81,166, 76, 25,232,116, 58,168, 84,170, 44,225,249,220, 52,117, 58, 29,202,149, 43, 7,149, 74,133,119,222, -121, 7,231,206,157, 67,181,106,213, 16, 21, 21,229,108,121, 31, 59,118,204,169,153, 91,203, 51, 67,147, 7,128,202,149, 43,227, -225,195,135, 72, 77,125,210,248,187,120,241, 34,154, 55,111,142,161, 67,135,194,205,205, 13, 15, 31, 62,196,217,179,103,219,207, -157, 59,183,243,216, 15,230,246,255,113,205,248,157, 57,233, 57,162,227, 0,240,230,155,111,226,241,227,199,206,115,247,240,240, -128, 86,171,133, 90,173,118, 26,172,130,194,243, 60,246,236,217,147,107, 4,203, 97,182, 92,213, 60,121,242,164,211,172, 41,149, - 74,103,222,237,221,187, 23,238,238,238, 48, 24, 12,178,170, 47,147,201, 4, 15, 15, 15, 48, 12, 67,253,254,251,239,211,252,252, -252, 60, 87,174, 92, 73,169,213,106,172, 90,181, 10, 62, 62, 62,240,246,246,118, 86,224,133, 49,155, 47,125,105,146,209,157,230, -229,229, 5,139,197, 2,134, 97,156, 70,218, 97,176,104,154,118, 70, 7,180, 90, 45,170, 87,175,158,103, 36,203,161,217,160, 65, - 3,196,199,199, 67,169, 84,194, 96, 48, 56, 27, 43,106,181, 26, 42,149, 10,122,189, 30, 26,141, 6,165, 75,151,198,103,159,125, -134, 41, 83,166, 64,206,164,194,247,239,223,199,149, 43, 87,160, 86,171,225,239,239, 15,173, 86,139,219,183,111, 67,146, 36,212, -172, 89,211,153,110,185,136,162,136, 61,123,246, 96,201,146, 37,240,242,242, 66,187,118,237, 80,186,116,105,108,217,178, 5,146, - 36, 97,248,240,225, 78, 99, 40,183,120,246, 48, 61, 49,124, 52, 77,195,205,205, 13,106,181,250,255, 35,132,116,134, 97,101, 25, -176, 74, 22,117,234,212,113, 70,178,114,202, 75,154,122, 98, 38,107,215,172, 13,189, 94, 15,133, 66,129, 10, 21, 42,192,219,219, - 27, 12,195, 64,146, 36,168,149,106,103, 67, 80,231,174,195,152, 49, 99,156,145,172,167,168, 9, 9, 15, 32, 32,246,137,230,109, -150,133, 96,179,193,144,161,169,202, 56,141,220, 52,217, 52, 86, 7,228,108,176,194,195,195,145,144,144,144,165,251,206,241,211, -241,201,212, 37, 35,191, 18, 96, 89,136,162,136,113,227,198, 97,206,156, 57,120,255,253,247,241,246,219,111, 99,210,164, 73,248, -228,147, 79,178, 68,176, 10, 50,166,143,240,202, 70,175, 50,255,164,242,137, 6, 73, 46, 24,177,220,246,149,171,145,215,126, 82, - 30,251,187,124,243,231, 84, 82, 58, 75,141,210,165, 75, 67,173,126, 82, 16, 56, 6,165,187,185,185, 33, 38, 38,198, 89,128, 59, - 10,116,149, 74,149, 87,101, 43, 57,250,239, 75,149, 42, 5,181, 90,141, 13, 27, 54,160,102,205,154,248,251,239,191, 97, 52, 26, -193,178,172,179, 11,206,161,153, 95,192,197,241,139,151,151, 23, 88,150,197,241,227,199, 49,100,200, 16, 8,130,128, 11, 23, 46, - 96,213,170, 85,248,236,179,207, 80,171, 86, 45,175,101,203,150,197,124,246,217,103,235,191,232,247, 67,173, 5,235, 38, 70,230, - 86, 31, 56,126,241,243,243,131, 74,165,114, 22,254, 14,211,231, 74,229,146,155, 25,234,222,189, 59, 40,138,114, 22, 92,142,168, -134, 35, 31, 15, 30, 60,232,178,102,167, 78,157, 32, 73, 18,148, 74, 37, 66, 66, 66,156,219,250,245,235, 7,138,162,112,226,196, - 9, 89, 15,132, 32, 8,240,245,245,133, 36, 73,148,187,187,187,207,242,229,203,157, 70,138,162, 40,167, 73,112,164,151, 32, 15, -141, 70,243, 84,215, 96,246,238, 66,199, 39, 63,211,230, 48, 46,165, 74,149,114,222,163,142, 6,138,227, 30,114, 24, 96,185,221, -218, 14, 93, 55, 55, 55,208, 52,237,236,118, 83, 42,149,206, 49, 56,153, 77,161, 43, 6, 51, 32, 32,192,121,175,251,250,250,194, -100, 50, 57, 13,129, 70,163,129, 86,171,205, 55,130, 69,129,114, 22,111,162, 40,162, 94,189,122,208,104, 52, 56,115,230, 12, 0, -160,105,211,166,176,217,108, 79,142,195, 62,233,226,114,252,116,126, 63, 39, 93,154,114, 62, 67, 83,166, 76,129,183,183, 55, 38, - 77,154, 4, 0,248,249,231,159,145,144,144, 0,157,155,206,153,159,153, 27, 22, 57,154,141,158,144, 0,240, 88,243, 68,211,253, -204,153, 39, 47, 53,248,251, 67,109,179, 65,155,154,138,135, 73, 73, 48, 25, 13, 57,106,106, 53,218, 60,163,223, 22,139, 5, 49, - 49, 49, 72, 75, 75, 3,207,243,206, 23,143, 28, 31,149, 74,197,164,164,164, 88,250,182, 30, 3,150,101, 69,141, 70,163, 11, 9, - 9,177,230,103,176, 30, 62,124, 8,154,166,225,239,239,143, 83,167, 78, 33, 37, 37, 5,109,218,180,113, 62,243,153, 35,174, 4, -130,204,104,149,220,238, 53, 87,186, 18,115,219, 38, 87, 35,175,253, 36, 20,241, 88, 49, 54,167,104,206,152,254,115, 32,138, 34, - 12, 6,131,179,144,206,252,230,147,163, 32,118, 68,116,242, 51, 68, 17,230, 80,105,236, 7,115,157,223,171, 85,171, 22, 28, 83, - 0,244,238,221, 27, 28,199, 33, 61, 61,221,105,174, 50, 71,138,114,139,142, 56, 52, 57,142,131,221,110, 71, 98, 98, 34,154, 53, -107, 6, 65, 16,240,239,191,255, 66,173, 86, 99,237,218,181, 24, 52,104, 16, 82, 83, 83, 97, 48, 24, 74,127,240,193, 7, 55,182, -108,217,242, 19,128, 46,217,245,110, 36, 30,117,158,123,230,243,203,156, 38, 71,225,194,178, 44,120,158,119,142, 21,115,101, 42, - 8, 65, 16,176,119,239,222, 44,209,166,194, 70,176, 68, 81, 68, 72, 72, 72, 22,179,230, 96,231,206,157,112,119,119,207,119,236, - 68,132, 57, 20,125, 90,125, 1, 81, 20,161,211,233, 32, 8, 2, 37,138, 34, 98, 99, 99,177,115,231, 78, 48, 12, 3, 55, 55, 55, - 24, 12,134, 44,221,186,164, 69, 43,239,250, 40,149, 74,208, 52,237, 52, 40, 14, 51,229, 48,218,153, 43, 49,185,166,218, 96, 48, - 64,169, 84,102,105,228,168, 84, 42,208, 52,237, 28,236,238,184, 86,185, 26,130,108,208, 52,141,178,101,203,194,211,211, 19,119, -239,222,205, 18,185,186,116,233, 18, 36, 73,194, 27,111,188, 33,219, 96, 1, 79,198, 49,182,105,211, 6,175,189,246, 26,182,109, -219, 6, 81, 20, 49,108,216, 48,104,181, 90, 44, 92,184, 16, 60,207, 99,246,236,217, 46,229,169,227, 89,161,105, 58,203, 56, 43, -138,162,158,228, 35,195, 58,163, 46,178, 12,171,244,164, 91,214,104, 52, 66,169, 84,130,231,121,231,245, 97, 24,198,105, 98,245, -122,125,254,209,182,158, 16,177, 38,171,166,144, 81, 74, 23, 88, 19, 79,134, 2, 88, 44, 22,152,205,102, 76,159, 62, 61,223,253, - 27, 55,110, 44,235, 13,106,150,101, 81,161, 66, 5,172, 93,187, 22, 10,133, 2,127,255,253, 55,244,122, 61,222,123,239, 61,120, -122,122, 98,218,180,105,232,212,169,147, 51,106, 72, 32, 20, 99,196, 75,174,113,147, 27,125, 42,204,177, 10, 13,155, 91,161, 35, -138,162,115, 60,135,183,183, 55,226,227,227,225,233,233,233,124,192,230,204,153,131, 89,179,102, 57,191, 19, 23, 23, 39,171, 0, -215,104, 52,136,142,142,198,165, 75,151,208,178,101, 75,108,223,190, 29,237,219,183,119,110,203,220, 18,151,163,103,177, 88,144, -152,152,136,203,151, 47, 99,216,176, 97,184,122,245,170,211, 16, 81, 20,229,212,163,105, 26,237,219,183,103,254,248,227,143,183, -228,152, 32,199,185,103, 55, 87, 0, 16, 16, 16,128, 57,115,230, 56,243,162, 91,183,110,116, 90, 90,154,172,105, 27, 28,175,208, - 83, 20,229,172, 36, 28, 21,164,227,231,174, 93,187, 92,187, 51, 37,201,169,153,249,251, 20, 69, 97,192,128, 1, 96, 24, 70,214, - 84, 0,142,235,158, 17,109, 17, 37, 73,114,118,145,102,238,138,202,108, 58, 1,144,113, 25, 50,174, 79,118, 99,149,249,126,202, - 30,213,146,115,157, 4, 65,112, 70,152, 50,223, 59, 14, 28, 81, 17, 71, 37, 46,215, 8, 59,238, 75,133, 66,225,140, 92, 57,210, -230, 24,231,227,106, 37,203, 48, 12,140, 70, 35, 12, 6,131, 83,195, 17,185,114, 68, 94, 92,105, 84, 72,144,112,225,252, 5,136, -162,136,166, 77,155,130,166,105,156, 56,113, 2,162, 40,162,113,147,198, 96, 21,174,229,167, 67,115,206, 15,115,192,113, 28,126, -254,249,103, 40, 20, 10, 12, 27, 54, 12, 60,207, 99,254, 79,243,159,202, 79,185,154,190,129,213, 0,139, 5,106,139, 5, 80,171, -193,169,213,240,178,217, 32,165, 37,185,172,233, 48, 88,169,169,169,144, 36, 9,102,179, 25,191,255,254, 59, 22, 45, 90,132,179, -103,207,162,105,211,166,232,223,191, 63, 70,143, 30,237, 52,225,178, 42,129, 12, 99,175, 80, 40, 96, 54,155, 17, 18, 18,130,109, -219,182,161,126,253,250, 89,186, 7, 29,230,144, 64, 40,166,136,151,171,251,102,143, 46, 81,197,112,172,162, 55, 88,142, 74,193, - 81,112,115, 28,247, 84, 1,184, 96,193, 2,116,237,218, 21, 26,141, 6,101,202,148,145, 61, 30,167, 82,165, 74,136,142,142,198, - 59,239,188,131,244,244,116,152, 76, 38,152,205,230, 44,221, 25, 50,187, 8, 1, 60,121, 13, 62, 49, 49, 17,145,145,145, 80,169, - 84, 16, 69, 17,131, 7, 15,198,237,219,183,225,238,238,238,108,201,103,124,252, 5, 65, 96, 6,191, 55, 85,157, 91,180,201, 81, -121,229,102,174, 28, 70,240,240,225,195,206,110, 82,185, 5,153, 35, 95,119,239,222,157,103, 4,203,213,110, 72, 73,146,176,103, -207,158, 44, 26, 14, 28, 93,176,114,223, 76,148, 50,222,112, 82, 40, 20, 78,195,229,235,235, 11,165, 82,233,140,134, 20,213,120, -180, 87,201, 96,101,143, 94,101,198, 17, 25,112,197, 16,136,162,152,197, 88,101,191,190, 58,157,206, 57, 87,149, 43,215,137,162, - 40,196,196,196,224,209,163, 71,168, 81,163, 6, 88,150,197,229,203,151, 33, 73, 18, 26, 52,104, 80,160,110, 34,154,166, 17, 26, - 26,138,240,240,112, 12, 29, 58, 20, 90,173, 22, 63,253,244, 19,120,158,199,140, 25, 51,156,141,153,130, 96,177, 88,156,211, 7, - 56,138, 78,150,101, 65,209, 84,214,180,186, 80,164,198,198,198, 58, 13,165, 35, 79, 28,249,153, 57,173,174,152,141,216,216, 88, - 72, 42, 21, 60, 37, 9, 84, 30,154,185, 69,178, 28, 47, 12, 88,173, 86,231,148, 30, 86,171, 21,191,254,250, 43, 0,160, 97,195, -134, 0,128,149, 43, 87,226,227,143, 63,118,118,237,202, 53, 88,142, 55, 72,255,250,235, 47, 52,107,214, 12,245,234,213,115, 26, -175,204, 93,216, 4, 66, 49,153, 43, 73,166, 9,202,109,252,148, 92,141,188,246,163,114,208,207, 43, 98, 86,112,131, 5, 32,139, -193,200, 62,160,211,209,250, 42, 83,166, 12, 30, 61,122,148,101,210,208,188, 42,154,199,143, 31, 67,173, 86,195, 98,177, 56, 11, -200,204,198, 37,123,151, 99, 94,209, 17,138,162,144,154,154,138,196,196, 68,168, 84, 42,196,196,196,192,205,205, 13,155, 55,111, -206, 18, 21,114,124, 36, 73,186,199, 48,140, 87,126, 93,121, 14,147,145,147,185,114,164, 83,167,211,101, 25,156, 43,119,160,183, - 36, 73, 89, 94,125,206,252, 41, 72,247,160, 35, 31, 28,149,108,102,131,149,148,148,228,242, 88,169, 76, 21,183,228,248,219, 49, -254, 44,123, 23, 46,233, 34,116,225, 65,203,168,164,114,138,254, 56, 12,181, 43,230,133,162, 40,103,164, 55,167,123,198, 49,159, - 86,102,131, 37,231, 90, 57,246,201, 28,185,114,188,165, 86,208, 74,214, 49, 22,203, 17,117,211,106,181,206, 55,143, 93, 53,128, - 14,189, 6,111, 52,200,146,159, 77,222,106,242,116,126,102,122,155, 80,142, 9,252,246,251,111,179,228,231,162, 95, 22, 57,183, - 59,158,243,204,111,254,201,209, 76,123, 24, 13,149, 74, 5, 79,199, 53,178,166, 22, 88, 51,115, 4, 11, 0,108, 54, 27,126,250, -233, 39, 12, 25, 50,196,185,207,220,185,115, 33,138, 34,172,214, 39, 69, 92, 98, 98,162,172,232,234, 79, 63,253,132,132,132, 4, -240, 60,143,239,190,251, 46,139,185,114,245,197, 6, 2, 33, 99,206, 40, 42, 15,195, 67, 21, 48,170, 68, 21, 96, 27, 85, 72,141, - 34,157,166, 1, 20, 69,113,253,250,245, 83,100,111,101,127,246,217,103,184,121,243, 38,180, 90, 45, 60, 61, 61, 81,182,108, 89, - 60,126,252,216, 89, 80,228, 83,128,115, 3, 6, 12,112,106, 50, 12,131, 78,157, 58,225,238,221,187, 78,163,226,229,229,229,140, -142,200,236,134,224,166, 76,153,162, 0,158,116,189, 29, 56,112, 0,239,188,243, 14, 44, 22,203, 83, 70, 64,165, 82, 97,243,230, -205, 54,189, 94,127, 42, 31,131,193,245,238,221, 59, 71,151,163, 80, 40, 80,167, 78, 29,120,122,122, 66,167,211,185, 84,216, 58, -248, 47,108, 14,214,238, 74,133, 32, 72,178, 42, 58, 57,149,205,249,144,111,176,249, 32,247,148,230,184,113,227,178,102, 22,199, -229, 89, 80, 50, 12, 35,117,239,222,157,114, 28,219,199,199,199,217,157,147,221,172,202, 25, 39, 71,120, 82,201, 30, 62,124, 24, - 52, 77,195,100, 50,229, 88,113, 57, 12,112,110, 6, 44, 39, 67,214,183,111, 95,176, 44,139,154, 53,107,102, 49,251,142, 40,163, -135,135,135,211, 96,185,106,138, 2, 3, 3,161,211,233,112,229,202, 21,136,162,232,140, 92,157, 61,123,246, 73, 55, 92,227,198, - 46,231,193,192,129, 3,225,231,231,135,197,139, 23,103,137, 92,125,245,213, 87,224, 56, 14, 11, 23, 46,148,173,119,252,216,241, - 39,247,157,201,232, 52, 81, 12,203, 56,127,170, 84, 42, 80,160,156,145, 44, 57, 69,246,231, 67, 62,127,114,238, 53, 3,157,207, -117,230,136,186,135,135, 7,104,154,118, 70,157,228,180,165, 62, 31,242, 57, 85,148,154, 22,139, 5,146, 36, 57, 13,150,213,106, - 69,165, 74,149,240,211, 79, 63, 97,228,200,145,152, 53,107, 22,234,214,173, 11,155,205, 6,142,227,100,229,165,205,102, 67, 96, - 96, 32,126,253,245,215, 44, 17, 47,135, 41,206, 41,226, 74, 32, 16, 10, 97,176,230,253, 57,238,169,254,164,177, 31,204,149,154, - 53,107,134,186,117,235, 66,165, 82,193,215,215, 23, 54,155, 13,122,189, 30, 0,156,203, 96,228, 86,217,254,184,102,188, 50,187, - 94,239,222,189,145,144,144,144,235, 56,146,252, 76, 70,230,116,126,249,241, 66,159,245,235,215,223,104,212,168,145,217,211,211, -179,130, 66,161,200, 98, 4,204,102,243,181,159,127,254,185,156,183,183,119,215,188, 52, 23,172,155,152,107, 95,218,216, 15,230, - 74,223,124,243, 13,174, 93,187,230, 44, 40,181, 90,173,108, 51,164, 80, 40,238, 54,175, 29, 95, 57, 42,165, 45, 4, 49,239,138, -244,238,221,187, 15,143, 28, 57, 98,151,163,217,186, 65,114,229, 56,123,254,154,145,145,145,177,121,105,250,249,249,173,182,219, -237, 74,135,113,178,219,237,203, 28,145,204,156, 12, 22, 41,120,243,199,209,248, 72, 77, 77, 69,181,106,213,160, 82,169,242,141, -100,229,135,159,159, 31,128, 39, 83, 42,124,250,233,167, 48,153, 76,185, 70,178, 92, 25,224,238, 48, 67, 26,141, 38, 75,228,202, - 97, 4, 51, 77, 5,224, 18, 12,195, 56,167,246,224,121,222, 25,185,210,104, 52,206,183,224,228,118,103,233,220,158, 68,202,211, - 82,210, 80,173, 90, 53,168, 53,234, 66,231,103,217,242, 79,230,179,138,186, 27,133, 79, 62,249, 4, 62, 62, 62,185,230,103,230, - 46,188,188,242,116,231,142,157, 74, 0,232,212,185, 19,231,138,102,110, 13, 54,134, 97,118,255,245,215, 95,109, 74,151, 46,173, -109,214,172, 25, 36, 73,130,213,106,133, 36, 73,168, 88,177, 34,118,238,220,233, 52, 93, 28,199, 97,252,248,241, 2,207,243,143, - 55, 31,249, 41,207, 16,214,190, 13,131,176,253,168,242,169,243,201,126,110,153,231,224, 34, 16, 8,133, 48, 88,185, 54,201, 36, -201, 25,205,200,220,181, 87, 80,236,118,123,158,227, 72, 92,137,142,204, 94, 57, 58,110,252, 71, 63,190, 63,106,212,168, 77, 61, -122,244,184,221,165, 75, 23,202,100, 50,249,216,237,246,135,219,182,109,227,150, 44, 89,226,239,229,229, 53,120,238,234,177,255, - 21, 52,189,142, 86, 93,230, 87,224, 93,233, 34,228, 56,174, 89,208,128,168, 19, 86,235,146,128,188,246,211,104, 52, 15, 44, 22, - 75,227, 8,115,168, 40, 35, 15,155,189, 61, 48,250,132,197,146,183,166, 86,171,189,111,183,219,155,228,165,249,195,170, 47,236, -200, 52, 97,232,184, 15,231, 61, 53, 30,141,152,171,130, 71,178, 78,156, 56, 1,154,166,225,233,233,249,212,212, 12,142,153,179, - 93,137, 96, 42, 20, 10, 12, 31, 62, 28, 10,133, 2,117,235,214,125, 42,210,168, 82,169, 96, 50,153,156,230, 67,174,201,114, 44, - 99,211,176, 97, 67,231,216, 48, 0,206,200,149,171,131,220,105,154,134,209,104,132, 74,165,194,204,153, 51,157,227,249, 0, 96, -225,194,133,206,110,115, 87, 57,125,234,180,172, 72,150,252, 7, 28, 24,255,197,120, 89,145, 44, 87,138,205,241, 95,140,167, 10, -171,169,209,104,122,152,205,230, 3,241,241,241, 45, 46, 94,188,136, 13, 27, 54,228, 87, 46, 60,142,141,141,173,148,215, 62,106, -181,250, 78,215, 32,174, 98, 34,213,198,165,124,191,117,235,214, 29,242, 68, 19, 8, 69,104,176, 68, 81,228,250,244,233,163,200, -167, 96, 22, 33,115, 1,100, 65, 16,184,143, 62,250, 72,145, 79, 5, 34, 91, 15, 0,230,174, 30,187,111,252, 71, 63, 86,223,183, -111,223,188,191,255,254,187,133,205,102,211, 42,149, 74,131, 78,167, 59,225,229,229,245,110, 97,204,149,195, 35,117,233,210, 69, - 81,208,116,174, 61, 48, 47, 22, 64,165,162,188,128,197,161,153,249, 50, 13, 27, 54,140,201,252, 10,124,246,223,149, 74,165,100, - 52, 26,173,228, 81,146, 31,201,170, 82,165,138,211,164, 22,230,181,119,199,194,200,145,145,145,248,224,131, 15,224,233,233,153, -107,148, 68,174, 17, 58,121,242,164,236,168,148, 28,195,166, 82,169, 48,114,228, 72, 89,154,174,140,233,115, 37,146, 37, 23, 87, - 34, 89,114,113, 37,146,149, 23, 25, 11,180,183, 44,202,123,210,106,181, 54,105,246, 81,204, 73,139,229,231,138, 46,220,199,119, -210,211,211,155,144, 39,154, 64,112,209, 96,229,182, 40, 40, 0,236,222,221, 92, 89,144, 3,228,166,185,103, 79,193,244,100,152, -172, 7, 0,250, 2, 64, 94,111, 11, 22,132,156,186, 78, 95, 52,242,186,198, 57, 84,162, 94,106,181,218,221, 17, 89,201,220,133, -235,136,146, 24, 12,134,148, 78,131, 26, 18,131,229, 2,249,153,152,130,152,132,252, 76,140,156,183, 72, 11,187,206,102, 78,100, -159, 63,175, 56,112, 68,178,242,162,160,145,172, 92,119,161, 40,215, 52, 51, 69,178,242,210,164, 61,233,180,103,117, 31,134,133, -133,197, 2, 8, 32, 79, 36,129, 80, 60, 80,164, 79,157, 64, 32, 16, 8, 4, 2,161,104, 33,211,242, 18, 8, 4, 2,129, 64, 32, - 16,131, 69, 32, 16, 8, 4, 2,129, 64, 12, 22,129, 64, 32, 16, 8, 4,194, 43, 5,153,158,247, 5,229, 70,226,209, 23,254, 28, -170, 26,155,231,123, 30,174, 12,202, 39, 16, 8, 4, 2,161,196, 27,172,231, 89,129,103,175, 84,235,213,171,135,141,135, 23,190, - 16,134,225, 69, 51, 48,207, 67, 51,115, 62, 21, 71, 26, 9, 4, 2,129, 64, 40,177, 6,171,160,166,162, 32,149,101,126,198,228, -223,127,255, 69,139, 22, 45,176,108,235,244, 34,211,108,216,176, 33,214, 29,252,177,192,122,245,235,215,199,134, 67, 11, 74,188, -201,203,252,119, 65,141, 76,113,104, 22,183, 17, 44, 41, 56,206,203,145,103,185,157,103,126,219,139,123,223,226, 58,254,139,222, - 72, 33, 16, 8,132,103,106,176,138,178, 16,148,171,149,146,146, 82,164, 39, 94,216,233, 41, 10, 51,161,225,179, 50, 87, 69, 97, -100,138, 90, 51, 55, 61, 18,201, 42,122, 99, 90,144,231,180, 56, 52, 75,130,153, 42,170,123,139, 24,192, 87,151, 27,137, 71,201, -245, 39, 20,143,193, 42,234, 27,203, 85, 61,185,139,151, 62, 43, 74,218,252, 97,114,243,211, 21, 35, 83,148,154,114,180,138, 51, - 50, 82, 82,174, 75, 81, 24,214,204, 5,125,110,251,187, 26,101,204,174,153, 95,229, 82, 20,166,154, 64, 32, 16,136,193,122, 78, -102,192, 65,163, 70,141,176, 37,116, 49, 49, 88,207,176, 2,123,158,145,138,151, 41,154,149,189,139, 80,238,254,174, 26,162,204, -223, 43,168, 17,202,171,133, 94,212,221,194, 47,138, 33, 46,200,181, 33, 16, 8, 4,160,136,167,105, 40,202, 2,168, 65,131, 6, -184,145,120, 20, 55, 18,143,226,207,125,115, 74, 92,198,201, 93, 51,173, 36,154, 43, 57, 81,148,146, 96,242, 8,242,159,183,170, -198,230,206, 79, 97,158,199,226, 52, 17,142,231,217,241,121,145,204, 21,185,199, 9,228,250, 19,158,171,193, 42,236, 77, 90,191, -126,125,103,225,187, 62,120, 62,121, 16, 10,217,218, 46, 72, 69, 86, 28,154,132,103, 99,178,158,149, 81, 42,106,195,245, 34,165, -153, 64, 32, 16, 74,164,193,202,171,242,110,208,160, 65,145,188,149, 71,204, 21,114,237, 46,202, 79,175,168, 53, 9, 37,203,116, - 61,171,239, 19, 8, 4, 2, 65,166,193,146, 83,161, 22,166, 80,174, 87,175, 94,161, 34, 86,197, 93,241,231,164, 27, 22, 22,134, -201,159,253, 92,226, 42, 81, 57, 70, 40,167,239,230, 21,153, 42,168, 38,225,229, 51,110,228, 58, 19, 8, 4, 66, 17, 25,172,226, -142, 86, 52,104,208,160, 72, 38, 17,149,219,245,232,106, 23,100, 94,186,155, 55,111, 70,159, 86, 95,148, 24,147, 85, 20, 81,166, -226,208, 44, 73,102,153,240,108,201, 62,169, 44,185,174, 4, 2,129, 24, 44, 60,155, 55,201,138, 98, 62,169,252,204, 85, 65,186, - 30,229, 86, 6,225,225,225,168,106,108,142,110,111,125,254, 92, 77,150, 92, 35, 36,247,149,253,162,210, 36, 21,234,179,189, 7, - 72,132,137, 64, 32, 16, 74, 6, 84, 65,166, 27, 40,170,217,218, 27,190,209, 8,235, 14, 20,238, 13,193,226, 50, 87, 47, 74,165, -234, 74,218,139,106, 38,247,194,166,131, 80, 60,207, 87,113, 44,139, 84,152,251,198,213,251,160, 56, 39,114,116,101,134,122, 2, -225, 89,223,159,132,151, 19,182, 32, 55, 89, 81, 81, 88,115,149, 95, 58,139, 99, 41,155,146,252,144,149, 20,115,149,121, 91, 97, -242,234,101, 40,208,138, 99,169,156, 87,209, 64,150,132, 10,148, 84,176, 4, 2,161,216, 12,214,139, 82,248, 23, 71, 58,179,191, - 78, 94, 18, 11,218,220,210, 85,152,252, 40, 14,205,151,233, 94, 35,188, 92,215,145,220,119, 4, 2,225,153, 27, 44, 98,174, 94, -140,214,108, 97,150, 52, 41, 14,205,236,251,190,170, 51,101,203, 89,254,166, 36, 66, 81, 20, 34,204,161,164,164, 36,188,242,144, -232, 37,193,229,242, 51,183, 49, 88,197, 81,224,191,236,203,109,148,164,197,107,139,107, 76, 78,113, 44,154, 75, 6,201, 19, 8, - 4, 2,225,149, 49, 88, 4, 2,129, 64, 32, 16, 8,132,130, 65,147, 44, 32, 16, 8, 4, 2,129, 64, 32, 6,139, 64, 32, 16, 8, - 4, 2,129, 24, 44, 2,129, 64, 32, 16, 8,132, 87, 9,150,100,193,139,205,179,124, 89,192,213, 65,238, 47,242,132,173, 5,201, - 27, 2,129, 64, 32, 16, 28, 60,211,183, 8, 95, 85,170, 26,155, 23, 54, 82, 40,190,172,166,173, 4, 93,163,255,127, 40, 40,138, -242,247,247,111, 91,170, 84,169,209,162, 40,214,149, 36, 73, 47, 73, 82, 60, 77,211,151,226,227,227,151,220,191,127,255,128,148, -237,193,201, 41,207, 10,171,153,147,110, 97,141, 92,113,205,188, 95,212,233, 44, 46,205,236, 76,159, 62, 61,203,179,185,115,231, -206,118, 0, 38,102,252,249, 67,167, 78,157,246,231,245,253, 62,163, 90,228,248,108,110, 88, 20, 66, 3,192,149, 43, 87,168,127, -255,253,119,132, 86,171,237,200,178,172,159, 40,138, 84,122,122,250, 3,171,213,122,160, 82,165, 74,243,223,126,251,109, 81,142, -110, 85, 99,243, 44,105,157, 57,115,230, 27, 30, 30, 30,131,107,213,170, 85,245,214,173, 91,247,239,223,191,191,166,121,243,230, -251,143, 30, 61,218,206,223,223,255,131, 74,149, 42,249, 95,190,124,249, 70, 66, 66,194,178,201,147, 39,159,201, 73,179,176,105, -156, 58,117,170, 8, 2,129,144, 43, 44,169, 96, 9,185, 93,251, 64, 83, 16,237,231,231,215,218, 96, 48, 12,179, 88, 44, 45,180, - 90,237,177,228,228,228, 37,209,209,209,251, 34,204,161,194,203,120,254,245,234,213,243,123,227,141, 55, 78, 54,105,210,196,107, -210,164, 73,186,228,228,100, 92,188,120, 17, 81, 81, 81,122, 47, 47,175,138, 39, 78,156,104,121,246,236,217,184, 42, 85,170, 52, -186,121,243,102,252,243,210, 44,106,188,189, 63,201, 98,238,226,227,127,167, 74,164,230, 39,222, 18, 0,196,255, 30, 79,101,254, -189, 8,179, 98,226,160,217, 33,205, 69, 9,248,227,171,150, 0,176,191, 48, 98,183,111,223,254, 99,192,128, 1,239, 87,171, 86, -141, 21, 69, 17, 28,199,193, 98,177, 84,255,247,223,127,223, 62,112,224, 64, 67, 0,189, 93,213,156, 49, 99,198,187, 19, 38, 76, - 88, 62, 99,198, 12, 31,133, 66, 65,113, 28, 39,109,218,180,169,253,144, 33, 67,206,175, 94,189,186,110,239,222,189, 13, 25,255, -111, 60,117,234,212,119,102,204,152, 49,102,202,148, 41, 27,159,101, 26, 95,246,178,177, 32, 13,183,130, 54, 28,228,236, 95,216, - 58,187, 40,210, 73,144,105,176,178,119, 5, 5,154,130,104,131,193,208, 86,169, 84,126,158,158,158, 94, 79,171,213, 94, 0,176, -244,209,163, 71,187, 35,204,161, 5,106,197, 4,154,130,170, 2,248, 12, 64, 7, 0,254, 0,162, 1,236, 1,240, 91,132, 57,244, - 90, 65, 52, 91,214,234,251,154, 94,175,159, 64, 81, 84,227,212,212, 84,127,189, 94, 31, 45, 73,210,233,228,228,228,185, 71,174, -110, 12, 47,168, 38,203,178, 19, 40,138,106,204,113,156,191, 66,161,136, 6,112,218,102,179, 21, 88,243,237, 42, 94,157, 57,165, -118,174,157,214,148, 75,177,242, 74, 55, 53,203, 41, 68,203,125,198,150,246,229,177,255, 30,255,239,121,223, 20, 45,106,246, 9, -116,119,119, 31, 90,177, 98,197,254,222,222,222,246,247,222,123, 47,178, 75,151, 46,135,182,109,219,230,189, 99,199,142,101, 74, -165, 82,211,237,173,207, 55, 60,126,252,120, 73,232,181, 77, 87,139,226, 97, 46,170,130,226,253,150,163, 27,208, 52, 61,194,100, - 50,118, 49,155, 19,119,211, 52,253,203,218, 3,243, 78,202,249,110,141, 26, 53,170,120,123,123,135,207,153, 51,199,205,203,203, - 11,105,105,105,216,191,127, 63, 70,143, 30,141,233,211,167,131,166,105, 76,158, 60, 89,127,226,196, 9,253,188,121,243,110, 6, - 4, 4,188,118,251,246,237,200,103,173, 89, 28, 56,204, 79,118, 83, 84,210, 52,139, 27,138,162,252, 36, 0,123,206, 91, 32, 73, -146,169,176,122, 26,141,166,122,183,110,221,216,184,184, 56, 40, 20, 10,216,237,118,196,196,196,160,114,229,202,204,246,237,219, - 3, 11, 84,118, 6, 6, 14,254,254,251,239, 75,237,222,189,219,190,118,237, 90,107,155, 54,109,148, 31,127,252,177,123, 80, 80, - 80, 51,127,127,127,122,229,202,149,214,131, 7, 15,218,251,247,239,175,158, 53,107, 86,169,189,123,247,246, 1,176,241, 89,166, -241, 69, 49, 64,249,149, 73, 69, 21,108, 40,238,161, 8,133,153,163,176, 56, 52, 9,121, 24, 44, 7, 13,202,189, 91, 85,167,211, - 13, 55, 24, 12, 29, 3, 3, 3,239,125,252,241,199,167,109, 54,219,117,150,101,197, 53,107,214,140,225, 56,238,167,150,181,250, -238,179, 88, 44,139, 79,221,218, 42,171,162, 13, 52, 5, 81, 0, 70,209, 52, 61,162, 97,195,134, 59, 4, 65,184,113,232,208,161, -153,109,219,182,237, 46, 73,146, 20, 22, 22,182, 51,208, 20,180, 28,192, 60,185,230, 45,208, 20,196, 84,170, 84,105,154,191,191, -255,184, 95,127,253, 85, 29, 16, 16, 0,157, 78,135,228,228,228,242, 17, 17, 17,229, 70,141, 26,213,165, 67,131,143,127, 50, 26, -141,147,215, 7,207,231,228,106,250,251,251, 79,243,245,245, 29, 55,111,222, 60,117,213,170, 85,161,213,106,113,255,254,253,242, - 97, 97, 97,229, 22, 46, 92,216,165,205,107, 31,252,228,237,237, 45, 91,115,122,239,222,236,129, 11, 71,247, 26, 43,213,107,177, -116,249,239,148,175, 94, 15,150, 97,192,217,237,138,232,212,212,128,225, 67, 7,111,106, 82,205,239, 68, 96,227,192, 54,171, 86, -133,216,159,199, 13,209,161,193,199, 7,213,106,117,227,150, 45, 91, 70, 14, 28, 56, 48,172,126,253,250,143, 0,164, 2,176, 85, -175, 94, 61,102,210,164, 73,215,194,195,195, 13, 43, 86,172,104,116,240,224,193, 15,219,214,253, 48, 58, 50, 50,178,166,156,107, - 37,167, 5, 36,119, 77,190,156,140, 20,128,244, 70,141,223, 60, 52,105,210, 36,214,215,183,180,246,238,189, 59, 93,126,156,247, - 99,135,190,173,199,180, 95, 31, 60,255,159,252,142,173,213,106,255, 30, 63,126,188,219,155,111,190,137, 27, 55,110, 32, 52, 52, - 20,195,135, 15, 7, 0, 88,173, 86,104, 52, 26,216,237,118, 84,175, 94, 29,221,186,117,115, 95,183,110,221,223, 0,234, 63,107, -205,226,142, 98, 21, 69,164,169,184, 52, 51, 71,174,138, 33,122, 5, 73,146,110,110, 15,189, 89, 25,128, 29,192,181, 34,208, 19, - 1,224,232,209,163,136,141,141, 69, 92, 92, 28,226,226,226, 80,174, 92, 57,231, 54,151, 43,235, 27, 55,126,170, 95,191, 62,125, -238,220,185, 29,245,234,213,251,125,243,230,205,239, 37, 36, 36, 44, 25, 55,110,156,231,188,121,243, 30, 79,156, 56,241,243,215, - 95,127,125,107,231,206,157, 7,212,169, 83,167,243,165, 75,151, 22,118,237,218,245,153,166,241,121, 80,144,245, 60,243, 43,147, -138,106,141,208, 87,209,172,140, 31, 63,222,165, 71, 5, 0,245,172,210, 54,119,238,220,103,114,156, 92,199, 6,213,245,107, 31, -172, 80, 40,246,246,236,217, 83,115,251,246,237,249,103,206,156,217, 48,100,200,144, 59, 62, 62, 62,150,207, 62,251,236,206,233, -211,167, 55,220,185,115,103,110,175, 94,189,104,154,166,119,212,245,107,127, 76,230, 49, 71,232,116,186,119, 47, 93,186,244, 93, -149, 42, 85, 52,223,127,255,125,176,193, 96,144,126,254,249,231, 3,229,202,149, 51, 94,187,118,109,186, 78,167,123, 27,192, 56, -185, 39, 81,177, 98,197,169, 61,123,246, 28,119,252,248,113,117,221,186,117, 97, 48, 24,192, 48, 12, 76, 38, 19, 26, 53,106, 68, -133,134,134,170, 59,116,232, 48, 50, 49, 49, 81,118,174,250,251,251, 79,237,213,171,215,184,227,199,143,171, 95,123,237, 53, 88, - 44, 22, 68, 70, 70, 34, 53, 53, 21, 85,171, 86,165,150, 47, 95,174,110,216,176,225,200,248,248,120,217,154, 7,206,135,238,235, - 61,116,124,203, 29,187,247, 82,222, 62, 62,176,204,152,129,196,154, 53, 97,157, 56, 17,165, 74,149,194,246, 93,123,168,174, 3, - 71,188,117,227, 84, 68,240,243,122, 40,172, 86,235,219, 85,171, 86, 77, 8, 15, 15,215,157, 57,115, 38, 25, 64,108,134,193,226, - 0,164, 3, 72, 58,118,236,152,116,236,216, 49,119,157, 78, 23,195,113, 92,229, 10, 21, 42, 40,159,101, 26,251,183, 29, 87,183, - 81,227, 55, 15,109,221,246,119,143, 61,123,246,184,175,223,184,174, 75,189, 6,175,239, 22, 69,113,218,164, 47,191,164,191,159, - 53, 91,123,242,244, 49, 44,152,183, 80,247,209,128, 15, 33, 73,210, 48, 57,186, 62, 62, 62, 31, 46, 88,176,192,118,254,252,121, - 84,169, 82, 5, 22,139, 5,147, 39, 79,198,228,201,147, 33, 73, 18, 94,123,237, 53, 8,130,128,243,231,207, 99,235,214,173, 86, -150,101,251, 63, 15, 77,194,255,119, 21, 22, 3,247, 51,204, 85,170, 36, 73,183, 11, 21,181,184,113,163, 78,165, 74,149,124, 55, - 93,242, 64,130,162, 58, 4,214, 8, 81,105,130,224,245, 6,110, 40,223, 65,153, 50,101, 74,173, 95,191,190,137,171,186,223,124, -243,205,193,206,157, 59,119,156, 58,117,234,178, 78,157, 58, 9, 83,166, 76,249,107,226,196,137,159, 82, 20,245,191,137, 19, 39, - 14,153, 50,101,202, 95, 25,255, 95,209,181,107,215, 46,223,124,243, 77,200,179, 78, 35, 33,127, 51, 87,213,216, 92,118,163, 83, -206,190,114,247, 43, 46,205, 60,140,147,227, 83,212,148,248,200, 56,155, 71,171,166,140,191,191,255,157, 53,107,214,180,124,240, -224, 1,191,108,217,178,203,158,158,158,156,151,151,151,141, 97, 24,152,205,102,246,211, 79, 63,125,237,192,129, 3,173,220,221, -221,239, 37, 39, 39,151,149, 17, 21,170, 76,211,244,232,227,199,143,207,168, 81,163,134, 45, 54, 54,214,163, 69,139, 22, 9, 0, -208,160, 65,131,100,179,217,108,240,245,245,229,183,111,223,190,169, 77,155, 54,147, 3, 77, 65, 59,243,235, 46,108, 81,179, 79, -189,178,101,203,142,155, 57,115,166,154, 97,152, 28,247,225, 56, 14, 95,125,245,149,250,248,241,227,159,182,172,213,119,211,225, -203,235, 79,229,167,233,227,227, 51,238,187,239,190, 83,155,205,102, 40,149, 74,148, 47, 95, 30,247,238,221,195,221,187,119,145, -150,150, 6, 81, 20, 49,120,240, 96,245,245,235,215,101,105, 54,175,100,234,162,171, 80,183,197,176,225,163, 96,249,236, 51,216, - 86,174,132,253,206, 29, 96,226,147,241,180, 74,147, 9, 66,139, 22, 24,181,117, 43,246,237,217,211, 36,168,146,199,251,161,183, - 18, 54, 62,143,155, 98,230,204,153,255,158, 57,115, 38, 97,219,182,109,175, 45, 89,178,164,209,187,239,190,123,102,212,168, 81, - 49,179,103,207, 46,179,123,247,238, 6, 58,157,238, 81,173, 90,181,142,150, 43, 87, 46,125,221,186,117,131,139,162,165,232, 74, -139, 79, 20,197,207, 29, 70,170,119,223,238,216,180,254,127,186, 15, 63,250, 32,241,250,213,235,237,124, 74,249,170,251,126,208, - 27, 22, 75, 58,122,190,223, 13, 26,181,218,232,237,227,221, 89,206, 49,247,236,217,115,110,240,224,193,117, 71,140, 24,113,180, - 99,199,142, 30,157, 59,119,102, 30, 63,126,140,184,184, 56, 84,171, 86, 13,169,169,169, 88,186,116,169, 16, 26, 26,154,224,231, -231,215,120,235,214,173,183,158,135,230,171, 26,189,202, 45,138, 85,196, 17, 44, 33,163, 65,145, 66, 81,148, 13, 0,182,109,219, -166,122,252,248,113, 61, 79, 79,207,127,187,118,237,106,147,171,245,248,241,227, 95,215,174, 93,235,255,203, 9, 55, 28,179,119, -196,127,210,123, 16, 60, 68,148, 86,153, 81,221,237, 30,234,150,125,199,119,205,154, 53, 63, 1,104, 80,216,116, 79,153, 50,101, - 59,128,237,174,126,239, 89,164,177,122,245,234, 31,106, 52,154, 31, 1, 24, 36, 73, 74,181,219,237,147,182,158,248,117,121, 65, -245,190,235,211,119,108, 57,163,101, 54,184, 84, 22, 10,157, 16,157,164,253,246,203,245,235,167, 59,202, 24,185,209, 34, 87,202, -164,194, 68,160, 50,175,229,250,138, 69,178,178, 71,165,138, 58, 74, 69,149,244, 12,200,117,144, 59, 77,211,220,178,101,203, 54, -223,191,127, 95,251,211, 79, 63, 5, 85,170, 84,169, 67,157, 58,117,142,245,237,219, 55,114,198,140, 25,181,194,195,195,155,150, - 42, 85,234,124,143, 30, 61,126,241,243,243, 75,155, 55,111,222, 40, 25,199, 27,212,184,113,227, 77,126,126,126,226,253,251,247, - 85,118,187, 93,121,231,206, 29,181, 32, 8, 20,195, 48,146,197, 98, 81, 92,186,116, 73,201,243,188, 88,187,118,237,117, 23, 47, - 94,252, 12,192, 23,121, 9,234,116,186, 97,203,151, 47,215,228,102,174, 18, 19, 19, 17, 27, 27, 11,142,227, 48, 97,194, 4,205, -180,105,211, 70, 1,200,211, 12, 41, 20,138, 97,139, 22, 45,210, 88, 44, 22,168,213,106,112, 28,135,147, 39, 79,194,108, 54, 35, - 45, 45, 13,169,169,169, 78,147,213,187,119,111,205,202,149, 43,243,213,180, 41,181,223,255,249,251, 74,112, 28, 7,219,218,181, - 57,238, 99,223,191, 31,176, 90, 49,123,238,143,212,200,129, 61,191, 67, 30,227, 38,138, 19,138,162,164, 10, 21, 42, 36,143, 24, - 49, 34,228,241,227,199,234, 29, 59,118,212,109,220,184,113, 75,111,111,239,107,141, 26, 53,218,169,213,106, 45, 20, 69, 81,130, - 32, 40,158, 71,250,220,220,220, 58,249,148,242,213,103, 55, 82,106,181, 26,215,174, 93,197,250, 53,155,208,189, 87, 87,108,217, -248, 55, 90,181,121, 91,140,143,139,223, 41, 87,123,217,178,101,215, 27, 52,104, 80,102,231,206,157,253,246,237,219, 55,216, 98, -177,248,209, 52,173, 20, 69,209,174, 86,171, 31, 88,173,214, 95, 5, 65,216,176,117,235, 86,238,121,106, 18,163, 85,244,221,131, - 15, 30, 60, 96, 40,138, 50, 85, 41,173, 73,165,105,164, 30, 23, 69,207,223,127,255,125,128, 40,138,109, 43, 84,168,224,125,247, -238,221,248,223,126,251,109,159,155,155,219,223,239,191,255,126,170, 12,179, 70,241, 60,143,193,111,154, 49,180, 49, 13,158,231, - 97, 54,155, 17, 25, 25,137, 75,151, 46,225,244,233, 75, 5, 78,235, 31,127,252,241,177, 94,175,111,167, 80, 40, 42,240, 60, 79, -167,165,165, 69,218,237,246,131,141, 27, 55, 94, 94,179,102, 77,217,230,179, 56,211,232, 64,163,209,204,235,209,163,135,222,211, -211, 83, 8, 15, 15,215,132,133,133,205, 6, 80, 96,131,229,111,180,125, 63,110,238,110,214,221,179, 12,162,175,236, 96,150,253, -248,205, 20, 0,211, 75,114, 69,251,138,154,172,252,158, 79,185,247,105,102, 99,150,219,239,217,245,168,103,104,244, 92,143, 96, - 57,111,102,127,255,244,185,115,231,238, 77, 77, 77, 61,184,104,209,162, 70, 99,198,140, 25, 88,166, 76,153,195,189,122,245,154, -227,238,238,206, 41, 20, 46,213,177,111, 5, 6, 6,254,115,232,208, 33,111, 63, 63, 63,139, 36, 73,148,193, 96,224, 13, 6,131, - 96, 54,155,193,243,188,116,251,246,109,229,127,255,253,167,246,244,244, 20, 0, 52,205, 79, 80,161, 80, 52, 9, 8, 8,200,213, - 92,197,196,196, 32, 38, 38, 6, 73, 73, 73,208,235,245, 20, 77,211,141,100, 24,140, 38,149, 43, 87, 70, 66, 66, 2,202,151, 47, -143,208,208, 80,164,164,164,100, 49, 87,169,169,169,176,219,237, 40, 93,186, 52, 5, 32, 95, 77,129,209, 86,240,115,115,131,109, -242,100,216,111,220, 0,148, 74, 40, 43, 84, 0,236, 79,134, 90,217,239,220, 1, 84, 42,208, 67,134,160,242,208,161,224,161, 42, -251, 60,158, 8, 73,146, 40,100,154, 22,194,211,211,211, 58,112,224,192,211,151, 46, 93, 42,243,250,235,175,159,202, 22, 73,122, - 46, 33,218,148,148,148,157,145,145,119,123,173, 95,179,201,221, 97,164,186,247,232,138, 79, 62,249, 20,209, 81,209,248,228,179, -143, 65,211, 20,122,246,238,142,223,127, 91, 65,187, 90,152,135,133,133,113, 0,254,200,248, 20, 9,197,161, 89,164,102,165,136, -205, 79,113,105, 2,197,211, 61,184,119,239,222,134, 74,240, 63, 12, 45,203, 85,120,167, 71,185, 20,141,134, 77,237,177,203,214, -178, 74,149, 38,221,103,205,154,101, 8, 8, 8,208,159, 63,127, 62,249,219,111,191,245, 63,115,230, 12, 5, 96,117,126,154, 81, - 81, 81,255,155, 61,123,182,103,203,150, 45, 43,177, 44, 75,153,205,102,196,197,197, 33, 54, 54, 22,247,238,221,147,238,220,185, -243,159, 32, 8, 91, 92, 77,235,246,237,219,127,235,223,191,255, 7,181,106,213, 82, 72,146, 4,142,227,144,150,150, 86,239,244, -233,211,157,143, 29, 59,214,188,102,205,154,253,228,106, 69, 71, 71,111,153, 51,103,142,254,237,183,223,174,206,178, 44, 93, 84, -105,204, 86,158, 26,140, 70,163,120,224,192, 1,193,104, 52, 82, 20, 69,105,123, 6,141,208,109, 9, 93,156, 86, 16, 61, 90, 72, - 83, 24, 60,252,128, 7,235, 81,198,215, 23, 16, 44,244,247, 3, 63, 52,174,218,122, 55,177, 40,140,144,171,209,173,130,154,172, - 87, 8, 73,166,233, 41,238,104,217, 51, 29,231, 37,203, 96, 57,208,235,245,252,215, 95,127,125,252,200,145, 35,111, 54,111,222, -252,168,139,198,202, 65,173,238,221,187,111,236,208,161, 67, 2, 0, 40,149, 74,206,199,199,135, 51,155,205, 72, 77, 77, 5,207, -243,130,155,155, 91,170,159,159, 95,106,173, 90,181,146, 66, 66, 66,170,231, 39,152,158,158, 94, 94,171,213, 62,245,127,179,217, -140,216,216, 88, 60,120,240,192, 57,112,179, 98,197,138, 72, 77, 77, 45,147,175, 25, 18,132,242,106,181, 26, 49, 49, 49,120,252, -248,113, 22,115,229, 48, 88,118,187, 29,130, 32, 64,171,213,130,227,184,124, 53, 83,172,130,138,165, 40,164,109,217, 2,100, 12, -114,206,241, 46, 57,120, 16,218,166, 77,145,158,110,127, 94,147,192,210, 20, 69, 73, 52, 77, 75,130, 32,100, 55, 94,217,243,233, -185, 24, 44,154,166,151,204,153, 51,167, 87,191,126,125, 96,242, 48,161,125,135,182, 8, 62,120, 24,137,137, 73, 80,171,213,208, -104, 52,112, 55,186, 35,160, 98, 0,110,253,119, 91, 96, 24, 70,245, 65,187,241,105, 0,210,180, 90,173,223,178,173,211,249,156, -116, 59,119,238,172, 53, 24, 12,117, 0,100, 56,118,254,118,114,114,250,197, 29, 59,118,164,231,181, 45,175,180,118,233,210,197, - 79,167,211,141,165,104,170, 7, 0, 72,162,240, 87, 90,154,229,199,237,219,183, 63,200,107, 91, 73, 42, 29,159,193,212, 8, 46, - 49,179,225,204, 22,131, 7, 15, 62, 82, 20, 90, 59,118,236,104, 79,211,244, 47,141, 13,188, 97,184,191, 61,197, 71, 37,165, 92, - 93, 60, 34,245, 98,121,109,186,213,194,149,157,189,248, 59,111, 81,148, 48,121,242,228,152,222,189,123, 27,190,248,226,139,218, -239,191,255,126,219, 29, 59,118,108,232,220,185,115,174, 47,162,172, 90,181, 74,217,186,117,235,211, 38,147,169,242,154, 53,107, - 98,163,163,163, 61, 57,142,211,113, 28,103, 79, 79, 79,191,105,179,217,142,139,162, 24,252,201, 39,159,132,185,154,102,157, 78, -247,218,251,239,191,175,120,252,248,177,243,173,191,184,184, 56,212,175, 95,159, 9, 14, 14,174,233,138, 86,207,158, 61, 23,172, - 88,177,226,200,142, 29, 59,218,234,116,186, 6, 42,149,202, 87, 20, 69, 33, 53, 53,245,161,197, 98, 57, 87,208, 52,102,107,180, - 37,135,133,133,233, 13, 6, 3,238,222,189, 75, 73,146,148, 94, 80,115, 5, 0, 18,163,227,162, 46,111, 87,148,245, 43,131,235, -225,123, 1, 90, 43, 76, 90,245,103, 34, 74, 40,100,122,131, 92, 35, 78,197,101,228, 74, 12,178, 43,241,152,152, 24, 77, 74, 74, - 10, 43, 73, 18, 99,179,217, 88, 65, 16, 40,149, 74,229,106,151, 70,196,152, 49, 99,186, 61,124,248,112,127,159, 62,125,162, 29, - 70,232,225,195,135,120,244,232, 17,236,118, 59,238,223,191, 79, 31, 63,126,188,244,193,131, 7,219, 0,200,119, 60,138, 86,171, -141, 76, 78, 78,174,102, 50,153,178,152, 43, 71,228,202,241, 73, 73, 73,129, 70,163,129, 94,175,143,206, 79,147, 97,152,200, 7, - 15, 30, 84,227, 56, 14, 15, 31, 62,204,209, 92, 1,128, 74,165, 66,198,171,205,249,106,186,169, 25,155,157,231, 85,204,123,239, - 1, 84,238,247, 24, 21, 20,132,196,128, 0,104,180,202,231,214, 93, 68,211,180,172, 57,174,158,151,193, 90,123, 96,222,249,247, - 91,142,110,125,254,220,133, 51,223, 76,249,134,218,182,117, 59,148, 74, 37, 52, 26, 13, 2, 2, 2,144,152,152,136,113, 45, 38, - 99, 87,212, 90,104,181, 90,123,175, 94,189,246,125,244,209, 71, 76,155, 54,109, 84, 25,247, 60,159,131, 17,114,115,119,119,127, -111,245,234,213,106,154,166, 17, 19, 23,141,224,131, 7,107,239,219,119,176,106,175, 94,189, 14,184,187,187,183,205,105, 91,151, - 46, 93,182,110,223,190, 61, 37,167,116,190,247,222,123, 21, 12, 6,183,176, 63, 86,175,246,164, 41, 26,177,113, 15,112,232, 80, -240,168,189,123, 14,124,212,173, 91,183,174, 6,131,219,182,156,182,189,247,222,123, 13,182,110,221,122, 23,132, 28, 41, 42,115, -149, 17, 93,153,115,116, 92, 55, 3, 68, 33, 37,225,224,134,212,159,239,169, 82,119,157,187,120, 52,205, 98, 97, 42, 85,174, 92, -179, 66,133, 74,138,111,166, 76,140, 61,119,249,212,157, 71,143, 30,149, 30, 63,126,124,197,170, 85,171,250,221,190,125,187, 42, -128,203,121, 68, 89, 43, 14, 24, 48, 96,224,227,199,143,217,149, 43, 87,174,142,141,141, 61,250,213, 87, 95,253,151,197, 40,206, -156, 89,127,250,244,233,115, 0, 40, 0,248, 2,224, 41,138, 58, 48,101,202,148, 53,249, 24, 22,145,162, 40, 28, 57,114,228,169, -183,254, 68, 81,116,249,173,191,248,248,248,132,122,245,234,213,141,136,136,216, 54, 98,196,136,117,217,183,207,155, 55,175,115, -173, 90,181,250,156, 59,119,110,202,164, 73,147,110,186,170,111,179,217,198,159, 59,119,238, 71,138,162,220, 0,164,113, 28, 55, -169, 48,215,236, 94,162,106,210,242, 5,211,103,131, 75, 97,161,112,227,163,147, 53, 51, 95, 36, 51, 84,156, 81,178, 18, 24,185, - 42, 10, 67, 69,229, 18, 5,203,205,200,229,246,125,234, 89, 71,177,242, 52, 88,169,169,169,236,217,179,103,189, 31, 60,120,224, -230,227,227,147, 90,187,118,237, 4,138,162, 36, 0, 84, 98, 98,162, 62, 54, 54, 86,231,230,230,102, 45, 95,190,188,220,214,195, - 33,131,193,160, 60,115,230, 76,153,141, 27, 55,214,187,122,245,106,245, 14, 29, 58,116,183,219,237,176,219,237,136,142,142,174, -190,104,209, 34, 65,173, 86,199,209, 52,125, 6,128, 54, 63, 65,142,227, 78, 70, 68, 68, 4, 54,106,212,136, 2,128,132,132, 4, -167,169,202, 28,193,242,242,242, 66, 74, 74,138, 36,138,226,105, 25, 45,174,147,255,252,243, 79,224,107,175,189, 70,101,238, 18, -204,108,174, 60, 60, 60, 96, 48, 24,112,254,252,121, 9, 64,190,154, 12,159,126,231, 94, 82, 82, 53,255,239,191,135,210,104, 4, -236,118,103,183, 32, 0,103,119,161,244,240, 33,194,207,156,129, 66,178, 69, 61,175,214, 6,207,243,130,209,104,244, 72, 78, 78, - 78,182,217,108,182,236, 55, 47,203,178,180, 66,161,160,236,118,251,115,123,133,123,227,225,133, 97,253,218,140, 21, 68, 65,100, - 85, 42, 21, 84, 42, 21,212,106, 53,202,148, 41, 3,155,205,134, 37,167,231,163, 92, 57, 53,222,126,251,109,205,235,175,191,142, - 43, 87,174, 32,183, 85, 11, 28, 81,129,213,171, 87,171, 55,108, 94,203, 31, 62, 20,202, 83, 18, 37,181,108,217, 76,217,190, 99, -123,213,158,237,123,222,202,109,219,174,173,187,234, 0, 56,145,147,166, 70,163, 25,191,122,245,106,207, 13,155,215, 91, 66, 14, -133,166,166,165,167,233, 42, 85, 14,208, 86,168, 88,222,243,236, 63, 97, 71,107,212,174, 65,237,222,179, 27,155, 55,109, 78, 87, - 42,149,169,173, 90,191,109,120,167, 99, 59,227,238, 29,123,199, 2, 24,241,204, 35, 85,222,159, 72, 57,117,235, 21,102,106,132, -220, 52, 63,241,126,162,247,123,252, 19,173,236,127,231, 23, 81,203, 41, 13, 5,212, 76,133, 32,164,218,142,172, 79,253,228,154, -198,252, 88, 96,166,118,236,216,241,200,217,179,103, 67, 3, 42, 86, 53, 2,128,197, 34,120,234, 84, 94, 58,133, 66,161, 2,128, -242,229,203, 55,148, 36,233, 23, 0, 65,185,137,118,234,212,169, 73,169, 82,165, 94,223,179,103,207,185,216,216,216, 99,217,205, - 21, 0, 84,170, 84,105,218,165, 75,151,222, 81, 40, 20, 84,166,198,141, 4, 32, 87,131,117,229,202,149,106,229,203,151,247,218, -125,195,136, 68, 69,101,136,180, 25, 18,163,134,224, 81, 23,119, 21,181,224,235,123,213,235,207, 63,255,124,253,195, 15, 63, 60, - 39,231,250,204,158, 61,187,124,215,174, 93,119,252,246,219,111, 53, 58,116,232,160, 2,240,148,193,170, 94,189,122,247,131, 7, - 15,246,248,252,243,207, 95,155, 53,107, 86,215,175,190,250,234,134, 43,247,213,149, 43, 87, 86, 67, 70,151,170, 92, 86,239,141, -250, 17,192,143, 47,170,235,120,197,198, 96,229, 54, 46,138, 42,226,136, 83, 78,122,207,125, 16, 60,155, 71,116, 66, 51,123,246, -236,230, 53,106,212,184,223,188,121,243, 40,127,127,255,244, 12,243, 1,149, 74,197,233,245,122, 51,199,113,233, 15, 30, 60,240, - 9, 13, 13, 13,144, 36, 73, 45,227,120,191,133,133,133, 29, 90,178,100,201,119, 21, 42, 84,176,116,238,220,153,254,238,187,239, -182, 37, 36, 36, 72, 15, 31, 62,196,143, 63,254,216,173, 67,135, 14,219, 34, 34, 34,232, 43, 87,174, 76,199,147, 73, 72,243, 36, - 45, 45,237,151,225,195,135,247, 57,126,252,184,198,106,181, 62, 21,185,138,137,137, 1,203,178,240,244,244,196,226,197,139,173, -169,169,169,139,100,152,182, 95, 22, 44, 88,240,254,202,149, 43,181, 52, 77, 63,101,174,212,106, 53,124,125,125,145,148,148,132, -125,251,246, 89, 56,142,203, 87, 83,101, 79,159, 56,244,179, 79,182,239, 59,120, 8,202,142, 29, 97,223,186,245,105, 19, 22, 16, - 0, 59,199, 97,198,244, 41,146,194,158,250,229,243,184, 33, 24,134,249,247,163,143, 62,170, 63, 96,192,128,107,205,155, 55,135, -205,102,179,167,167,167,167, 73,146, 68,169, 84, 42, 70,165, 82,177,146, 36, 73,183,110,221,242,186,124,249,242,235, 20, 69, 93, -191,123,247,174,253,121,221,192,146, 36,193,199,199, 7, 94, 94, 94,240,243,243,131,183,183, 55,162,163,163,161,209,104,192,178, - 44, 66, 67, 67, 45,119,238,220, 81, 86,175, 94,157,201,187,113, 47, 84,184,116,229, 95,236,221,117, 64, 72, 72, 72,216, 4, 0, - 7, 14, 4,247, 30, 57,118,184,122,207,246, 93,166,220,182,237,221,129,138,185, 25, 44, 73, 18,222,187,120,229, 28,246,239,217, -111,137,139,123, 84,237,241,227,199, 15,198,140, 30,139,215, 95,175, 11,179,217, 76,221,188,121, 19, 33, 71,142, 32,226,122, 4, -227,233,233, 89,253,192,190,224, 27,163,198, 14,247,220,189, 99,119,247,231, 97,176,228, 24,155,162,210,250, 61, 62,158,250,196, -219, 91,114,152, 32,185,230,170, 24, 52, 39, 55, 95,176,125, 52,160,179, 3, 88,244,238,187, 29,143,101, 68,198, 75,205,159, 63, - 95, 5, 0, 63,206,251, 81, 33, 73,146,130,231,121,216,108, 54,124,251,237,183,154,207, 62,251,172, 84, 94,162,127,253,245, 87, -194,244,233,211,189, 7, 13, 26,212,225,240,225,195,218, 25, 51,102,236,101, 24,230,172, 82,169,140,167,105, 90,176,217,108,222, - 28,199, 29,247,241,241, 41,189,113,227,198, 42,237,218,181,211,203, 57,199,228,228,228,223,214,172, 89, 83,241,199, 35, 6,236, - 73,237,142,123, 82,111, 72,158, 18, 60,149,201,168,233, 22,137,150,254, 81,101,214,174, 93,187, 12,192, 27,249,105,205,154, 53, -171, 86,231,206,157,255,247,219,111,191, 5, 12, 30, 60,248,254,137, 19, 39,238,157, 56,113, 98, 90, 14,187, 62, 26, 56,112,224, -221, 85,171, 86, 85, 17, 4, 97,207,172, 89,179, 58,126,245,213, 87, 17, 37,181, 86, 47, 14,243, 66, 38,220,116,157,140,185,166, - 10, 18,113,146,187, 47,229,130, 30,245, 60, 76, 87,174, 6,139,231,249, 67,255,252,243, 79,253, 6, 13, 26,220,112,152,171,236, - 9,212,235,245, 54,138,162,164,171, 87,175,214, 17, 4, 33,223, 59, 48,194, 28,122, 55,208, 20, 52,247,173,183,222,250,224,143, - 63,254, 88,109, 48, 24, 30, 7, 7, 7,123,150, 41, 83,230, 81, 88, 88,152,145,166,233,164, 27, 55,110, 40, 14, 30, 60,216, 15, -192,207, 17,230,208,124, 91, 74, 33, 87, 54,252,219,190,222,128,121,163, 71,143, 30,247,205, 55,223,104, 56,142, 67, 98, 98, 34, -226,226,226,144,154,154, 10,111,111,111, 24, 12, 6, 28, 60,120,208,106,181, 90,151,231, 55,157,130, 67,179,117,157,254, 63,126, -247,221,119,227,134, 13, 27,166,225,121, 30, 60,207, 67, 20, 69,120,122,122,162, 76,153, 50, 72, 76, 76,196,218,181,107, 45,118, -187,253, 55, 57,154, 71,111,155,119, 53, 9,244, 13,254,225,251,153,173,199,174, 91, 7,240, 60,232, 79, 63,133,180,111, 31,168, -122,245, 32,197,196,192,198,113,152,252,245,151,160, 83, 98,143, 29,255,239,241, 95,207,227,161,184,127,255,126,195, 50,101,202, -244, 95,180,104,209,119,155, 54,109, 74,248,228,147, 79,174,212,168, 81, 3, 44,203, 50,238,238,238,170,219,183,111,235,194,195, -195, 95, 75, 75, 75, 43, 37,138,226,228, 7, 15, 30,252, 33,103,146,209,204, 3, 60,139,170, 64,163, 40, 42,253,194,133, 11,134, -122,245,234, 57,255,151,144,144,128, 10, 21, 42,128, 97, 24,220,187,119, 15,169,169,169,212,229,203,151, 91, 95,189,122,117, 55, - 77,211,105,200,161,123,240,137, 22,123,239,250,245, 27,213, 90,180, 14, 98, 14, 31, 62,210, 11, 0, 90,182,108,197,222,184,242, -159, 68, 81, 76,210,245,235, 55,140, 57,111,195,189, 92,211, 71, 51,187, 35, 34,110, 14, 10,106, 25,164, 14, 57, 20,122, 85, 20, - 69,105,225,162,249, 80,169, 84,184,114,249, 42,106,212,170, 14,139,197, 2, 15, 15, 15,201,203,219,235,106,203,214, 45,180,215, -175,222, 16, 41,138,222, 85,210, 10,203,226,152, 26,193, 97,136,138,194, 92, 21, 84,179, 83,167, 78,135, 1, 28,206,203,192, 3, - 64,122,122, 58,226,227,227, 17, 31, 31, 15,163,209, 8,138,162,242,212,230,121,254,252,196,137, 19,195,150, 46, 93,218,254,196, -137, 19,189,142, 28, 57,210, 33, 56, 56,216,114,247,238, 93,158,227, 56,201,207,207,143,109,214,172,153,166, 99,199,142,122,181, - 90, 77,127,253,245,215,241,223,125,247,157, 55,128, 71,249, 52, 40, 24, 81, 20, 49, 38, 40, 9, 19, 90,177,176, 90,109, 48, 39, -154, 17, 29, 21,133, 75,151, 46,225,196,137,203,144, 36, 73,214,218,167, 28,199, 45, 92,187,118,109, 37,149, 74, 69,173, 91,183, -174,252,186,117,235,242, 53,245,127,254,249,103,197, 13, 27, 54,252,114,228,200,145,182, 47,250, 90,132,174,150, 73,133, 49,102, -100, 28,214,171, 73,174, 6,235,234,163,195, 67, 2, 77, 65,181,231,206,157,251,195,202,149, 43,155, 76,154, 52,233, 80,227,198, -141, 31, 59, 12, 86, 84, 84,148,215,209,163, 71, 91,165,167,167,243,130, 32,124, 22, 97, 14, 61, 47,231,128, 17,230,208,165,129, -166, 32,244,237,219,119,138,191,191,255,246, 75,151, 46,181,233,214,173,219,186, 29, 59,118,180,229, 56,238,206,127,255,253, 55, - 21,192, 34, 0,139,229,158,196,157, 59,119,166, 7, 7, 7, 83,167, 79,159, 30, 59,102,204, 24,181,155,155, 27, 85,161, 66, 5, -196,197,197, 33, 33, 33, 65, 90,186,116,169,213,106,181, 46, 54, 26,141,147, 93, 48, 26,211, 1, 80,163, 70,141, 26,219,163, 71, - 15,117,153, 50,101, 40, 63, 63, 63,196,198,198,226,192,129, 3,210,193,131, 7,173, 28,199, 45,246,246,246,150,173, 57,224,237, - 46, 29,254, 88,255,219,174,224,131,193,109,102,207,153, 71, 85,249,252,115,104, 27, 53, 66,114,233,210, 8, 59,121, 18, 51,166, - 79,145,232,148,216,163, 13, 3,234,182,123, 94, 55, 68,134, 89,250,179, 99,195, 65,155,162,163,163,135,206,156, 57,243,235,128, -128,128,219, 60,207,179,219,183,111,111,144,144,144, 80, 89,146,164, 31,148, 74,229,162,253,231, 86, 91,159,103,129,198,243,124, -251, 61,123,246, 28,216,189,123,183, 62,151,104,156,149,231,249,142, 27, 14, 45, 56, 2, 64,151,151,150,217,108, 62,191,115,215, -158,138, 93,186,116, 80,125,249,229, 88, 22, 0,174, 94,185,142,157,219,247,216,210,210,210,142,239,220,181,167, 77, 78,219,204, -230,148, 92,239,123, 75,186,101,246,238,157,123,187,117,234,210,193, 52, 97,210, 24,237,147,239, 93,147,118,110,219,157,232,227, -227,211,159,179,243,107,187,117,239,106,172, 86, 61, 80, 13, 64,125,237,234,117,105,231,182,221,102,139,197,250,195,243,184,246, -143, 30,173,128,247, 39,219,243,236, 10,116,117,112,251,163, 71, 43,240,137,247,246, 28, 35, 74,153, 35, 77,159,120,123, 75,114, - 77,214,163, 21,143,240,201,118,239, 34,213,116, 37, 98,154,154,154, 10, 41,175,254,102, 0,147, 38, 77,138,156, 53,107,214,196, -176,176, 48,205,144, 33, 67,234,247,239,223,223,189, 85,171, 86,110,153,247, 73, 79, 79, 23,119,236,216,145,186,116,233,210, 71, - 71,143, 30, 61,251,241,199, 31,191, 7, 32,207,121,182, 30, 60,120,176,251,151, 95,126, 49, 6, 5, 5, 5, 10,130,128,248,248, -120,231, 24,172,123,247,238, 33, 50, 50,242,174, 32, 8, 59,228,156,139, 66,161, 24,222,191,127,255,157,171, 86,173,170, 48,120, -240,224,251, 27, 55,110,220, 1, 32, 49,135, 93,221,186,117,235,214, 57, 99,191, 72,133, 66, 49, 42,183, 5,160, 95,180,200, 85, -126,101, 82, 81, 46,149,147,253, 56,114,205, 87, 94, 11,180, 23,102,110, 46, 87, 33, 38,209,117,168,156,202,137,236,153, 31,104, - 10,106,198,178,236,247,229,202,149,139,143,137,137,105,160,213,106,207, 37, 38, 38,122, 9,130, 48, 41,194, 28, 26, 90,144, 3, - 7,154,130, 42, 0,248, 4, 64, 71, 0, 21, 1,220, 3,176, 11,192,202, 8,115,232,127, 5,209, 44,169,107, 17, 86, 53, 54,207, -210,162,108, 86,197,171,147,160,212,205,230, 24,117,197, 20, 11,175,114,211,176, 54, 86,176,220, 85,216,211,190, 57,122, 51,199, -181, 8,197,231, 85, 72, 53,173,210,221, 77,165, 82,141,151, 36,105, 52,128,165, 44,203,126,127,240,194, 26,115, 97,142, 81, 28, - 5, 90, 97, 53,171, 26,155,227,189,247,222, 51,170,245,234,186,140,196,148, 5, 0, 65, 16,162,172, 86,235,249,173, 91,183, 38, -230,181, 45,183, 99, 84, 53, 54, 71,151, 46, 93, 2,117,110,186, 73, 52,232,182, 0, 32,138,226,129,180,180,180,239,183,111,223, - 30,145,215,182,220,210, 94,216, 66, 46,175,194, 58, 47,242,123,123,208,213,116,202, 25, 47, 85, 28,154,217,153, 62,125,122,142, -209,158, 43, 87,174, 92,223,188,121,115, 21,199,223,118,187, 29, 73, 73, 73, 72, 72, 72, 64, 92, 92, 28,102,206,156,121,179, 73, -147, 38,213,250,140,106,145,227,179,185, 97, 81, 8, 13, 0,155, 55,111,102, 35, 34, 34,154,137,162,248,110,217,178,101,107,149, - 47, 95,190, 28, 77,211,244,131, 7, 15,226,239,223,191,127,135,227,184, 96,141, 70,179, 91, 16, 4,165,205,102,235,171, 86,171, -215, 78,156, 56, 49, 54,187,110, 85, 99,115,103, 90, 87,172, 88,209, 68,175,215,119,212,106,181, 53,149, 74,165, 7,207,243,116, - 74, 74, 74,130,205,102,187,194,243,252,174, 65,131, 6,229,216,101,157, 93,115,195,162, 16, 58,243, 24,172, 78,157, 58,237,121, -251,237,183,187,100,255,222,174, 93,187, 86,133,132,132,244,255,252,243,207,111,110,218,180,201, 57, 6,235, 69,143, 96, 17, 8, - 37,194, 96,101, 50, 69, 93, 41,138, 26, 43, 73,210,143, 17,230,208,109, 36,251,100, 87,254,116, 33, 37,158,105, 65,150,155, 89, - 40,234, 86, 93, 9,187, 70,207,197,184,184,170,251,170,164,179,184, 52,229, 26,172,115,231,206,237, 86,171,213,149, 40,138,162, -164, 39, 64, 16, 4,112, 28,247,100,178, 96,155,237, 86,243,230,205, 59,230,103,176, 10, 74, 94, 6,171,168, 52, 29,105,156, 61, -123,118,249,215, 94,123,237,187, 27, 55,110,236, 29, 53,106,212, 83,131,220,127,248,225,135,206,245,234,213,235, 31, 22, 22,246, -117,230,183, 8,137,193, 34, 16, 10, 96,176, 8, 4, 2,129, 64, 32, 16, 8, 5,135, 38, 89, 64, 32, 16, 8, 4, 2,129, 64, 12, - 22,129, 64, 32, 16, 8, 4, 2, 49, 88, 4, 2,129, 64, 32, 16, 8,196, 96, 17, 8, 4, 2,129, 64, 32, 16, 10, 76,174,243, 96, -145,153,107,139,142, 23,109,254,144, 87,241,218, 23,199,219,121, 37,241, 77, 58,242, 22,225,179,121, 86, 72,126, 18, 94, 53,178, -207,189, 75, 94,160,147, 49, 77, 67,237, 82,109, 58, 73,146, 52,149,162, 40,111,138,162, 18, 36, 73,250,238,210,195,131,127,189, -200, 39, 93,144, 57,147,106,151,106,211,137,162,168,169,146, 36,121, 75,146,148, 64, 81,212, 83,249,240, 44, 11,172,130, 20,236, -207,107,142, 41, 57,122,197, 85, 81,149,148, 10,216,113, 30,249,157,167,220, 57,187,138,122,223,226, 58,254,203,222, 24, 33, 16, - 8, 79, 25,172,178, 0,162,136,193,202, 37,130,213,170,118,191,217, 74,150, 30,111,231, 4,218,195,100,194,188, 31,127, 68,207, -158, 61,177,111,223,190,114, 67,134, 12,217,210,178, 86, 31, 40, 25, 70, 20, 37, 97,241,129,139, 27, 70,203, 61,216,215,159, 46, -142,180,217,108,229,114,219,206, 48, 76,124, 98, 98,162,223,178,173,211,249,146,144, 57,173,106,247,155,173, 96,168,241,118, 94, -160, 61, 60, 60, 48,111,222, 60,244,236,217, 19,123,247,238, 45, 55,100,200,144, 45,173,106,245,133, 82, 65,139,162,128,197,251, - 47,174, 29,253,188,211,155, 95,229, 84,144,153,127,139, 90, 51, 55,189, 87,104, 1,212, 34,189,222,121,229, 89, 65,204, 74,113, -104,150, 4, 51, 85, 84,247, 22, 49,128, 4, 66,190,140, 6, 48,142,100, 67, 46, 6, 75,201,210,227,255,252,249,123, 58, 57, 37, - 5,235,254,222,139, 58,117,234,224,242,229,203,168, 84,169, 18, 90, 52,109,136, 22, 13,170, 67,201, 48,244,180,159,215,142, 12, - 52, 5,141,145,179, 22, 29, 0,112, 28,231,247,191,255,253, 15, 52, 77, 67, 16, 4, 56,214,248,227, 56, 14, 41, 41, 41,248,226, -139, 47, 60, 50,210, 84, 32,131,213,170,205,146, 72,123, 30, 6,142,101, 21,241, 15,220,227,253,164,144, 16, 89,250, 44, 67,141, - 95,241,211, 15,116,106, 74, 42, 54,239,216,231,204,135,202,149, 43,163,109, 80, 19,116,110,221, 8,110, 58, 13, 61,100,210,220, -145,129,166,160, 49,146, 36, 61,183,137,247,228, 22,252,174, 24,153,162,212,148,163, 85,156,145,145,146,114, 93,138,194,176,102, - 94,118, 35,183,253, 93,157, 24, 54,187,102, 94,219, 93,189, 70,196,148, 16, 8, 4, 98,176, 50,176,115, 2, 93,218,219,132,245, -235,214,226,139,177, 95,163, 86,173, 90,144, 36, 9, 20, 69,225,235,111,166, 99,246, 55, 99,209,231,157,230,224, 69,145,170, 80, -161,130, 1, 57,175, 95,149, 35, 20, 69,225,206,157, 59, 72, 75, 75, 67,122,122, 58,210,211,211, 97,177, 88, 80,179,102, 77,228, -179,126,106,190,240, 28,231, 23,113,234, 47,168,149, 52,120, 65,130,157,151,192,241, 34,236,130,132,164, 52, 30,109,187,126,228, - 81,225,110, 5,217, 6,142,227, 5,218,219,228,142,181,171, 87, 97,212,248,169, 89,242, 97,226,215, 83,176, 96,198, 4,140, 29, -250, 33, 56, 94,112, 57, 31,158,135,185,122, 94,154,174,106,189, 76,209, 44, 87, 23,123,149,123,222,121,153,172,130, 26,161,188, -214,101,123,217,103,242,151,115,175,146, 8, 43,129, 64, 40,180,193, 2, 0,187,213,130, 26,229, 60,177, 98,241, 28,252, 38,209, - 16, 37, 9,144, 0, 73, 18, 16,224,173,131, 37, 61,181, 64,131,216, 68, 81,116, 46, 55,177, 98,197, 10, 36, 37, 37, 65, 16, 4, - 84,173, 90, 21, 0,152,212,212, 84, 75,223,214, 99, 28,187, 71,185,185,185, 85,116,165,203, 80,201, 82,216,115, 46, 25, 86,155, - 8, 59,255,255,159,183,107,186,129,166, 93, 55,112, 54,171, 5, 21, 60,181, 88,182,224,123, 80, 52, 11, 80, 0, 77, 81,160, 40, - 9,181, 43,120,193,110,181,148,216, 10,161,160, 6,166, 56, 52, 9,197, 99,222,242,139, 58, 21, 70,179,184,204,102,113, 54, 12, -138,243, 89, 34,145, 56, 2,129, 80, 36, 6,203,102, 73, 71, 57,147, 10,190, 58, 35,120, 94,192,101,174, 12,146, 82,211, 97,183, -115,184,111,183,227,214,185, 88, 52,110,220, 4, 28,199,153,191,232,247, 3, 20, 10,133,164, 84, 42,213, 51,151, 15,183,231,117, - 64, 65, 16, 96,183,219, 97,183,219,145,156,156,140,213,171, 87, 67,169, 84, 66, 20,197, 44,134, 77,146, 36,180,105,211,198, 27, -121,116, 25, 54,107,190,224, 58,128, 64,199,223, 52, 77,227,187, 69,127, 34,244,204,117,136, 34,192, 42, 85,232, 51, 96, 24,132, -140,104,150, 28, 38,124,188, 88,176, 91,211,105,165, 82,137, 38, 77,154, 98,209,159,219,160, 80,120, 64, 97, 82, 66,169, 84,192, - 77,171, 65,109,213, 3, 40, 88, 6,172,130,129,237, 57, 26, 44,185,173,109, 87, 42,134,226,208, 36, 60, 27,147,245,162, 69, 91, -114,122, 1,128,220, 87, 4, 2,225, 21, 48, 88,105,224, 56, 1, 28, 47,128,231,120, 36,165,166, 99,214,172,239,161,213,106, 65, - 81, 20, 68, 81, 4,207,243,206, 5, 80,187,116,233, 66, 81, 20,165, 5, 32,219, 96,137,162, 8,150,101,209,162, 69, 11, 88, 44, - 89,141,202,241,227,199, 65,211,249, 78,211, 85,225,250,201, 45,146, 73,207, 82,188, 40,129,231, 37,112, 2, 48, 94,148,144,110, -151,208,253,147,111,192,139, 34, 4, 81,132,157, 19, 1, 25, 30,203,252, 56,158,222,186,245,111,168, 84, 42,176, 44, 11,133, 66, - 1,138,162, 32, 73, 18,108, 54, 27, 38, 77,154, 4, 59, 45, 56,181,236,150,244,151,194, 92,229,183, 31, 49, 87, 47,150,233, 42, - 14,211, 70, 32, 16, 8,132,162, 48, 88,214,116,112, 28, 7,158,227,193,241, 2,236,118, 14, 90,173, 22, 29, 58,116, 64,122,250, -255,155, 10, 73,146,176,123,247,110, 8,130,128,168,168,168,124, 15,232, 24,212,206,113, 28, 36, 73,130, 36, 73, 88,181,106,149, -211,204, 40, 20, 10, 40,149, 74, 48, 12, 35,171, 11,210,160,101,168, 90,157,167, 33,221, 98,203,242,255, 19,155,103,128,166, 40, - 8,130, 4, 94,144, 96,229, 68, 72, 50, 28,150,221,110, 7,203,178,120,239,189,247, 96,181, 90,179,108, 59,114,228, 72,134,161, - 20, 64, 65, 2, 32,193,250,156, 12,150,156,200, 69,110,149,100, 78, 21,112, 94, 99,133, 10,170, 73, 32,198,141, 64, 32, 16,136, -193,202,132, 4, 9,182,180, 52,112,188,144, 17,197,226, 97,183, 63, 9, 76,205,154, 53, 11, 52, 77,103,137,240, 48, 12, 3,155, -205, 38,235,128, 22,139, 5, 1, 1, 1,176,217,108,168, 94,189, 58, 36, 73,194,199, 31,127,156,197,180, 1,192,201,147, 39,101, -233,241,130,132, 49,163,135,131,161, 41, 40, 88, 26, 74,150,134,130,165, 33,225, 73,212, 73, 16,159,124,108,156,188, 23,252,108, - 54, 27, 36, 73,194,239,191,255, 14,155,205, 6,149, 74,133,132,132, 4,112, 28, 7,138,162, 96,183,217,192,177, 60,104, 48, 79, -246, 79, 79,127,110, 23, 47,175, 55,187, 10, 26,129, 40, 14,205,130, 64,198,116,189, 28,100,190,103, 94,198,183, 68, 9, 4, 2, -193, 37,131, 5, 0,150,180,180,140,232, 21, 15,158, 19, 96,207, 48, 30,227,198,141,123,170, 59,111,255,254,253,178, 12, 22,203, -178, 15, 6, 15, 30,156,101, 26, 5, 81, 20,177,118,237, 90, 40,149, 74,103, 4, 75,161, 80,128,101, 89,121, 6, 75,132,244,227, -130,159, 41,139, 53,235,241,143,108,152,142,215,170, 87,196,155, 85,245,176,218, 69, 36,165,243, 16,197,252, 35, 88, 28,199, 1, - 0, 6, 12, 24,144,229, 60, 37, 73,194,137, 19, 39, 96,183,219,193, 43, 5,208,146, 4, 9, 18, 44,233,105,207, 61,170,144,215, - 91,100, 5,137, 66, 20,165, 38,233,106,122, 62,247, 0,129, 64, 32, 16, 74,170,193, 74, 79,133,157,123, 18,193,226,121, 30,118, -206, 14,158,231,241,211, 79, 63,101,233,206,115,124,228, 24,172, 89,191,143, 44,159,249,239,190,173,199, 88, 41,138, 82,244,233, -211,135,118,124,255,195, 15, 63,196,208,161, 67,101, 79,217,192,241, 18, 38,141, 31, 1,150, 97,160,204, 20,193, 2,104,236, 61, - 16,130,191,119,236,117,238,203,176,138,132,187, 21,238,230,249, 70,162,221,110, 7, 69, 81, 88,191,126, 61,236,118, 59, 24,134, - 65, 74, 74,202,147,238, 82,158,135, 61,163,123,147,202,200, 58,235,115, 54, 88,217, 13, 78, 81,189,102, 94, 88,205,162, 48, 86, - 47,131, 57,123, 81,167,168,200, 28,201, 44,234,244, 16,211, 77, 32, 16, 94, 89,131,165, 96,105,241,102,100, 12,237,107, 80,131, - 23,172,224, 5, 14,118,251, 19,131, 49,108,216, 48,103,119, 97,239,222,189, 49,112,224, 64,208, 52,237,140,252,184,138, 40,138, -210,161, 67,135, 64, 81, 20, 40,138, 2,195, 48,206,193,237,162, 40,130, 97,152, 60,191,207, 11, 18,102,253,176, 8, 86,251,147, -227,183,111,245, 22,186,191,219, 18,162, 4, 72,144,108,218, 20,163,113,255,185,129, 86,185,233,113, 24, 44,141, 70,131,255,253, -239,127, 88,187,118,173,115,219,225,195,135, 97,183,219,161,210, 25, 65, 67, 4, 32,224,122,100, 44, 88,134,150,238,222,189,155, - 92,146, 43,243,103,189, 76,142,171,243, 63,229, 87,201,191,168, 20,199, 82, 57, 47, 58, 37,245, 28,243,187,223,200,224,127, 2, -129, 80,104,131, 37, 8,226,226,223,118,255, 51,146, 19, 68,103, 24,169, 78,157, 58,176,217,108,216,190,125,187,115,240, 57,195, - 48, 80, 40, 20,160,105, 26, 54,155, 13, 10,133,194,213,227,223, 13, 10, 10, 10,204, 99,123,188, 66,161,200, 51,226,148,106, 19, -165, 67,107,191,161, 68, 9, 79, 76,149,244,100,248,185,157,151, 32,138, 18,104, 23, 19,100,183,219, 65,211, 52, 88,150,197,135, - 31,126,136,190,125,251, 2,120, 50, 65, 42,199,113,176, 88, 44,248,126,203,105,136,226,147, 49, 93, 10,134,150, 36, 81, 90, 46, -119, 54,251,231, 81, 65, 20,166, 66,123, 94,211, 0,144,238, 46, 98,166, 72,122, 9, 4,194, 75,103,176,130, 47,109, 24,141, 39, -235, 9, 57, 25,247,225, 60,241,189,247,222,163, 28,111, 1,218,108, 54,216,108, 54,231,239, 52, 77,227,238,221,187, 86, 87, 14, -190, 62,120,126,181, 66,166,255,238,155,173,122,231,105,208,162, 42,196,185,180,236,142, 70,167,151,170, 86, 13,164, 84, 42, 21, - 20, 10, 5, 84, 42, 21, 28,191, 43,149, 74,168, 53, 26,176,149, 43,107,246,111,157,110, 45,137, 23,180, 48, 75,154, 20,135,166, - 43,147, 75,190,204,149,155,156,229,111, 74, 34, 20, 69, 33,194, 28, 74, 74, 74, 2,129, 64, 40, 10,131,149, 19,106,181, 90,157, -146,146,162,125,240,224,193, 83,219,162,163,163, 1,192, 26, 97, 14,125,166,166,227,216,209, 47,170, 21,181,230, 45, 5,163, 54, -166,123,105,149, 74, 35,236,118,192,110, 7, 82, 82,158,108, 51, 26,141,136,164, 18,173, 37,213, 92,101, 55, 68, 69, 89,105, 23, -149,102, 78, 93,135,175,234,210, 43, 47,194,177, 10,178, 90,195,171,126, 29, 8, 4, 2, 1, 0,168,151,165, 0, 37, 16, 8, 4, - 2,129,240,156,204,196,255,191,152, 54, 15,192, 56,226, 45,224,242, 16, 37, 2,129, 64, 32, 16, 8, 4, 2, 49, 88, 4, 2,129, - 64, 32, 16, 8,196, 96, 17, 8, 4, 2,129, 64, 32,188,208,176, 36, 11, 94, 76, 94,134,129,225, 55, 22, 5,105,171,142, 10,205, -115,173, 33, 50, 56,153, 64, 32, 16, 8, 47,149,193,122,158, 21,248,251, 45, 71,251, 49, 12,211, 16,128,167, 32, 8,251, 0, 60, -216,120,120, 97,137,207,204,146,102, 6, 90,212,236,163, 9,185,178,193, 82,196,154,108,200,149, 13,124, 97, 52, 46,124, 22,196, - 68,104, 20, 71, 44,202,114, 77,195, 71,182,190,212,231,167,224,215,200,163, 72, 32, 16, 8,132,151,137, 92,223, 34,148,107,176, -250,183, 29, 23, 32,138,226, 71, 0,250, 75,146,116,110,195,161, 5, 61, 92, 77,196,128, 14, 95,106, 56,142, 27, 33, 73, 82, 99, -154, 81, 52,172, 82,187, 73,153,122,141,130, 96, 78,147,112,112,211,220, 91, 90,149,162, 22, 0,235,178,173,211,101,107,246,109, - 61,102, 23,128,142, 57,158, 52, 69, 77, 7, 48,109,221,193, 31,101,235,245,105,245, 69,123, 0, 95,102,252, 57, 27,192,190, 13, -135, 22, 60, 55,131,149,219,245,105, 81,179,143,187, 78,167,251,174,114,229,202,237,124,125,125, 43,221,189,123, 55,233,254,253, -251,255,164,167,167, 79, 9,185,178,225, 76, 1, 77,149, 94,167,211,205,168, 83,167,206, 59,238,238,238,149,111,220,184,241, 40, - 58, 58,250,180,205,102,155, 17,114,101,195, 57, 87,245,194,166,181,107,126, 62,189, 76,232,156,249,127, 96,242,196,207, 16,168, -184,221,254,205,105, 7,246,191, 8,166,181,160,215,105,114,207,160, 75, 0, 94,159,185, 37, 52, 71,115,154,223,246,204, 4,154, -130,220, 1, 24, 34,204,161,247,101,236,235, 11, 64, 23, 97, 14,189, 85,196,154,110, 17,230,208,155, 47,123, 35,133, 64, 32,200, - 52, 19,228, 45,194,167, 40, 80, 23, 97,183,183, 62,215,171, 84,170,158, 52, 77, 15,168,219,160, 73,179, 46,189, 6, 82, 60,165, -197,204,113,125, 93,142,108,188,223,114,116, 99,154, 85,172,254,112,196,247, 85,202, 87,174, 1,181,206, 29,169, 54, 10,177,137, - 2, 84,105, 34,252,235, 70, 84,186,123,102,115,115, 0, 7, 92,148,238,184,105,247,105, 60, 48, 11,160, 40,128,162, 0,154, 2, - 82, 44, 34,190,250,184,217, 84, 0,211, 92, 17,163,105,122,202,199,223, 31,110, 44, 74,192, 31, 95,181, 84, 2,216, 87,210, 46, -102,139,154,125,154, 55,108,216,112,243,152, 49, 99, 74,249,248,248, 64,173, 86, 67,165, 82, 25,205,102,115,187, 9, 19, 38,180, -110, 81,179,207, 55, 33, 87, 54,124,239,162,102,147,150, 45, 91,254,111,252,248,241,190, 20, 69,129,101, 89, 40,149, 74,223,132, -132,132,174, 19, 38, 76,120,183, 69,205, 62, 95,132, 92,217,240,179, 92,189,206,141, 62, 99,223,174,234,241, 81,185, 74, 26, 0, -128,187,187, 59,194,175, 27, 63,249,174,209,103,135,118,156, 94,206,191,196,207, 90,149,140,231,141, 47,224,246,204,168, 0,124, - 23,104, 10,250, 35,194, 28,122, 56, 15, 35, 84, 31,192, 7, 0,230,202,208, 84, 0,152, 25,104, 10, 90, 45, 67,179, 63,128, 57, -133,205,144,215,203,188, 19,153,158,158, 94, 14, 0,212,106,117,188,213,106,245,147, 36, 41,207,243, 47, 91,182,172, 93,146, 36, -151,150,140, 80, 42,149,154,253,231, 86, 23,201,220,117,196, 0, 18, 8, 5,103,252,248,241,174,236, 46, 1,160,138, 51, 61,115, -231,206, 45,214,243,149,109,176, 2, 77, 65, 84,131, 6, 13,130, 36, 73, 26, 80,177, 82,149,158,221,251, 13,214, 86,172, 90, 7, - 41,162, 59,110,199,139,248,247,240, 6, 0,216, 40,219,253, 52, 28,164, 50, 26,141,223, 86,172,241,230,216, 79, 71, 79,163, 47, -197,106,112,228,182, 0,150,182,131,161, 1, 91, 74, 28,146, 30, 92, 67,236,245, 35,233, 28,199,157, 40,200,201,221, 79,224,113, -244,154, 13, 12, 13,208, 52,192,208, 20,152, 2, 94, 46, 73,146,252, 36, 0,123,206, 91, 32, 73, 82,153, 18,104,174, 58,118,237, -218,117,219,136, 17, 35,216,180,180, 52,164,166,166,130,231,121, 8,130, 0,119,119,119, 44, 95,190,156,233,223,191,255,119, 45, -106,246, 57, 25,114,101, 67,168, 76,205, 54, 3, 7, 14,220,253,249,231,159, 43,174, 93,187, 6,187,221, 14,141, 70, 3,173, 86, - 11,173, 86,139,197,139, 23,179,159,124,242,201,194, 22, 53,251,132,135, 92,217,112, 42, 31, 99,213, 74,167,211,125,239,238,238, -254,122,233, 74, 53,152,122,101,239, 2, 0, 26,250, 43, 96, 75,123,189,155,123,116,130,229,253,150,163, 47, 90, 44,150,175,183, -159, 90,182,239,101, 41, 80, 38,247, 12,186, 8,160,118,198,159,150,201, 61,131,242,218,221, 50,185,103,208,127, 51,183,132, 86, -201,107,167, 8,115,104, 92,160, 41,104, 5,128,191, 2, 77, 65,189,115, 50, 68,129,166,160,183, 0,108, 5,208, 53,194, 28, 26, -157, 95, 58, 35,204,161,143, 2, 77, 65, 75, 1,108,171,227,219, 22, 54,155,205, 39,179,241,137, 48,135,242, 25,154,255, 3,208, - 41,194, 28, 26,227, 66,217, 97, 13, 11, 11, 67,147, 38, 77,112,242,228, 73, 52,105,210, 4, 71,142, 28, 81, 73,146,196, 91, 44, - 22,168,213,106, 40, 20, 10, 15, 57, 6, 83,146, 36,234,167,159,126,130, 82,169, 4, 77,211, 16, 4, 1,130, 32, 64, 20, 69, 72, -146,228,252,233,104, 61, 79,156, 56, 81, 32,213, 26,129,240,194,147,217,108,101, 55, 94,197,110,196,138,221, 96,213,171, 87,111, -119,135,110, 31,190,211, 56,168, 29,120,101, 41, 92,123, 72,225,222,109, 9, 44,195,131,134,136,255,206,108,149,104,154, 94, 45, - 55, 2,230,110, 52,158,236, 57,120,122,237, 74,181,155, 97,215,101, 14,162, 96, 67,252,213, 61, 72,140, 60,131,228,152, 43, 54, -222,154,114,145,162,168,163, 44,203,206,213,104, 52,105,127,238,115,189,193, 44, 73,128, 40, 73,160, 36, 10, 16, 51,174, 3, 93, -224,235,112,110,219,225, 43,229, 41,165, 30,146, 36,221, 40, 97,230,170,243,168, 81,163,182,118,232,208,129,142,143,143,135, 32, - 8,216,178,101, 11,194,195,195,225,239,239,143, 9, 19, 38,160, 74,149, 42,248,238,187,239,168, 30, 61,122,204, 3,208, 80,134, -102,135,111, 62,250,104,231,187,131, 6,209,103,207,158, 5,207,243, 56,120,240, 32, 46, 94,188,136,210,165, 75, 99,244,232,209, - 40, 95,190, 60,190,254,250,107,102,200,144, 33, 63, 2,104,146,155, 86,191, 54, 99, 31, 86,175, 94,221,115,224,192,129, 76,251, -246,237,145, 18,245, 15, 46,239, 24, 6, 0, 80, 51, 34, 6,125, 58,152,158, 48,183, 3,189,115,231,206,122,127,252,241,199,206, -126,109,198, 38,174, 59,248,163,247,203, 80, 42,204,220, 18, 90, 39,195,104, 89, 55,111, 12, 77, 0, 69,211,224,147, 56,112, 73, - 28, 56, 51, 7, 46,145, 3,103,230,250,141, 89, 80,157, 19, 68,227,204, 45,242, 86, 67,136, 48,135,134, 6,154,130,122, 3,216, -148,221,100,101, 50, 87, 31, 68,152, 67,101, 55, 78, 34,204,161,167, 2, 77, 65,221,237,118,251, 81,135,241,209,106,181,222, 0, -184, 64, 83, 16, 84, 42, 21,111,179,217, 58, 68,152, 67, 93,234,106, 14, 11, 11, 3, 0, 15,155,205,102, 5, 32,217,108, 54, 0, -128,221,177,106,188,139, 48, 12,131, 95,127,253, 21, 52, 77, 67,169, 84, 58,151,177,202,254,169, 87,175,158,203, 51,209, 7,154, -130,152,242,229,203, 79,100, 24,230, 19,155,205,230,175, 86,171,163, 5, 65,248,195,211,211,243,187,245,193,243, 57, 16, 8,132, -231, 1, 85,192,109, 47,134,193, 2,224,126, 63,221,132,148,219,222, 96,105, 17, 44, 67,129,101,158,156,219,163,123, 87, 96, 75, -125,116,108,221,193, 31,111,203, 17, 82,171,213, 63,244, 30, 58,171,182,224,245, 6,118,157,183,131, 75,186,135,123, 71,230, 73, -233,113, 17, 75, 41,138,250, 77,146,164,203, 20, 69,113,235,131,231, 23,234,228, 68, 9, 16, 50, 27, 43, 17,120,178, 20,116,129, -136,116, 94, 77,138,138, 46, 41, 23,176, 69,205, 62,221, 38, 77,154,244, 87,189,122,245,168,181,107,215,162,106,213,170,248,253, -247,223,165,200,200,200,239, 1,252,112,255,254,253,214,147, 38, 77,250,223,182,109,219, 80,171, 86, 45,248,250,250,214,205,111, -240,123,139,154,125,186,174, 25, 49,226,239, 58,111,189, 69,253,216,186, 53,252,222,127, 31,155, 66, 67,165, 59,119,238,204, 5, - 48, 47, 50, 50,178,205,236,217,179,215,253,246,219,111,104,216,176, 33, 60, 60, 60,234,183,168,217, 71, 17,114,101, 67,142, 21, -144, 82,169,244, 92,187,118, 45,163, 86,171,193, 48, 12, 60, 42, 52, 1,207,137, 56,189, 97, 18, 82,205,143,224, 89,241, 45, 40, -149, 74,188,251,238,187, 40, 87,174, 28, 59, 98,196, 8,211,203,217, 4, 19, 65,157,110, 27, 6,209,150,245, 38, 44,251,161, 79, - 65,244, 34,204,161,135, 51, 76,214,158, 64,147, 51, 50,246, 16,128, 54,195, 92,237, 43,128,230,241, 26, 94, 45, 5, 71,217, 96, -183,219,145, 41,202, 68, 1, 56,230,170,102,131, 6, 13, 80,191,126,125,172, 15,158,159,101, 65,116,149, 74,245, 64,163,209, 56, -186, 8, 19,120,158,151,213, 69,236, 88,100,158, 97, 24,212,175, 95, 31,157, 59,119, 70,181,106,213,112,255,254,125,132,132,132, - 32, 34, 34, 2, 74,165, 50,243,152, 16,217,230,170, 98,197,138, 39,218,182,109, 91,103,228,200,145,154,242,229,203,227,218,181, -107,229,151, 44, 89, 50,254,216,177, 99, 93,250,182, 30,243, 70, 88, 88, 24, 49, 89, 4, 66,225,163, 81,185,153, 35, 41,159, 8, -150,148,109, 63, 42,135,232, 22, 92,208, 47, 86,115, 38,219, 96, 49, 12,211,253,226,222,133, 97, 85, 57,148,241,173,213, 49,203, -249,222, 61,191, 23,162, 40,254, 33, 71,167,111,235, 49, 45,202, 86,125, 99,104,217,106,141,176,235,156, 13,201, 55,247, 33,246, -212, 47,145, 34,111,255, 24,192,225,194,154,170,140,136, 73, 15,147, 87,105, 88,237, 82,134,193,202,106,178, 94, 22, 90,215,233, -255,254,204,153, 51,215, 87,169, 82,133,218,180,105, 19, 4, 65,192,182,109,219,164,200,200,200, 33, 33, 87, 54, 44,207,216,237, -239,246,245, 6,164,209, 52,173, 99, 24, 6,165, 75,151,102, 99, 99, 99,253, 0,220,202, 69,179,215,198,137, 19, 55,189, 94,173, - 26,162,122,246, 68, 51, 65,192,239,107,214, 72,119, 4, 97, 80,200,149, 13,171, 50,118, 91,223,177,225,160,223, 88,150,213, 50, - 12,131,178,101,203, 42, 19, 18, 18,202, 2,184,147, 91, 90, 57,142,195,229,203,151,161,209,104,224,225,225,129,122, 3,246, 34, - 54, 34, 24,129,129,109,112,235, 94, 60,194,194,246,226,193,131, 7,112,119,119,127,121,139, 21, 62,153,203,177,252,176, 63,230, - 80, 64,227,159, 97,178, 84, 22,203, 19,191,156, 97, 88,222, 41,136,185,202,201,248, 48, 12, 83,232,211, 14, 11, 11,131,221,110, -151,128,172,222,228, 92,244,222,242, 0,240,248,154, 66, 90,190,124,121,213, 73, 11, 6,202, 50, 88,130, 32, 64,165, 82,161, 78, -157, 58, 24, 59,118, 44,174, 93,187,134, 99,199,142,161, 84,169, 82,104,223,190, 61, 88,150,197,189,123,247, 64,211,174, 77,243, -231,239,239, 63,177,117,235,214,181,126,250,233, 39,205,157, 59,119,112,237,218, 53,184,187,187,227,219,111,191,213, 78,152, 48, -161,202,169, 83,167,166, 0,248,134,212,143, 4, 66,161,204, 85,110,221,123, 57,109,203, 41, 90,149, 95,151, 96, 97,244,139, 20, -217, 37,144, 36, 73,111,153,188,203,148, 26,220,183, 29, 68, 9,224, 69,128, 23, 36,164,167,165, 34,230,218,225, 52,155,205,182, - 37, 63,141,110,111,125,174, 7,205,174, 28, 56, 98, 10,181,243, 95, 27, 44,143,238, 32,230,228,207,119, 37,129,123,141,162,168, -195,217,223,202, 43,168,185, 50,122,250,110,248,102,206, 10,156,185,101,131, 40,253,127, 36, 75, 16,159,252,254, 50,208,162,102, -159,202,237,218,181, 91, 87,169, 82, 37,106,211,166, 77,176, 90,173,136,140,140,148,194,195,195, 7,101, 50, 87,104, 81,179,207, -128, 46, 93,186,232, 20, 10, 5, 56,142,195,245,235,215, 83,114, 50, 66, 85,141,205,209,162,102,159, 26,159, 4, 5,109,124,173, - 92, 57,220,239,223, 31, 66, 82, 18,206,105,181,210, 63,130, 48, 48,147,185, 66,139,154,125, 6,119,239,222, 93,171, 84, 42, 1, - 0,255,253,247, 95, 74,230, 8, 95,174,119, 61, 69,193,106,181,226,254,253,251,248, 39,252, 10,206,222,102,240,203,178, 63,176, -105,211, 38, 68, 69, 69,129,166,105,200, 12, 98,188,152,112,137, 57,119,137,217, 31, 21, 58, 42,162, 86,171,161, 86,171, 29,166, -171, 80, 99,216,206, 69,239, 45,175,213,106,239, 1,128, 82,169,132, 70,163, 65,198, 11, 14, 9,144, 55, 8,255,169, 8, 86,175, - 94,189,114,221,222,164, 73, 19,219, 31,127,252, 33,123, 16,186, 40,138, 80,169, 84,232,220,185, 51,174, 94,189,138,168,168, 40, - 48, 12, 3,171,213, 10,171,213,138,250,245,235, 23, 40,130,165, 82,169, 62, 24, 57,114,164,238,246,237,219,120,244,232,145,243, -126, 20, 4, 1,159,125,246,153, 78,165, 82,245, 39,245, 35,129, 80, 36, 38, 75,122, 22, 6,231,121, 35, 43,130,213,175,205,216, - 30,238,158,165, 55, 76,250,254,119,246,239,243, 12, 18, 30, 92,135,229,225,117,148,171,223, 21,177, 17, 39, 32, 9,220,255,254, - 62,190, 36, 85, 70, 37, 48,177,251, 39,211, 42, 28,187,163,134,197,102,193,195, 19,243, 68,145,183,127, 4, 32,169, 40,230,185, -234,215,102,108, 15,119,143, 82, 27,190,254, 97, 5,187,227,146, 2,143,162,175,227,218,182,137, 16,236,105,217,119,221,237,138, -110,160, 41,136,170, 95,191,190, 95, 85, 63, 45,104,149, 26, 39, 1,223,128,128, 0,102,242,103, 63, 11, 51,151, 15,127, 46, 23, - 46,228,202,134,255, 90,212,236, 51,150,231,249, 5, 74,165, 18,209,209,209,226,185,115,231, 6,132, 92,217,176, 38,147, 17,234, -208,180,105,211,229, 95,125,245, 21, 0,224,192,129, 3,176, 88, 44,161, 33, 87, 54, 60, 21,199,187,145,120, 20, 33, 87, 54, 92, -109, 81,179,207, 84,207, 75,151,102,188,157,154,138,173, 94, 94,210,175, 28, 55, 32,228,202,134, 63, 51,105,182,110,223,190,253, -226, 47,190,248, 2, 20, 69,225,232,209,163, 72, 79, 79, 63,154,147,102, 86,131, 46,194,254,232, 60, 32,112, 80,120,213,130,135, -135, 7, 66, 66, 66,160, 82,169,160, 80, 40,160,229, 35,193, 74, 20,120, 69,149,151,217, 96,229,108,164,236,241, 92, 33, 95,105, -142,162, 40,202, 23,128, 0, 32,190, 40,146,106,179,217,252, 50,117, 13, 10, 60,207,235, 47,196,236, 47,208,155,120, 39, 79,158, - 84,173, 89,179, 70, 13,192,146, 91,132, 43, 37, 37, 69,182,158, 40,138, 80, 40, 20,168, 90,181, 42, 78,158, 60, 9,119,119,119, -184,185,185, 65,167,211, 65,173, 86,195,221,221, 29, 42,149, 10, 52, 77,187,100,178,236,118,123,121,127,127,127,220,184,113, 3, - 26,141,198,249, 81,169, 84,168, 86,173, 26,210,210,210,202,146,186,145, 64, 40, 52,212,171,114,162,249, 26, 44,135,185,250,114, -214,239,236,230,112, 26,230, 7,215,112,119,239, 87,188, 96, 79,123, 40,138, 92,153,132, 91,199, 0,224, 15,153,199,123,187,116, -192,107, 56,126,206, 14,203,181,191, 96, 79,184,181,144,166,233,163, 69,213, 45,232,238, 81,106,195, 87,179, 87,176,127,159,103, -241, 56,250, 58,254,219,245,165,192,219, 82, 63, 2,176,174,160,209,177, 15,218,141,175,218,180, 97,253,149,253,125,185,166, 93, -122, 85,130, 74,163,196,196,155,108,187,203, 39,238,156,177, 91,197,129,125, 90,125,113,177, 40, 34,111, 5, 52, 89, 11, 91,212, -236,163,246,245,245,157, 25, 27, 27,219, 63,228,202,134,141,153,140, 80,231,222,189,123,111, 29, 52,104, 16,237,230,230,134,248, -248,120, 76,157, 58, 53, 29,192,184,124, 52,191,109, 81,179,143, 34,216,203,107,242, 25, 65,248, 48,228,202,134,181,153, 13, 91, -203,247,134,236,152, 48,250, 35, 70,161, 80, 32, 62, 62, 30,211,166, 77, 75, 7,240, 69, 94,154,165,244,233, 84,240,194,183, 80, -202,131, 5, 69,179,184,117, 86, 66,165, 14,191,192,102,179, 65,165, 82,161,138,245, 79,148,246, 82,129,102, 21,120, 20,187, 29, - 21,141, 70,106,195,162, 32,186,207,168, 80,241,165,122,218,184, 68, 14, 82, 14,167,100,123, 88,216, 8, 86, 69, 60,233,127,115, - 43, 72,132,169, 56,201,152,138, 1, 0, 18, 86,173, 90,229,124, 35, 49,123,132, 43, 35,242, 38,175,249, 43, 73, 80,169, 84,184, -121,243, 38,124,124,124,192,243, 60,244,122,189,243,237,214,244,244,116,168, 84, 42, 48, 12,227,210, 32,119,149, 74, 21,121,237, -218,181,106, 30, 30, 30, 16, 4, 33,139,201,186,125,251, 54,244,122,125, 20,169, 27, 9,132, 66,155,171,220,198, 65, 81, 50,163, - 90,153,247,163, 10,121,236, 98,133,206,207,180, 24, 60,124, 55,140,159,249, 27,187,238, 44,141,135,247,174,226,206,158, 73,188, -200,165,247,161,105,186,193,189, 19,203,143,167,198, 94,219, 31, 30, 30,126, 68, 70, 20,136,166, 20,186,215, 25,181, 27, 36, 9, - 72,143, 58, 9,154,166,231,186, 58, 78, 34, 47,115,245,229,247,191,179,155,255,101, 17,123,239, 26,110,238,156, 88, 40,115, 53, -248,189,169,108,223,214, 99,190,172,161,182, 95, 90, 90,221,210,244,125, 95, 14,183,127,157,136,191,255, 55, 21,181, 27,235,208, -233, 83,125,189, 50,149, 20,225, 20, 69,125,219,237,173,207,149,221,222,250,252,121,153,172,217,177,177,177,181,179,153,171,110, - 31,124,240,193,214, 86,173, 90,209, 27, 54,108, 64,120,120, 56, 6, 14, 28, 40, 37, 36, 36, 12, 13,185,178, 33, 66,134,230,148, - 51,130, 80, 47,155,185,234,210,109,228,170, 93,131,135,126,193,244, 30,183, 26, 33,167,175, 97,228,200,145,210,163, 71,143, 6, -135, 92,217,144,235,132,147, 11, 6,247,185, 93,171, 42, 79,123,212,106,131,230,131,150,160,217,192,159,224,103,180,131, 79,250, - 15, 0,160,150,204,240,210,115, 8,250,116, 41,154, 13, 92,140, 82,141, 63, 68, 96, 53, 21,157,122, 93, 19,246,242, 69,176, 18, - 56,148,233,231, 13,159,142, 38, 24,223,212, 67, 27,160, 2,163,163, 33,164, 21,202, 72, 58, 12, 75,132, 57,212,154,221,188, 20, -148,140,113, 88,133,234, 26,204, 28, 9,147, 36, 9, 60,207,123,228,212,168, 11, 11, 11, 67, 72, 72,136,188, 18, 50, 35, 34,165, - 82,169,112,226,196, 9,184,185,185,193,221,221, 29, 58,157, 14, 58,157, 14, 90,173, 22,151, 46, 93,130, 82,169,116,121,252,152, -221,110, 95,179,120,241,226, 84,141, 70, 3,157, 78,231,156,146, 68,163,209, 96,222,188,121,169, 86,171,117, 45,169, 31, 9,132, - 34, 49, 89,153, 63,114,182,229,182, 31,100,236,151,155,254,243,139, 96,245,105,245, 69, 59,163,151,223,134,113, 51,127, 99, 87, -159,102,144,248,224, 10,226, 15, 79,230, 33, 88,251,172, 59,248,227, 95, 25,187, 53,147,123,160,122,245,234, 5, 86,172,217, 88, -247, 48, 73,132, 36,242, 16, 18,239,196, 2,116,236,186, 3,133,155,175,176, 79,171, 47,218, 25, 61,125, 55, 76,248,238,119,118, -125, 24, 11,115,244, 85, 68, 31,248, 90, 16,236,105, 5, 54, 87,125, 90,125,209, 94, 73, 83,107, 70,250,219,189, 58,121,243, 16, - 36, 96, 77,140, 2, 27,206,157, 10,229, 32, 89,106, 53,214,180,175,211, 92,141,214,125,116,236,173,139,246,201,103, 14, 96,180, -221, 42,245, 1,176,235, 57,153,172,107,153,140, 80,175, 65,131, 6,109,108,222,188, 57,181,111,223, 62, 8,130,128, 5, 11, 22, - 72,151, 47, 95, 30,156,185,171, 79,134,230,249, 76,154, 61,187,143, 92,181,169, 71,151,182,212,215,155, 57, 36, 83, 21,241,229, -204,159,165,244,200, 11, 67, 50,155,176,204, 84, 53, 54,199,244,233, 20, 93,235,181,118, 21,135,141,156, 12, 0,184,126,102, 15, -226, 46,237, 66,108, 34,133, 0, 99, 85, 0,255,194, 70,153, 16,159,170,198,209, 21,159,195, 51,176, 53,154,188,221, 13, 77,222, -126, 23,171,126, 95,248,250,143,173,131, 20,203,194,164, 23,250,173,173,204,243, 96,245, 30,189,168,126, 62,187,203,154, 7,235, - 89,112, 46,122,111,249, 64, 83,144, 21,128,177,160, 93,131, 57, 17, 30, 30,110,105, 88,190, 5, 14, 31, 62,108,203, 60, 47,150, -221,110,119, 41,130,165, 84, 42,113,239,222, 61, 4, 7, 7,227,205, 55,223,132,193, 96, 64,106,106, 42, 78,158, 60,137,152,152, - 24,103, 4,203, 21, 34, 35, 35,127, 80, 40, 20,157, 71,140, 24, 81,115,200,144, 33,250, 26, 53,106,224,206,157, 59,152, 63,127, -126,218,133, 11, 23,254,243,240,240,152, 65,234, 70, 2,225,133, 38,175, 55, 24,159,157,193,162,105,250,171, 38, 61,190, 97,255, - 56,197, 34, 33,234, 18, 18,143, 78,201,110,174, 92,165,126,173,215, 27,227,191, 88, 30, 66,210, 93, 72, 34, 31, 86, 20, 93,131, - 0, 38, 53,237,249, 13,251,231, 25, 22,137,209, 87, 16,119,248, 27, 65,176,167,125,180,225,208,130,117,133,208,252,230,240,184, - 30, 94, 16,121,156,223,181, 17, 11,238,169, 82,110, 91,168, 49,225,225,225, 43, 34,204,161, 82,159, 86, 95,244,191, 23,193, 45, -110,220, 81, 99,236,254, 94, 31,188,215,149,215,143, 27,244,231,215,207,203, 96,101, 50, 66,149,171, 84,169,178,190, 93,187,118, -212,182,109,219,144,146,146,130,248,248,120,233,159,127,254,201,252, 6,160,171,154, 53,252,106,117,222,248, 94,231,182,212, 55, - 91, 4, 92, 63,189, 9,110,169,103,145, 30,121,244,211,144, 43, 27, 86,228,246,189, 27,137, 71,209,103, 84,168, 56,127,112,223, -219, 83,191, 30, 30,160, 99, 57,148, 85,166,161, 94,231,239, 97,210,215,132,197,242,164,206, 22, 37, 9,247,221,250, 35,217, 18, - 5,211,145,141,216,185,127, 15,172,162, 10,233, 15,111, 92, 24, 27, 28,250,194,191, 18,159,121, 30, 44, 0,185,206,115,149,223, -118, 25, 20, 71,196,239, 44, 10,249,222,109,246,169, 24,234,215,175,159,209, 69,152,134, 75, 15, 15,226,255,127,186,172, 11,150, -101, 17, 23, 23,135,253,251,247,103,153,255,202, 49,174,207, 85,131, 21, 97, 14, 21, 2, 77, 65, 77, 5, 65,152, 56,122,244,232, - 79,210,210,210,252,245,122,125,180,221,110,255,195,100, 50,145,121,176, 8,132, 66, 82,220, 51,167,203,140,158, 61, 51,242, 26, -131,165, 61, 30, 30, 1, 90,253, 16,201,167,231, 20,214, 92, 1, 0, 98, 18, 44,184,175,230,193, 61,190, 14,138,162,194,139, 36, -183, 40,202,112, 44,252, 38, 88,205, 35, 36,158,250, 65, 16,185,244,194,154, 43, 0,224, 32,242,176,133,172,199,168, 8,109,188, - 8,188,182, 62,120,190,115,230,234, 13,135, 22,172,237, 25, 52,226,192,190, 63,197, 75,173,131,120,159,139,183,183,131,162, 40, -251,243,190,115, 50, 6,190,143,219,188,121,243, 2,171,213,138,135, 15, 31,138,103,207,158,253, 40,183, 40,147, 76,205,171, 45, -106,246,153,182, 96,101,247, 25, 55,111,113,208, 38,157,146, 44,119,183,201, 54,108,165,107, 68, 87, 41, 23,247,232,237,139, 81, - 30,205,119,199, 7,140,169, 18,127, 72, 63,116,104, 85,202,211,211, 19, 30, 30, 30,240,246,246, 70, 66, 66, 2,118,157,142, 22, - 31, 63, 46,159,214,176,116,228,188,250,101, 19,131, 27, 45,221,127,242, 37, 43, 91,174, 35,239,110,182,252,182,231,199, 95,197, -144,230,173,133, 53, 88,142,169, 24,138,180,132,164, 40,212,173, 91, 23, 20, 69, 57,187, 12,105,154,206,242, 97, 24, 6, 44,235, -250, 74, 96, 17,230, 80, 1,192,172,140, 15,129, 64, 32, 20,188,172,202,109, 16,232, 27,111,188,209, 68, 20,197,217, 0, 74, 1, - 24,179, 62,120,254,238,194, 28,168,127,219,113,254, 80, 24,206,171,202, 54,241,176,222, 11, 77,145,184,180, 90,235,131,231,223, - 43,236, 9,188,223,114,116,115,134, 97,102, 75,146,228, 45, 73,210,132, 13,135, 22,108, 45,172,166, 99, 97,103,154,166, 41, 81, - 20,191,223,112,104,193,190,188,246,203,248,115,118,120,120,248, 51, 91,226, 37,175,197,184, 91,212,236,243,101,217,178,101,103, - 70, 69, 69,101, 25,248, 94, 24, 90,212,236, 51, 67, 95,161,197,228,148, 59,135, 7, 30,185,186,113,117, 65,117,186, 54, 25, 50, -220,219,219,123, 94,131, 6, 13,148, 58,157,142,186,113,227,134,116,239,222, 61,123, 98, 98,226,184,109, 39,151, 62,181,166,225, -203,178,216,115,113, 19,104, 10,114,143, 48,135, 38, 21,177,166, 47,128, 88,185, 93,119, 69, 65,126,215,155,172, 69, 72, 32,148, - 80, 51, 65, 22,123,150,111,176,138,163, 98,248,176,253, 4, 3,199,113,173,121,158,223,191, 37,116,113,218,203,150,153,207,178, -240,205,239,250,180,168,217,167,122,230,177, 89, 69,100,178,234,102, 30,155, 85, 24,122, 6,141,152,163,213,106, 63, 79, 75, 75, - 91,242,215,209,159, 39,144, 10,141, 64, 32, 16,136,193,122, 37, 12, 22,129, 64, 32, 16, 8, 4, 2, 49, 88, 5,131, 38,183, 5, -129, 64, 32, 16, 8, 4, 2, 49, 88, 4, 2,129, 64, 32, 16, 8,196, 96, 17, 8, 4, 2,129, 64, 32,188, 74,176, 36, 11, 94,108, -158,213, 91,106,192,147,217,248, 35,204,242,151,175,121, 17, 6,168, 23, 85,254,145,193,248, 4, 2,129, 64, 32, 6,139,224, 50, -173,106,247,251,190, 79,159, 62, 95,116,108, 56,232,183,221,103, 87,140, 40,136,137,105, 81,179, 79, 61,131,193,240, 29,207,243, -111,240, 60,175,209,106,181,151,147,146,146, 22, 31,190,188,126, 77, 65,211, 85, 16,205,252,204, 80,113,164,147, 64, 32, 16, 8, -175, 22, 57,190, 69,120, 35,241, 40,162, 23,189, 67,221,180, 89,202, 72, 18,216,170,106, 77, 36, 0,233,131,223, 76,175, 1, 24, - 32, 73, 82, 27,138,162, 14, 2,248,227,240,229,245, 23, 10,147,128,150,181,250, 62, 23,205,151, 37,226,144, 61, 2, 19,104, 10, -170,236,230,230, 54, 88, 20,197,246, 52, 77, 31, 76, 73, 73, 89, 22, 97, 14,141, 40,204, 49,218,189,254,145,177, 93,187,118,230, - 95,127,253, 21,195,135, 15, 23,183,109,219, 86, 42,228,202,134, 71,249,125,207,145,199, 55, 18,143,162, 67,131,143, 71, 42, 20, -138, 89,147, 39, 79,214, 54,105,210,148,210,106,181,184,114,229, 50,166, 77,155,150, 18, 23, 23,119, 44, 34, 34,162,147, 43,209, - 49, 0, 89, 52,155, 54,125,162,121,249,114,254,154,153,175,125,246,252, 43, 10, 77, 7,189,122,109,129, 57,176,146, 18,160, 20, - 0, 32, 81, 18, 87,233,161,100,191,237, 67,229,251,191,102, 76, 61,251,212,169,164,128, 34, 16, 8, 47,136,153, 32,111, 17, 62, - 69,142, 17,172,232, 69,239, 80,215,173,233, 51, 0, 76, 2, 64,237,187,203, 31, 91, 31,236,109,168, 90,181, 42, 61,104,208,160, -251,130, 32, 36,113, 28, 87, 97,213,170, 85,171, 91,212,236, 35, 74,146,180,154,162,168,117,121, 85,186,209,139,222,113, 46,176, - 56,244, 79,131, 87,138,149,234, 75, 81,244,135,133,209,204,172, 59,104,165,187,167,149, 67, 95,154,166, 63, 42,172,230,139, 70, -160, 41,200,160,215,235,251,210, 52, 61,200,223,223,159,238,214,173, 91,184,167,167,231,225, 71,143, 30,185,109,221,186,117,125, -125,255,142, 0,176, 42, 53, 53,117, 77, 65, 38,163,180, 88, 44,129, 20, 69,225,222,189,123,160, 40,138, 22, 69,177, 22,128, 35, - 46, 24,222,186,122,189,254,251,191,119, 29,210,114,140, 59,204,130, 8,115, 42,224, 89,161, 33,214,110,217,229,246,233,135, 61, -131, 44, 22,203, 56, 0,178, 22,166,172,106,108,142,178,101,203,214,213,235,245,223, 31, 57,114, 68, 91,170, 84,169,255, 63, 86, -203,150,104,220,184,177, 91,215,174, 93, 11,165,233,227,227, 3, 71, 1,209,162, 69,139, 2,105,154, 3, 43, 43, 83,210,249,238, -148, 36,254, 32, 1, 18, 69, 81, 19,110,251, 40,118,164,164,243, 93,243,251,223,113,237,191, 91,129,122,207,100,117,128,103,217, -205, 76, 40,241,101,201, 91, 85,171, 86,221,122,235,214,173, 19,130, 32,188, 31, 97, 14,181, 22, 82,207, 31, 64, 0, 0,143,140, -242,255, 49,128, 59, 17,230,208, 2, 79, 50, 93,163,202,136,206,140,202,208, 15,144,234, 81, 20,101,151, 36,252, 99,183, 36,253, - 22,113,235,231, 83, 5,214,172, 58,170, 3,163,114,235, 15, 73,124,131,162,232,116, 80,226, 9, 91, 74,226,210,136, 59, 75, 46, -188,108,141,114,194,115,142, 96,253,246, 21,237,197, 75, 82,244,103,239, 15, 86, 48, 12, 77, 45,223,184, 28,205,123, 7,135, 86, -171,253,118, 18,128,199,187,119,239, 86,119,236,216, 49, 13,128,238,250,245,235,236,194,133, 11,117,135, 14, 29,170,147,158,158, -190, 54,228,202,134, 73,185, 24, 33,250,166,128, 59, 2,151, 94,206, 46,106,197, 4,245,232,195,159,126, 58,148, 47, 91,182,172, -189,160,154, 14,221, 35, 15,232,127,111,199,234,202, 85,170,251,209,185, 79, 62, 29,206,149, 45, 91,214, 6, 80,121,106, 70, 71, - 71, 79,122, 25, 46,160,193, 96,248,131,162,168,183, 91,180,104, 17,246,229,151, 95,158,105,212,168, 81, 34, 0,172, 89,179,198, -255,253,247,223,143, 82, 40, 20,210,153, 51,103,220,103,207,158,253,198,161, 67,135,234,115, 28,119,242,252,131,125,253,101, 22, -142,180,159,159,223,212,174, 93,187,126,253,201, 39,159, 48,129,129,129,184,113,227, 6, 86,173, 90, 37,254,245,215, 95,115, 30, - 60,120, 48, 57, 99,105,145, 60, 35, 88,213,171, 87,223, 59,113,226,196,118, 13, 91,246,164,102,110,186,139,196,180, 39, 75,186, -105,148, 12,134,181,113,131, 96,190,129,193,131, 7,167,237, 63,183, 90, 47,215, 12, 57, 52, 7, 12, 24,144,101,109, 41,142,227, - 16, 23, 23,135, 43, 87,174,228,170,153, 83, 4, 43,187,102,120,120, 56,108, 54,155,179,101,230,239,239,143,171, 87,175,202,210, -116,208,230,155,115,186,148, 52,251,213,177,253,222, 44, 7, 0, 63,174, 59,115,199,160, 83,214, 73, 78,179, 93,201,239,127,110, - 58, 69,237,131,223,190,254, 76, 38,227,125, 81, 13, 86,160, 41,136, 1,208, 77,161, 80,116,175, 82,165, 74,195, 27, 55,110,252, -203,243,252,255, 0,252, 47,194, 92,184,117, 44, 3, 77, 65,173,203,148, 41,243, 93,116,116,244,207, 17,230,208, 87,166,107,184, -107,147, 33,113, 7, 14, 28,240,222,178,101, 11,198,140, 25, 51, 32,194, 28,186,186,128,249,167, 0,208, 36,195, 84, 93,205, 48, - 86, 0,224, 9,160, 90, 70,227,254,120,132, 57, 84,118, 35, 34,176,226, 40, 35,171,209,108,104,247, 78,199,166,221,186,189,231, - 86,202,219, 19,230, 84, 43,174,221,184,139,173, 27, 86,154,239,220,190,185,197, 26,165, 26, 22, 97,158, 46,123,201,169,192, 10, -195, 77,172, 86,191,177,125,199, 78, 77, 58,116,232,168,247,240,240, 68,124,162, 5,215,111,220,198,142, 77,191, 37,196, 61,140, - 94,105,139, 58, 53, 49,194, 28, 42, 18,131, 69, 34, 88,174,146,231, 91,132, 18,164,140, 28,163,224,229,233, 30, 9,224, 38,128, - 4,163,209,152, 14, 32, 9,192,131,106,213,170,197, 44, 89,178,228,234,223,127,255,189,130,166,233, 79,243,210, 19, 5,155,223, -144,126, 35,160, 85, 73,212,215, 95, 77,188, 87,182,108,217, 91,133,213, 4, 0, 95,143,180,215,250,181,119,215,151,163,150, 52, -139, 56, 49,193, 39, 41, 62,226, 1, 36,209,108, 52,186, 23, 88,243, 69,129,227,184, 38,254,254,254,119,175, 94,189, 90, 38, 44, - 44,204,100, 78,229,148, 97, 55,146,188,174, 37,151, 9, 8,255, 47,217,219,156,202, 41,207,158, 61,107, 60,119,238, 92, 25,131, -193, 16, 37, 8,194,155,114,181, 75,151, 46, 61,253,135, 31,126,152,242,203, 47,191, 48,175,191,254, 58,212,106, 53,234,214,173, -139, 69,139, 22,209,139, 22, 45,250,210,207,207,111,182, 28, 29, 65, 16,234, 55,109,218,148, 18, 37, 9,137,105, 28,102, 15,170, -131, 31, 63,171, 11,139, 93,192,227, 4, 51, 36, 0, 10,133,130,110, 85,187, 95, 21,185,105,115,104,102,254,159,205,110, 71,108, -236, 67, 60,124, 24, 7, 20, 82,211,102,179,161, 81,163, 70,120,227,141, 55,144,144,144,128,184,184,130,105,190,192,145, 12,159, -234,158, 45, 86,118,108, 56,232, 74,117,207, 22,171, 3, 77, 65,165, 11,169,247, 70,160, 41,104,214,235,101,222, 57,248, 94,211, -161,247,234,149,237,112, 40,208, 20, 52, 59,208, 20,212,164,128,122, 42,157, 78,119,104,214,172, 89,155,255,253,247,223,222,193, -193,193, 1, 23, 46, 92,232, 49,103,206,156, 13,110,110,110,161,129,166, 32,109, 97,210, 27, 16, 16,176,226,244,233,211,111, 52, -109,218,244,247, 64, 83,144,186,168, 12, 97,160, 41,168, 94,160, 41,136, 42,161,215,188, 74,163, 70,141,188, 25,134, 65,219,182, -109, 1,160, 48,142,162, 41,128,152, 8,115,232,145, 8,115,104, 92,132, 57, 84,200,248,196, 69,152, 67,143, 2,136,116, 85,159, -213,104,182,206,252,126, 78,219,137, 99, 62,119,187, 28,195,224,207, 35, 15,177,239, 92, 10,210,216,210, 24, 48,106,134,169, 81, -139,206, 31,106,252,185, 57, 46,105,106,245,219,102,205,158,219,122,228,176,207,244, 87, 30, 42,241,215,201,199, 56,121,195, 2, - 94,235,143,158, 67,191,243,168, 90,187,217, 16,181,223,155,164,179,158, 80, 32,114,236, 34,172,172,210, 60,190,110, 77,159,179, -124,195,242,201, 20, 77, 73, 70,223,183,254, 77,227, 76,225, 30,162,168,164,105,218,215,203,203,203,158, 81, 9,197,238,222,189, -219,118,246,236, 89,255, 42, 85,170,248, 3,144,109, 89,207,159,251, 55,217,215, 47,224,118,217,178,101, 85, 69,161,217,166,201, -219,138,116,107, 58, 46, 92,187, 84,235,127, 63,215,171, 85,170, 92,163,255,188,170,124,122, 30,144, 18,109, 54,123,129,211, 89, -210, 97, 24,198,182, 98,197,138,245, 87,175, 94, 53, 44,253,109, 85,235,101,123, 34, 63, 48, 84,127,207, 83,144,116,234,208, 91, - 17, 54,243,149,173,143,173,183,118, 95,109,218,180,233,182, 10, 21, 42, 36,206,155, 55, 47,223, 1,234, 77,171,116,119, 99, 89, -182,218,187,239,190,251, 85,255,254,253,113,251,246,109,140, 28, 57, 50,245,194,133, 11,209,181,106,213, 42,189,104,209, 34, 67, -143, 30, 61, 16, 18, 18, 50,182, 69,205, 62, 91, 89,150,189,118,240,194, 26,115,174,198, 90, 20, 85, 58,157, 14,214,140,152, 2, - 47, 72, 0, 68, 72, 18, 96, 78, 76,132,213,254, 16, 42,149, 10,146, 36,213, 8, 52, 5,221,146, 51, 22,203,161,233,224,193,163, - 52, 92,191, 19,135,248,199,102, 36, 38, 37, 33,209,156, 12,165, 91, 41, 42, 45,237,118,129, 53, 57,142, 67,106,106, 42, 82, 82, - 82,192, 48, 12,226,227,227,161, 82,169,144,158,158, 30,152,209, 48,200,215,255,130,162,191,156,191,238, 31, 71,215,223, 36, 9, -146, 32,231,127,128,196, 61,175,123, 42,208, 20,164,246,241,241, 57,188,121,243,230,154, 85,171, 86,197,237,219,183,107,244,234, -213,171, 81,160, 41,168, 94,132, 57, 52,205, 69, 45, 29, 77,211, 63, 12, 28, 56,240,243,190,125,251, 82,129,129,129, 96, 89, 22, - 60,207,251,223,188,121,179,229,166, 77,155, 38,214,240,106,249,155, 32, 8, 99, 35,204,161, 41,114, 35,171, 42,149,106,227,178, -101,203,130, 26, 53,106,132,213,171, 87,227,159,127,254, 17,223,120,227, 13,250,195, 15, 63, 68,133, 10, 21, 26,127,248,225,135, -127, 5,154,130, 58,229, 21, 97,205, 67,191, 66,255,254,253,203, 49, 12,131,166, 77,155, 42, 79,156, 56, 81, 31,192,137, 66,230, -169,155,183,183,119, 72,203,150, 45,235, 31, 60,120, 48, 44,208, 20,212, 82,238,249,102,124,191,107,217,178,101,231,120,120,120, -120,200,253, 78, 82, 82, 82, 90,100,100,228,184, 8,115,232, 22,185,166,168, 97,195,134,224,121, 30, 30, 30, 30, 40, 91,182,108, -179, 64, 83,208, 88, 15, 15,143,110, 9, 9, 9, 99, 34,204,161,255,200, 76,107, 89, 0,116,132, 57,244, 70,198,223, 21, 1, 84, -207,216,124, 61,194, 28,122, 59,194, 28,122, 43,208, 20, 84, 38,208, 20, 84, 78, 78,119, 97,141,106, 99,251,116,239,221,191, 65, -253,186,213,233,239,183,220, 1,103,183,130,230,211,193, 50,128, 45, 93, 15, 73,242,196, 27, 45,122,168,175, 93, 56,253, 65, 96, -197,207,255,140,184,179,228,124,190,154, 85,191, 24,208,163,207, 71,245,106,213, 8,164,127,220,122, 23,177,183,194,197,187, 97, - 59, 31,107,221, 76,116,237,183,186,121,150,175, 92, 13,141, 58,124,164,127,112,251,226,144,192,242,159,175,145,146, 46,255, 71, - 44, 3,161,208, 6,171,204,168,189, 18, 22,189, 51,101,248, 6,227,231,219,254,222,116, 53, 33, 69,241, 79,108,236,195,114,177, -177, 15, 97, 50,153, 98, 40,138,178,254,248,227,143,234,235,215,175,151,214,104, 52, 80,171,213,224, 56,206,165, 1,202,130, 32, -208, 49, 49, 49,229, 99, 98, 98,138, 76,211, 77,231,134,183, 26, 52, 81, 52,172, 83, 31,151,111, 92, 9,252,247,224,199, 1,199, -207, 70, 77,190,126,253,134,111, 65, 53, 95, 20,106,212,168,145, 60,226,235,121, 71,151,133, 72,111, 45, 27,243,166,163,197,173, - 26, 52, 15, 30,141,106,250,132,122, 43, 30, 37,202,209,105, 95,111,192,156,238,221,187,127,161,209,104,216,126,253,250, 1, 0, -198,142, 29,155,114,249,242,229,192, 67,151,214,197, 52,175,214,203,103,244,232,209, 17,123,246,236, 49, 14, 28, 56,144, 74, 75, - 75, 59,161, 86,171,209,182,238,135,139, 15,156,255,115,100, 78,154,106,181,250, 74,120,120,120,227, 74,117, 91,194,219, 93,137, -201,171, 46, 65, 2,160, 83, 74,136,141,142, 68,244,245,147,168, 88,177,162, 70,173, 86,255,207,207,207, 79,250,160,221,248,153, -229,203,151,159, 57,115,249,240, 92, 43, 71,135,166,159,159, 31,108, 54, 27, 34,238,198,225,215,224,100,164, 88, 41, 72,146, 17, - 16,212,112,243, 42,175,166,185,228,245, 74,165,146,110, 95,111,192,183,119,238,220,249, 33,175, 10, 55,179,166, 66,161, 64,112, -112, 48, 82, 82, 82, 96,177, 88,144,144,144,128,243,231,207,163, 98,197,138,154,128,128,128,109,253,218,140, 21, 30, 62,124, 56, -227,254,253,251,223,231,102,222, 76, 17,255,217, 17, 88,233,127, 0,187, 3,120, 50,120, 61,224,161,104,191,237,195,228,251,191, -183,152,103, 51,254, 42, 23, 6,126,245,213, 87, 53, 61, 61, 61, 49,100,200, 16, 76,159, 62, 29, 83,166, 76,169, 58,100,200,144, -207, 0, 44,112,193, 20,104, 75,151, 46,125,102,209,162, 69, 53,222,122,235, 45,236,222,189, 27,235,215,175,199,173, 91,183,248, -128,128, 0,182, 81,163, 70,152, 58,117, 42,218,183,111,255,233,136, 17, 35,222, 14, 52, 5,213,151,105, 58, 62,158, 58,117,106, -215,102,205,154, 97,192,128, 1,214,144,144,144,222, 0,246, 31, 56,112,160,213,145, 35, 71,182,172, 93,187, 86, 59,107,214,172, -119,198,140, 25, 51, 20,192,207, 5, 56,255,247,130,130,130, 0, 0,205,154, 53,195,156, 57,115,218, 23,198, 96, 5,154,130, 84, -238,238,238, 59,255,248,227,143,250,175,191,254, 58,206,158, 61,219,160, 95,191,126, 59, 3, 77, 65,237, 34,204,161, 54, 57, 26, -254,254,254, 63, 28, 58,116,168,138, 94,175,151,125, 92,139,197,226,217,174, 93,187,217, 0,100, 27,172, 6, 13, 26, 96,207,158, - 61,232,220,185, 51,234,215,175, 95,101,220,184,113,243,186,117,235,134, 15, 63,252,240, 88,160, 41,168, 76,132, 57, 52, 94,134, - 78, 5, 0,215, 50,206,189, 60,128,170, 0,142,103,108,107, 20,104, 10, 66,132, 57,244, 54,128,235, 25,198, 43, 95,131,197, 42, -181, 67,123,116,235,170,223,116,244, 33, 56,155, 5, 21,188, 89, 84, 42, 91, 1,113,102, 43,238,221,191, 15,165,164,134, 86, 99, - 68,147,118,125,189,246,109, 92,248, 33,128,124, 13, 22,163,212,125,218,187,103, 23,253, 95, 39, 31, 34,234,202, 17,123,196,137, - 77,251,120,139,109,116, 82,252,173, 82, 9, 49,255,253,241,193,200,153,129, 21, 43, 86, 66,195, 22, 93,189, 14,111,253,173, 7, -128,217, 32, 16, 10,107,176, 28, 38, 43,101, 69,127, 81,111,170,100, 73, 72,249,255,251,223,108, 54,151,190,121,243,230,173, 11, - 23, 46,148, 86,169, 84, 16,197, 39,117, 11,207,243, 5, 54, 46, 69,173,169, 82,170, 80,183,250,107,244,217,139,103, 21, 23, 47, - 92, 44,173, 84,169,165,162, 72,103, 73,231, 70, 44, 85,134, 19, 37, 93,230,255, 73, 96,212,137, 40, 85,206, 27,143,226,242,250, -110, 85, 99,115, 80, 20, 69,247,237,219,119,196,175,191,254,202,198,196,196,192, 96, 48, 64, 20, 69,132,133,133,197, 30,186,180, - 46, 6, 0,142, 94,223, 28,247,118,141,247,163,236,118,187,177,114,229,202,232,215,175, 31,106,212,168, 1,171,213, 58,180,111, -235, 49, 99,215, 7,207,231,114,184,190,115,102,206,156,185,102,243,182,183,244, 3,155,169,145, 96,182,194,108, 78,196,245, 75, -103, 1,129,195,130,133, 11,161,213,104, 1,128,137,139,143,195,228,175,191,158,114,245,234,213,246, 0, 26,231,113,207,204,153, - 57,115,230,154,183,223,126, 91,159,152,152,136, 4,179, 25, 41, 86, 10, 63,124,242, 26, 20, 12,141,177,203,207,227,151, 37,191, -226,245, 0, 55,237,189,123,145, 24, 53,106,212, 36,133, 66,209, 2, 64, 27, 57,154,190,190,190, 96, 24, 6, 12,195, 32, 34, 34, - 2, 28,151, 53,157, 15,227, 30, 50,227,199,141,155, 17, 30, 30,222, 22, 64, 80, 78,122, 51,151,151, 2,144,106, 7, 96,111, 94, -173, 87, 64,173, 90,181,190,219,119,243,230,255, 14, 94, 88,243, 23, 0,167,129,106,243,218, 7, 61, 42, 85,170,212,245,234,213, -171, 83,142, 94,223,124,251,201,127,143,162,112, 61, 52, 5,199,219,219,123, 68,215,174, 93, 49,123,246,108,236,216,177, 99,140, -167,167,231,252,233,211,167,163, 76,153, 50,195, 3, 77, 65, 11, 35,204,161,114, 35,192,115, 23, 44, 88, 80,163, 70,141, 26,248, -232,163,143,108, 7, 15, 30,252, 10,192, 86, 0,119,143, 30, 61, 90,254,143, 63,254,232,188,113,227,198,217,139, 22, 45,210, 44, - 94,188,184, 74,143, 30, 61, 22, 2, 24,148,159,168,175,175,239, 23,125,251,246,197,188,121,243, 16, 18, 18,210, 35,194, 28,186, - 59, 99,211,158, 64, 83, 80,231, 89,179,102, 5, 79,158, 60, 25, 11, 22, 44, 24,237,170,193, 10, 52, 5,185,213,172, 89,243,155, -119,222,121, 7, 71,143, 30, 69,243,230,205,209,164, 73,147, 49,129,166,160,159,100,154,139,156,162,109, 27,150, 45, 91, 22, 84, -165, 74, 21,140, 31, 63, 30, 83,167, 78,197,210,165, 75,131, 6, 13, 26,180, 33,208, 20,212, 67, 78,116,213,211,211,211, 77,175, -215, 99,228,200,145,210,141, 27, 55, 18,242,117, 56, 21, 42,120, 44, 93,186,148,242,244,244, 52,202, 72, 35, 3,192, 88,182,108, -217,160,178,101,203,226,219,111,191,133,159,159, 31,166, 77,155,134, 82,165,254,143,189,179, 14,143,226,106,219,248, 61, 51,235, -187,217,100,227,134,203,226, 18,220,178,184, 21,119, 13,165, 72,129,226,222, 98,165, 80,172,104,241,150,226, 86,188,184,195,226, -238,129, 4, 39,196,109,163,235, 51,243,253, 65,194, 7,188, 36,217,141, 64,128,243,187,186, 87,201,236,236, 51,103,142,222,231, - 57,230,129,164,164, 36, 4, 4, 4, 8,207,158, 61,219, 29,192,159, 54,188,182, 43,128,116,111, 87, 89,188,153,107,149,148,246, -172,203, 0,234, 1,120,142, 55,243,178, 92,108,137, 71, 10,124, 9,185, 92,134, 8, 93, 60,104, 46, 21, 69,124,138,226,113,164, - 5,224, 25, 56,168, 92,161,139,139, 68,233,162,158,136, 43, 84, 12, 66,129,200,166,130, 35, 20, 82,197, 36, 18, 57, 98, 18,117, -120,121,235,112,162, 53, 53,177, 95,112,200,223,177, 0, 94,168,139, 12,253,241,254,197, 67,123, 27,214,156,160,122, 81, 68, 77, - 75,100,138,134, 68, 96, 17,236,197,174,157,220,173, 86, 43, 21, 31, 31, 47, 74, 73, 73, 17,178, 44, 75,243, 60,255,118, 46,129, -197, 98, 97,179, 19,128,188,176,249,161,167, 44,183,109,230, 87, 74,122,242, 97, 66, 26,169,239, 87, 76,172,209, 9, 81, 89,246, - 16, 31, 39,156, 67,176, 78,203,157, 63,127,126,217,176, 97,195, 48,103,206, 28, 60,122,244, 8, 52, 77,163,106,213,170, 94, 77, - 43, 5,120, 1,128,127,169, 46,238,149, 42, 85,242, 17,137, 68,120,242,228, 9, 54,108,216,128,169, 83,167,178, 23, 47, 94, 92, -245, 49,113, 5, 0,103, 2,183,237, 75, 74, 74,218,223,183,103,199,148,196,208,123,144,179,209, 48,199, 6, 65,138, 20, 12, 25, - 57, 1,207,162,121,220,126,158,140,219,207,147, 17,153, 34,197,184,201,191,211, 30, 30, 30,213,123, 54, 25,243, 67, 70, 97, 77, -183,217,182,109,219,148,155, 55,111, 66,167, 75, 0,207,243,176,178, 60, 44,236,251,237, 85,161, 66,133,176,118,237, 90,133,167, -167,103,205,198, 21,122,125,111,171,205,232,232,104, 60,127,254, 28, 22,139, 5, 35,198, 79,123, 47,156, 81,169, 50, 76,153,185, -128, 46, 86,172, 88,221,134,229,122,124,159, 89,220,250,151,234, 82,180,113,227,198,255,253,251,239,191,157,138, 21, 43,214,238, -195,239, 75,148, 40,209,113,231,206,157, 93, 27, 54,108,184,207,191, 84,151,162,159, 51, 15,169, 85,154,134,221,186,117, 43,205, -113, 28,118,236,216,113, 55, 88,167, 93,180,103,207,158,171, 70,163, 17,221,187,119, 47, 10,160,133,141,118,170,247,236,217,115, -136,191,191, 63, 70,142, 28,105, 62,113,226, 68,213, 96,157,118, 97,176, 78,251, 34, 88,167,229,131,117,218,151,193, 58,237,159, -103,207,158,173, 60,108,216, 48, 99,141, 26, 53,240,253,247,223,255,160, 86,105,252,179,176, 91,167, 71,143, 30,101, 56,142,195, -182,109,219,238,188, 35,174, 0, 0,193, 58,237,169,157, 59,119, 94, 54,153, 76,232,213,171, 87, 49,181, 74,211,200,142,119, 23, - 73, 36,146, 29, 51,102,204, 80,133,134,134, 34, 32, 32,192,248,232,209, 35,252,250,235,175, 50, 39, 39,167, 67,106,149,198,193, -222,248,100, 24,102,245,146, 37, 75,218,215,172, 89, 19,253,251,247, 55,109,217,178,101,120,255,254,253, 77,117,235,214,197,162, - 69,139,218, 51, 12,179,218, 30,123,175, 95,191,214,237,212, 46,117,205,234, 19, 18, 18, 18,105,227, 59,171,220,221,221,239,250, -251,251,199, 84,175, 94,189, 56, 0,220,184,113, 35,122,221,186,117,188,135,135, 7,246,236,217,131, 5, 11, 22,160, 81,163, 70, -112,116,116,236,110, 99, 48,121,252,255, 52, 12, 62,131,239, 63,188, 47,243,134,138,230,169,132, 84, 43,132, 2, 26, 2,112, 8, -143, 55,130,231, 1,161,144,134,144,166, 64,131,133,139,131, 16, 34,161, 0, 60, 56,155,246,119,164, 41,138,210,165, 88, 33, 96, - 40,188,153,159, 77,191, 19, 22, 43, 47, 17, 11, 40, 87,165, 16, 82,169, 4,160, 32, 1,129,144, 91, 30,172,183, 37,129,231,217, -216,216, 88,241,139, 23, 47, 20, 38,147,137, 41, 84,168, 80, 10,195, 48,188,213,106,101,226,226,226,164, 66,161, 16,238,238,238, - 6,150,101,237,242, 12,197,197,197,139, 94,134, 60, 82,230,166,205, 12, 4, 28, 19, 23, 23, 39,207, 77,155,249, 13,179,217, 76, -223,185,115,199,249,121, 72,132,139,151,168,234,165, 1, 11,175,212,101, 57, 74, 74,129, 53, 74, 83,131,206, 70, 70, 93,151,152, - 21, 34,167, 2, 5, 10, 36,101,101,235,228,189,205,227, 90, 84,233, 59, 83,175,215,151, 52, 24, 12, 87,170, 85,171, 70, 47, 88, -176, 64, 49,124,248,240,224, 70,229,123,134, 87,174, 92,217,123,241,226,197, 14, 0,176,126,253,122,254,204,153, 51,117, 37, 18, - 73,224,145,155,235, 50,221,254,225,191,203,171,123, 54,169,216,251,199,177, 99,199,206,166, 40, 74,226,225,225, 33, 61,114,228, - 8, 66,116,102,204,222,249,238,202, 66, 26,253,234, 9,241,221,119,223,209,107,215,174,157, 2, 96,173, 45, 54, 37,238,165,100, - 62,245, 70,139, 39,175,191, 15, 0,112,146, 11,193, 48,111,116,117, 66, 66, 2, 98, 99, 99,209,163, 71, 15,197,210,165, 75, 71, - 3, 88,111,107, 56,221,221,221,165,135, 15, 31, 70,104,194,199,195,217,174, 93, 59,250,249,243,231,191,100,100, 51, 93, 92, 45, - 89,178,164,212, 79, 63,253, 20, 17, 20, 20,196, 54, 40,219,125,250, 7,101,204,252,211, 79, 63, 69, 44, 91,182,172,244,208,161, - 67,247,249,151,234,210,238,255, 61, 89,159, 22, 71, 71,199, 57, 63,254,248, 35,182,111,223,142,248,248,248,197, 0,144,152,152, -184,120,203,150, 45,219, 6, 12, 24,128,141, 27, 55,206, 81,171, 52, 71,108,240, 98,181,236,222,189, 59, 14, 31, 62,140,147, 39, - 79, 78, 9,214,105, 31,124,236,166, 96,157, 54, 88,173,210, 76,216,183,111,223,146, 30, 61,122, 96,237,218,181, 45,211,220,119, - 25,209,180,121,243,230, 56,116,232, 16, 98, 99, 99,151,103,224,137, 92,241,223,127,255,213,106,222,188, 57,102,207,158,221, 20, -192, 41, 27,132, 70, 25, 39, 39,167,117, 75,150, 44,169, 94,177, 98, 69,244,236,217,211, 96, 54,155, 91,140, 27, 55,110,255,214, -173, 91,149, 27, 54,108,168, 54,112,224,192, 43,106,149,166,127,176, 78,107,211,118, 0,106,149,102,214,156, 57,115,250,127,247, -221,119, 24, 52,104,144,245,220,185,115,109,131,117,218, 99,106,149,230,201, 79, 63,253,116,112,213,170, 85, 76, 66, 66, 66,127, -181, 74, 19, 19,172,211,254,242, 57,210, 91, 40, 20,206, 95,187,118,109, 89, 63, 63, 63,232,245,122, 60,122,244, 8, 17, 17, 17, - 91,246,238,221,123,236,198,141, 27,243, 94,191,126,189,203,199,199,103,192,244,233,211, 11,248,251,251, 87, 87,171, 52,206,193, - 58,109, 86, 30,180,116,207, 84, 20,128, 64, 0,181,210, 60, 87, 0, 80, 19,111,134, 6,129, 55, 91, 55,196,219, 18, 78,158,163, - 95, 60, 15,137,241,112, 86,136,144,104, 85, 32, 34, 60, 12,142,206,238,128,133,135, 94,247, 26,126,229, 74,130,227,129,152,208, -167,224, 57,238,130, 77,245,166,149, 13,125, 17, 22,235,174, 82, 8, 81,166,102, 27,229,157,211, 91, 86,168, 75, 14, 25, 1, 43, -231, 42, 81, 56,173,232,213,187,183,147,133,229, 17, 27,254,130, 55, 27,245,103,136, 92, 32,228,170,192,178, 90,173,204,134, 13, - 27,220,163,162,162,232,210,165, 75,135, 86,168, 80, 65, 39, 22,139, 57,163,209,104, 21,139,197, 22,185, 92,206,234,245,122,249, -243,231,207,125,195,194,194, 24,171,213,106,163, 71,140,199,153,179,103,139,151, 84, 87, 8,201, 21,155,153, 84,245, 98,177,216, - 34,147, 43,172,217, 11,103,254,135,101, 89,201,172, 89,179,252,125,125,125, 99,107,214,172, 25,250, 93,113,239,151, 17, 73,180, -118,250,156, 63, 7, 84, 41, 95, 98,141, 35,147,156,104,112, 16, 11, 35, 34, 34, 60,158, 60,121, 82,130,231,249, 44,123, 98,105, - 98,233,122,253, 50,221,102,109,222,188,121,114,175, 94,189,112,240,224, 65, 7,150,101,213, 12,195, 0, 0,118,237,218,133,125, -251,246, 45, 56, 19,184,237,146,173, 97, 61,113,119,211,106, 0,171,219,214,250,177,190,183,183,247, 73, 7, 7, 7,134,139, 79, -121,187,178, 80,200,208, 24,179,250, 14,226,226, 18, 32,149,201, 32, 18,137, 10,216,106,179,205,119, 75, 58,197, 94, 91,190,121, -253,250, 13,226,180,222, 41, 60,156, 68, 72, 72,208, 33, 38, 38, 6,209,209,209,144,201,100, 72, 77, 77, 45,105,171, 77, 77,233, -174, 13,202,148, 41,115,194,209,209,145, 9, 73,200, 56,156, 10,133,162, 72, 6, 13, 44,229,237,237,189,112,193,130, 5,165, 92, - 92, 92, 4,219,182,109, 43,192,243,124, 0,199,113,124,250, 18,102,138,162, 64,211, 52, 69, 81, 20, 40,138,194,146, 37, 75, 74, -251,249,249,205, 7,208,225, 19,123,174, 24, 0,131,198,142, 29, 91, 77, 42,149, 98,217,178,101,207, 0,108, 78,251,122,199,138, - 21, 43,166,246,232,209,163,244,240,225,195,203, 79,158, 60,121,116,218, 80, 97,134,222, 96,145, 72, 84,181,108,217,178,216,179, -103, 15, 0,236,201,226,241, 59, 47, 94,188,184,164,117,235,214,144, 74,165,213,178,184,183,104,193,130, 5,177,111,223, 62, 0, -184,149,193, 61,183, 30, 61,122,132,142, 29, 59,130,162,168,162, 54,188,123,187,102,205,154,237,156, 61,123,182, 64,169, 84,162, - 95,191,126,166, 43, 87,174,124, 23,172,211,106,213, 42, 77,195, 94,189,122,157,221,188,121,179,226,236,217,179,101,126,255,253, -247,139,165, 93, 26,204,122, 20,119,102,114, 22, 54,127, 24, 63,126,252,207, 1, 1, 1, 24, 51,102, 12,127,232,208,161,158,193, - 58,237,177, 52, 81,121, 84,173,210, 4,140, 31, 63,126,243,130, 5, 11, 40,157, 78,247,179, 90,165,121, 29,172,211,174,204,200, - 94,114,114,114, 2,203,178, 94,201,201,201, 54,205,217,178,245,254, 82,165, 74,181,244,243,243,195,214,173, 91,209,173, 91, 55, -236,223,191, 31, 0, 14, 6,235,180,167, 1, 28, 75,123, 23,167,135, 15, 31,142,110,218,180, 41,125,224,192,129,142, 0,254,206, -226,241,207, 1, 84, 4,112, 60, 88,167, 13, 81,171, 52,192,155, 85,133, 20,128,192, 96,157,246, 85,218,125, 21, 96,219, 98, 17, - 88, 57,243,198,147,199, 14,150,171,213,180,171, 66, 46,118,131,213, 32,128, 46,246, 37,172, 2, 10,229,212, 69, 80,189, 92, 1, -220,122,145,138,203,167,247,198,166, 36, 39,109,177,169,238,180, 88,182,157, 60,122,176,100,213,134,157, 20,126,117,154,137, 11, -249, 58,119,184,173, 61, 88,223, 73,229,204,244,235, 63,192,185, 86,165,162, 56,122, 75,135, 11,199,119,198, 25,245,250,189, 68, - 46, 16,114, 85, 96,241, 60,255,242,228,201,147, 78, 83,166, 76,137,245,246,246, 22, 37, 39, 39, 51,239,206, 97,146, 72, 36,240, -246,246, 54, 39, 38, 38,234,143, 31, 63,238,199,243,252,235, 76, 93,178,140, 56,124,213,150,165, 5,173, 80,112,173, 90,183,231, -125,124, 10,230,216, 38, 0,232, 82, 36,250,127, 15,239,149, 52,172, 89,151,246,116,243,252,159,239,179, 99,243, 75,129,231,249, -103,247,239,223, 47,220,170, 85,171,251,229,202,149, 75, 0, 0, 7, 9, 31,147,248,248, 88,188,162,148, 56, 90, 32, 22,195,217, -217,217,196,113,156,240,214,173, 91,181, 56,142,179,121,131,191,136,136,136,105, 19, 38, 76,224, 46, 95,190, 60,169, 79,159, 62, - 76,201,146, 37,241,228,201, 19,108,222,188,249,237, 62, 88,217, 9,179, 84, 42,125,156,190,199,212,219, 10, 52,125,101, 33,128, -132,196, 4, 88,227, 35,193,113,156,205, 43,233,244,175,175, 95, 98,197, 98,190,124, 33,197,187,158, 12, 68, 71, 71,191, 21, 88, - 17, 17, 17, 96, 24,198, 96,171, 77,154,166,159, 26,141,198, 44,195,201,178,172, 37, 3,239, 12,239, 95,170,203,232, 17, 35, 70, - 20, 93,182,108, 89,233,225,195,135, 71, 92,184,112,225,172, 72, 36,122,197,164,185,215, 88,150,229,205,102,115,161,186,117,235, -214, 95,186,116,169,215,152, 49, 99,130, 56,142, 27,253,137,197, 85,251,138, 21, 43,174,111,217,178,165,114,200,144, 33,248,243, -207, 63, 17, 30, 30, 62, 49, 88,167,181,166,189, 7,167, 86,105,198, 47, 95,190,252,192,132, 9, 19, 96, 54,155,231, 31, 58,116, -104,186, 90,165, 25, 20,172,211,110,254,152, 77,119,119,247, 2, 2,129, 0, 55,111,222, 76, 12,214,105, 51, 93,125, 21,172,211, - 70,180,169, 57, 48,146,162, 40, 79,111,111,239,226,153,221,235,226,226, 82, 66,169, 84, 34, 52, 52, 52,189, 33,255, 24, 47,194, -194,194,120,177, 88, 76,249,248,248,100, 41,168,157,157,157,199,175, 89,179, 70,112,250,244,105, 76,155, 54,237,245,203,151, 47, -123,165,109, 37,128, 96,157,246,166, 90,165,241,111,216,176,225,214, 9, 19, 38,148,154, 59,119, 46,245,232,209,163,193, 0, 38, -103, 97,115,192,176, 97,195, 48,115,230, 76,108,219,182,109,112,176, 78,187,227,131,119,222,170, 86,105,156, 85, 42,213,210, 95, -126,249, 5,235,214,173,235, 14, 32, 67,129,245,236,217,179, 9, 85,171, 86,157, 26, 21, 21, 53,203,150, 52,181,229,126,181, 74, -211,118,240,224,193,158, 60,207, 99,230,204,153, 17, 51,103,206, 76, 77, 72, 72,216,156, 38,174,222,101,215,158, 61,123, 70, 79, -152, 48, 1,135, 15, 31, 94,166, 86,105,248, 96,157,118, 77, 38,233, 25,174, 86,105,138,171, 85,154,178,193, 58,109, 96,218, 42, -193,144, 15,158, 93, 42,237, 94,155,234, 98, 75,216,149, 85,215,206, 49,253, 92,125, 75,249,121, 23, 43, 79, 21, 45,236, 3, 31, -191,162, 80, 57, 8, 1, 30,184,243, 50, 21, 39, 15,238, 52, 71,133,191, 62,108,235,134,163,214,200,171, 11,175,158,165, 3, 92, - 10,148, 41,239, 85,184, 52,106,212,170, 47,232,222,190,133,187,179,131, 16, 70, 51,135,227,119, 18,112,230,240,191,198,132,248, -168, 61,182,172, 74, 36, 16,236, 18, 88,145,145,145, 85, 25,134,233,221,183,111,223,153,245,234,213,115, 27, 60,120,240,115, 7, - 7,135,120,177, 88, 44,116,119,119,151,178, 44, 43, 63,113,226, 68,233,240,240,112, 47,158,231,167, 68, 69, 69,101,182, 33, 31, - 95,130, 65,145, 13,231,133,244,233,167,142,189,152,237, 3,102,212,171, 87,207, 53,135, 54, 1,128, 55, 95,177, 56,157, 46,164, -255, 51, 86,119,120, 96, 33,111, 47,104,170,215,162, 29,228, 14,160, 0,184,185,187, 75, 89,150,147,217,105,243,139,225, 94,228, -241,230,106,149,230,187, 49, 99,198,204, 42, 81,162, 68,200,180,105,211, 78, 21, 40, 80, 64,159,190,233, 91, 66, 66,130,236,204, -153, 51, 13, 99, 99, 99,139, 88,173,214, 73,193, 58,237,126, 91,109,167, 77,190,157,230, 95,170,203, 97,157, 78,119,165, 79,159, - 62,216,184,113, 35, 78,159, 62,221, 72,251,232,223,179,217, 13,243,246,211,139,195, 7,180,157, 98, 12, 14, 14,150, 51, 50, 95, -184, 58, 8, 48,105,221,125, 0, 60,100, 34, 30,201, 73, 9,208,133,133,193, 98,177,216,124,100,210,201,123,155,195,191,171,214, - 47,245,225,195,135,146, 50,101,202, 32, 62, 62,254,173,176,138,137,137, 65,108,108, 44, 98, 99, 99,121,145, 72,116,211, 86,155, -103, 2,183,189,238, 82,127,184,229,209,163, 71, 12,163, 40,152, 97, 56,147,147,147, 51,242,164,224, 92,208,142,231,254,165,186, -180, 27, 62,124,248,190,165, 75,151,150,238,218,181,171,112,197,174,169, 83,222,189,103, 80,135, 95, 55, 47, 93,186,212,107,196, -136, 17, 65, 39, 79,158,108,123, 46,104,199,203, 79,153,135, 92, 93, 93,199, 28, 60,120, 80,105, 54,155,241,231,159,127, 98,225, -194,133,255, 4,235,180,187, 62,200, 11, 7, 75,187, 52, 88, 78,211,244, 79, 67,135, 14,197,143, 63,254, 40,175, 86,173,218,232, -119,188, 92,239, 17, 26, 26, 58,217, 30, 65, 16, 28, 28, 60,176,106,213,170,147,163,162,162, 50,221,199, 72,161, 80, 40, 88,150, -197,243,231,207,227,131,117,218,132, 12,242,173,161,117,141, 1,161, 44,203, 22,144,203,229, 89, 78,162,142,143,143,159, 85,173, - 90,181, 95, 35, 35, 35,143, 1,152, 25,172,211, 26, 62,176,119, 91,173,210,148, 31, 49, 98,196,176, 57,115,230,116,140,136,136, -216,102,131,205,185, 85,171, 86,253, 37, 42, 42,106, 83,176, 78,187, 58,131,112, 46, 83,171, 52,230, 29, 59,118, 12,140,141,141, -157,151, 69, 89, 60, 0,224,128, 29,101, 55,203,251,221,220,220, 38, 76,154, 52, 9,187,119,239, 70, 66, 66,194,146, 96,157,118, -110, 6,182, 46, 87,240,108,250, 95,131, 6, 13,218,254,243,207, 63,162,106,213,170, 13, 6,176, 38,139, 32, 92, 2, 80, 55,109, - 14,220, 67, 0,233,167,103,184,224,205,202, 65, 10,255,191,178,208,150,247,225,213, 37, 6,181, 62,188,117,225,254,226,229,107, -170,171,215,111,239,160,243,242,134,128,230, 17, 31, 21,130, 83,255,109,210,133,133, 60,190,144,100, 97, 7,217, 83,191,169,139, - 14,105,117,104,243,156, 35,149,107,183, 42,128,186,205, 29, 18,245, 46, 16, 9,105,164, 38,196,224,208,142,213,113, 47,159, 62, -188,148,140,240, 17, 68, 42, 16,178, 67,134,103, 17,190,203,119,213,250,137, 77, 38,211, 80,145, 72, 52,174, 81,163, 70,207,107, -214,172,121,110,195,134, 13,117, 95,188,120, 81,140,227,184,249, 18,137,100,217,161,235,255,152,236,121,112,110,218, 12, 91,210, - 2, 0,168,255, 2, 37, 74, 94, 96,222, 92,178,160,249,187,146, 69,138,242,207, 94, 61,198,246, 75,245, 46,127,204,230,215,118, - 22,161, 90,165,161, 25,134,233, 37, 16, 8, 38, 86,175, 94,253,238,163, 71,143, 74,203,229,242,135, 97, 97, 97,149,121,158,159, -203,178,236, 70,123,207,250, 75,167, 86,177,246,202, 22, 45, 90,196,255,254,251,239,204,140, 25, 51,176,127,255,126,175, 11,143, -119,101, 57,137,246,221,179, 8, 63,164,103,147, 49,253,138, 21, 43,182,250,215, 89, 11,153,231, 97, 9,136,143,215, 33, 33, 33, - 1,201, 73,137, 96,216,100, 28, 59,176,195,154,156,156, 92,109,243,241,249, 54,247, 28, 27,148,237,222,183, 88,177, 98, 75,183, -111,223, 46, 79, 74, 74,122, 43,174,226,226,226,160,215,235,177,124,249,114,189,193, 96,168, 19, 26, 26,122, 39,163,188,254, 33, -141, 43,244, 26, 92,179,102,205,165,191,205, 89,252,191,225,228, 82,240,223,142, 13,236,203,151, 47,171,135,133,133,221,202,172, - 28,249,151,234, 82,180, 76,153, 50,191, 61,123,246,108, 95,218, 42,194,183, 52,169,216,187, 83,137, 18, 37, 58, 62,120,240, 96, -210,187,115,175, 62, 85, 30,165, 40,170,133,175,175,239,194,232,232,232,103,102,179,121, 71,176, 78,187, 49, 19,175, 71,119,129, - 64,208,221,205,205,205, 51, 34, 34, 98, 78,176, 78,187,231, 83,230,119,181, 74,211,218,195,195,227,151,168,168,168, 57,193, 58, -237,127, 54,220, 55, 47, 88,167, 37,195, 59, 25,196,145,183,183,247,111,225,225,225,167, 1,140,207,108,200, 87,173,210, 72, 1, -252,230,227,227, 83, 39, 44, 44,108, 65,176, 78,187,219,198,103, 20, 0, 80, 4,111,230, 91, 1,111,230, 92,189,204,201, 81, 57, - 21,203, 79,232, 47, 22, 73,123,179,156,181, 4,120,158, 19, 10,133,247,245,134,212,229,247, 30,252,113, 48,123,241,176,140,145, -248,132,142, 23, 9,133, 93,120,240, 62, 0,111,101,104,250,121,114,114,242,226,135,143, 23,239,250,212,229,241,139, 21, 19,100, - 39,247,236, 9,172,119, 27, 90,185, 92,254, 51, 77,211,237, 45, 22,203, 94,163,209, 56,251,242,179,189, 73, 57, 9, 64,110,218, - 76, 23, 90, 27,175,243, 5,220,221,232, 93, 74, 57,202,173,220,231,248,167,193, 96,156,245,161,205,175,248,176,103,145, 64, 32, - 24,198,243,252, 32,158,231, 87,113, 28,183,204,214,189,118, 50,163,185,223,247,127,212,170, 85,107,216,133, 11, 23, 86,157,184, -187,105,164, 45,191,201, 76, 96, 1,192,247, 45, 39,238,112,117,117,237,208,160, 65, 3,198,193,193, 1,113,113,113,136,138,138, -194,221,187,119,173,169,169,169, 19, 55, 30,157,183,192,222,112,182,174, 49, 96,189, 76, 38,235,212,179,103, 79,185, 76, 38, 75, -247,100,241,135, 14, 29, 50,114, 28, 55,225,232,173,245, 75, 51, 59,236, 57, 3,155,123,138, 22, 45,218,166,105,211,166,239,133, -243,218,181,107,214,240,240,240,159,143,222, 90, 63,159, 84,190, 4, 2,129, 8, 44, 34,176,178, 45,176,190, 20,210,133, 86,218, -135,247, 25,113,132,207,168,241,255,218, 4, 86, 30,247,120,105,123,188, 96, 89, 9,172, 52, 79, 86, 75,161, 80,248,171, 64, 32, - 40, 75, 81,148,197, 98,177, 92,181, 88, 44, 99,182,156, 88,240, 32,187,225,108, 84,190,103, 75, 71, 71,199,177, 22,139,165, 60, - 77,211,102, 0, 87,117, 58,221,212,115, 65, 59, 30,124,152,246,182,198, 95,131,178,221,219, 41,149,202, 41, 50,153,172, 12,207, -243,102,189, 94,127, 51, 37, 37,101,244,233, 7, 91,239,144,222, 45,129, 64, 32, 2,235,173,192,242, 5, 16, 74, 4, 86, 62, 16, - 88, 37,157,252,191,120, 65,247, 41,227,138, 64,200, 11,113,158,147,188, 69,202, 47,169,139, 8,132,119, 4, 22, 0,128, 8,172, - 12, 4, 22,129, 64, 32, 16, 8, 4, 2, 33,251,208, 36, 10, 8, 4, 2,129, 64, 32, 16,136,192, 34, 16, 8, 4, 2,129, 64, 32, - 2,139, 64, 32, 16, 8, 4, 2,225, 91, 66, 64,162,128, 64,200,125, 62,156,248,253,177, 73,193,153, 77, 14, 39,147,136, 9, 4, - 2,129, 8, 44, 2,129,144, 13,145, 68, 68, 20,129, 64, 32,124,189,144, 33, 66, 2,129, 64, 32, 16, 8,132, 79, 33,176,200,190, - 54, 4, 2,129, 64, 32, 16, 8,185, 44,176, 8, 4, 66,206, 32,195,127, 4, 2,129, 64, 4, 22,129, 64, 32, 16, 8, 4, 2,129, - 8, 44, 2, 33,127, 67,134,217, 9, 4, 2,129, 8, 44, 2,129, 64, 32, 16, 8, 4, 2, 17, 88, 4, 2,129, 64, 32, 16, 8, 95, -152,192, 34, 19,116, 9, 4, 2,129, 64, 32, 16,114, 89, 96, 17, 8, 4, 2,129, 64, 32, 16,136,192, 34, 16, 8, 4, 2,129, 64, -200,223, 2,139,172,128, 34, 16, 8, 4, 2,129, 64,200,101,129, 69, 32, 16, 8, 4, 2,129, 64, 32, 2,139, 64, 32, 16, 8, 4, - 2, 33,127, 11, 44,178,138,144, 64, 32, 16, 8, 4, 2, 33,151, 5, 22,129, 64, 32, 16, 8, 4, 2, 33,251, 80, 60,207,147, 88, - 32, 16, 8, 4, 2,129, 64,200, 69,136, 7,139, 64, 32, 16, 8, 4, 2,129, 8, 44, 2,129, 64, 32, 16, 8,132,252,141,128, 68, - 1,129,240,134, 15,247,127,251,216, 98,143,156,238, 17,151, 39, 54,239, 13,166, 65,243,133,193,241,158,128, 32, 26,224,158, 63, -174,176,146,203,177, 77,160, 16, 56,206, 21, 34,196,195, 74,191,200,169, 77,123,227,133, 64, 32, 16,136,192, 34, 16, 8,159, 15, -142, 47, 13,208, 51, 65,113, 5,192,115, 65, 0, 55, 7,192,131, 28,217,164, 40, 53, 56,254, 55, 48, 84, 17, 88,241, 0, 28,255, - 7,128, 64, 18,217, 4, 2,129,144, 11, 2, 43, 47,118,116,239,217,100, 76, 16, 69, 81,231, 56,142, 27,183,245,228,194,196,175, - 41, 50, 73, 47,252,235, 79,203,146, 78,254,217, 46, 23,121, 98,243,222, 96, 57,104,170,153,217,106, 45,116, 51, 40,201,197,175, -148,146, 22, 51,204,119, 37,239, 13,126,245,184,194,202,228,108,219,164,168,102,102,150, 45,118,250,134,209,205,191,162,152,145, -137,132, 45, 75,222, 27, 28,146, 93,155,233,116,242, 31,170,146, 74,165, 91, 45, 22, 75,192,246,211,139, 99, 72, 78, 35, 16, 8, -223,164,192,202, 11,120,158, 47,230,228,228, 84, 56, 49, 49,177, 75,207, 38, 99, 70,242, 60,191, 97,235,201,133,223,204, 82,198, - 26, 53,106,188, 98, 89,182, 32, 0, 8, 4,130, 24,171,213,234,189,245,228, 66,107,239,102,227,254,231,250,141, 27, 55,172, 36, -139, 18, 50,133,230, 61,193, 82,141,158,135, 27,228, 49, 58,139,247,195,231, 41,150,202, 37, 29, 27,130,225,246, 2, 72,206,182, - 77,142,111, 20,244, 74,175,184,250,210,221,211, 81, 30,109,169, 85, 90,208, 8, 12,191, 47,219, 54,211, 16,139,197,131,121,158, -111, 42, 20, 10, 71, 2,152, 68, 18,144, 64, 32,124,211, 2,107,114, 21, 77, 93, 33,133,153, 44, 15, 63,138, 2, 37, 0,238, 24, - 41, 76,249,253,186,246,172,189, 15,164, 40, 10, 27, 54,108, 16,207,156, 57, 83, 28, 20, 20,180, 84,175,215,143,238,209,120,116, -192,214,147, 11,239,100,231, 5,122, 52, 30,125, 19,192,154,173, 39, 23,174, 76,191,214,171,233,216,203, 0,182,111, 62, 62,127, -201, 59,215, 94,113, 28, 87,144,162,168, 24,133, 66,225,189,122,239,116,107, 38, 54, 31, 3, 40, 66, 81, 84,248,150, 19, 11, 10, -189,115,189, 63, 77,211,125, 55, 31,159, 95,231,157,107,125, 24,134, 25, 36,147,201,234,157, 57,115, 38, 75, 65,196,113,156,247, -137, 19, 39, 32, 16, 8,208,168, 81, 35,231,180, 52,176,102,116, 61, 51, 91, 31,243,122,148,118,105, 48,138,162,168, 97, 44,203, -150, 13,214,105, 13,105,215,134, 50, 12, 51,214, 98,177, 84, 8,214,105,147, 50,179,169, 86,105, 4, 12,195, 4,243, 60,191,226, - 81,220,153, 5,233,215,203,184, 54,124, 66, 81,212, 90,171,213, 58, 39, 88,167,229,109,241,204,100, 22,206,238,141, 70,213, 83, - 40, 20,147,255,254,111, 70, 51, 0,232, 54,197,228,205,153,104, 5, 45,230, 82,182,207, 16,135,219, 98, 55,175,200,234,185,217, -241, 56,229,137,205,123,131, 69, 0,252, 57,112,158,207, 66,245,110,181,234, 54, 18,156, 57,125,220,189,124,113,135, 68, 1, 79, -213, 79,243, 56, 25,237,182,201, 81,117, 56,138,243,190,242, 68,228, 86,178,250, 15,130,235,247, 22,184, 85, 43,205,233, 4, 28, -173, 41,121,111,240,107,123,109,190, 83, 86,132, 2,129, 96,116, 64, 64, 0,189,113,227,198,161,223, 85,235,247,219,161,235,255, -152,190,214,202,245,195,244,156,220, 89, 83, 94, 42,198, 86,131, 9,131,103,238,212, 94,200,141,103,244,104, 60,186,134, 72, 36, -250,199,108, 54, 7,108, 61,185,240,150, 61,121,238, 83,189,119, 6,245, 76, 5, 0, 69, 0, 68, 4,235,180,215,114,227,185,106, -149,102,110,233,210,165,123, 62,122,244,232,143, 96,157,118, 9, 25, 81, 32,228,123,129, 53,173,138,230, 87, 79, 47,223,113,131, - 38,204,149, 21,172, 92, 19,230, 68, 29, 94, 93, 58, 81,119,221,154, 69,135,102, 84,211, 44,157,114, 93, 59,209,222,135,186,187, -187,195,219,219, 27,190,190,190,138,176,176,176,114,183,111,223,190,216,167,197,132,109, 22,139,101,236,214,147, 11, 19,236, 52, -231, 39, 20, 10,255,232,213,116,108, 75,154,166,123,110, 60, 58, 47,137,231,249,170, 34,145,168, 98, 64,243,241,205,172, 86,107, -247,173, 39, 23, 38,242, 60,239, 61,113,226, 68,204,157, 59, 55, 75,241, 66, 81, 84,145,128,128, 0,193,134, 13, 27, 10, 2, 64, -103,205, 48,185, 68, 34, 89, 47,149, 74, 91, 24, 12, 6,121, 90,197, 38, 99, 24,102,141, 84, 42,109,107, 48, 24,164,182, 8,162, -116,148, 74, 37, 14, 28, 56, 96,243,117, 27, 43, 23, 39,145, 72,180,221,217,217,185,110,124,124,188, 24,128, 88,173,210, 8, 69, - 34,209, 22,149, 74,213, 32, 49, 49, 81, 4, 64, 6, 32, 41,171, 60,193,113, 92, 97,149, 74,245, 91, 5,207,166, 77, 77, 38, 83, -215, 96,157, 54,129,101,217,226,238,238,238,147, 19, 19, 19,155,170, 85,154,142,193, 58,109,124,118, 51, 93,175,166, 99, 53,114, -185,252, 96,106,106,170,226,173,240, 52,209, 10, 74,192,247, 7, 75, 31,239, 61,217, 98,218, 52, 83, 24, 71,138,103,150,120, 0, -116,227, 87, 17,169, 82,207,130,229, 20,110, 37,218,192,249,230, 25,233,195, 87, 41, 14, 21,138, 56, 54, 6,248,163, 0, 66,236, -182, 73,163,201,203,112,131, 84,232,222, 84, 94,193, 79,131, 99, 79, 14, 74,238, 61,189,175,244, 43,169,108, 12, 30,199,179, 97, - 51,157,206, 85,170, 84, 17,107, 52, 26,156, 58,117,138, 97, 89,182, 23,128,127,190,133,132,154,220, 89, 83, 94, 33, 19,157, 27, - 50, 32,192,105,249, 95,107, 15, 78,238,172,105,149, 83,145,213,163,241,232, 26, 14, 14, 14, 39, 6, 13, 26,228,240,231,159,127, -158,234,209,120,116,163, 15, 69, 86,126, 68,173,210, 84, 1, 32, 10,214,105,255, 83,171, 52,109,212, 42,141, 32, 88,167,181,230, -208,230,162,223,126,251,109,228,207, 63,255,140, 82,165, 74, 77, 87,171, 52,203,120,158,103,179, 35, 6,213, 42, 13,221,185,115, -103,106,230, 95, 67,217, 79, 17, 31, 95,171, 16, 28, 55,110, 92,118,127,202, 3,160,114, 57, 56, 31,218,204,246, 51,254,248,227, - 15,155,239,205,116,155,134, 41, 85, 53,117, 92,189,124,199,207,221,123, 77,198, 5,221,198,141, 31, 26, 34,104,100, 7,200, 30, -223,194,196, 97, 19,101, 74,165,243,176,201, 85, 53, 13,179,227,197,114,112,112,128,131,131, 3, 42, 84,168, 64,245,233,211, 71, - 86,186,116,233,158, 66,161,240,101,175,166, 99,127,232,209,120,180, 93, 47, 62,105,210, 36,185,151,151, 87, 19,158,231,131,186, - 55, 26, 85, 5, 0,166, 79,159, 46, 45, 88,176, 96, 67,129, 64, 16,212,173,225,200,170, 0,224,227,227, 3,138,178,205,116,209, -162, 69,211,197, 64, 89,185, 92,254,112,196,136, 17,237,142, 31, 63, 46,103, 24, 6,221, 26,142, 44, 35, 18,137, 2, 71,141, 26, -213,233,196,137, 19, 50,161, 80,104,215,234, 42,147,201, 4,169, 84,106,243,117, 27, 42,151,106, 98,177, 56,104,214,172, 89, 13, -211,194,200, 2,240, 19,139,197, 65,191,255,254,123,179,211,167, 79,203,133, 66,161,205, 21,152, 80, 40,228,143, 28, 57, 34,243, -243,243,211,136,197,226, 96,181, 74, 83, 93, 32, 16,224,200,145, 35,178,154, 53,107,214, 78,187, 86,203, 86,123,131, 58,252, 58, -189,119,179,113,150,222,205,198, 89,250,126,247,243, 86,137, 68,114,104,201,146, 37, 10, 0,232, 49,193,236,216,245,103,125, 97, -145, 0, 86,240, 48,131,226,103, 27, 13,180,235,143, 75,184,207,178, 0,195,214,202,206,158, 74, 49, 79,108,222, 27,204, 0,168, - 12,138, 83, 7,133,164,184,150,172,212, 74,136,184, 51, 40, 91,196, 65,112,247, 73,178, 7, 40,174, 40, 40, 84, 43,121,111,176, -192, 46,155, 20, 85, 17, 20, 95,250, 98, 16,237,174,174,210, 69, 24, 17, 17, 1,151,130, 13, 5,151,130,224, 9,240,197,193, 83, - 85,236,177,249, 65,190,154,214,190,125,123, 69, 68, 68, 4,234,212,169, 35, 23,139,197, 83,237,245,140,124,248,193,195,114, 34, -156, 45, 93, 24,103, 75,215,199,197, 82,222, 56,219, 64,240, 63,247,228, 19,113,245,199,226,157, 78,149,234,244,195,136,246,112, -148,138,169, 67,147, 59,107,234,230, 84, 92,173, 95,191,222, 65,163,209,160,123,247,238, 78, 98,177,248,116,143,198,163,253,190, - 16,113,117, 57,237,210, 3, 0,254, 57,180,185,232,215, 95,127, 29,249,243,207, 63, 35, 41, 41, 9,223,127,255,189, 35,128, 5, -246,198,231,192,118, 83,119,244,111, 51, 57,190, 70,141, 26,214,151, 47, 95, 90,250,181,158,164, 27,216,110,234,238,158, 77,198, -212, 33,125,185, 79, 10,245,149, 60, 35,115,129, 37,224,241,219,192,209, 51,164,207,215, 45, 64,248,230, 69,160, 99,194,192,232, - 34, 96,212,254, 7,203,185,253, 8,168, 93, 91, 38,163,168,153,217,121,112,186,192,114,112,112,128,139,139, 11,218,181,107, 39, - 25, 48, 96,128,163,167,167,231, 18,137, 68,114,207,158,138,162, 69,139, 22,240,247,247, 23, 87,175, 94,221, 83, 40, 20,158,231, -121,158,105,208,160, 1,154, 53,107, 38,110,208,160,129,167, 88, 44, 62,199,243, 60, 35,151,203,109, 14,159, 76, 38, 3, 0,168, - 84,170,235,107,214,172, 41,216,174, 93, 59,193,225,195,135,193,178, 44, 60, 60, 60,110,172, 91,183,174,112,219,182,109,133, 90, -173, 22, 44,107,123, 71,135,162, 40, 24, 12,134,183,246,179,186,158, 21,229,220, 27,143,116,117,117, 61,123,233,210, 37,143,126, -253,250, 9,163,163,163, 65, 81, 20,229,226,226,114,232,242,229,203, 94, 3, 7, 14, 20, 38, 36, 36,216, 44, 44, 1, 64, 32, 16, -160,106,213,170, 24, 62,124,184,120,200,144, 33,238, 18,137,228,172, 64, 32, 64,165, 74,149, 48,114,228, 72,209,216,177, 99, 93, -165, 82,233,169,242, 30, 77, 38,170, 85,154, 44, 13,167,166,166,254,242,247,223,127, 11,214,174, 93, 43, 40, 80,160, 64,219,197, -139, 23,203, 75,148, 40,145,158, 5, 93, 1, 65,127,139, 21, 46,156,153,217, 4, 0,180,148,235,168,139, 76,241, 32,245, 76,166, -184,130, 66,211,200, 88,147, 88, 40,117, 87, 58,184,150, 4, 18,174,195,203, 69, 12,138,162,164,143, 95,167,202,193,163, 41, 0, - 87,187,108,242,104, 26, 22,107,146,232, 5,165, 28, 60,188,139, 32, 33, 33, 1, 46,158,165, 96, 98, 60, 36, 65, 33, 41, 10,208, -118,219, 4, 0,116,107, 56,210,223,215,215,215,179, 72,145, 55, 54, 75,150, 44, 9, 7, 7, 7,231, 30,141, 71, 55,205,182, 24, -190,211, 71,130, 88,212, 5, 77, 45, 0, 77,255, 6,142,158, 3, 65,116,149,146,207, 70, 11,243,155,231,234,143,197, 59,157, 28, - 85, 30, 72,190,218, 28, 5, 61,165, 24,221,205, 93, 41, 21, 51,217, 18, 89,239,138, 43,137, 68,130, 27, 55,110, 64,173, 86, 99, -192,128, 1,142, 82,169, 52,223,138,172,119,197,149, 90,165,145,169, 85,154,234, 0, 66, 1, 20,200,129,205, 37,191,254,250,235, -200, 95,126,249, 5,151, 47, 95,198,188,121,243,208,178,101, 75,168, 84,170, 90, 54,254,158,254,161,213, 47, 43, 85, 42,213,201, -126,253,250,117,216,180,105,147,234,191,255,254,163, 52, 26, 13, 85,164, 72, 17,167,126,253,250,181,115,118,118, 62,218,191,205, -228,245,147, 7, 46, 99,178,217,105,163, 74, 58,249, 83,223,104, 61,197,191,243,201,232,250,199,190,203,236,190,140,126,151,209, -119, 31,254, 14, 89,132,199,214,112,230, 76, 96,241, 64, 37,239, 98,165,160, 59,177, 3, 50,134,122,239, 67, 63,189,131,130, 82, - 1, 44, 60, 95, 62,167, 2, 43,253,163, 86,171, 49,105,210, 36, 69,183,110,221,202,202,100,178,243, 3,219, 77,157,107,171, 61, - 55, 55, 55, 84,171, 86,141, 10, 8, 8,144,106, 52, 26,150,162, 40,184,185,185,161,118,237,218,248,233,167,159,164,205,155, 55, -103, 21, 10,133,205,225,147, 74,165,168, 94,189,186,101,231,206,157, 82,149, 74,133, 3, 7, 14, 64,175,215,195,223,223,223,178, - 99,199, 14,169,179,179, 51,206,158, 61, 11,147,201,254, 41, 36, 22,139,229,163, 66, 42,163,235, 25, 81,181, 96,171,141, 94, 94, - 94, 51, 30, 61,122, 36,243,242,242,194,195,135, 15,225,224,224,128,209,163, 71, 51,193,193,193, 18, 95, 95, 95, 60,127,254, 28, - 74,165,210, 46,129,149,126,175,183,183, 55,218,183,111,143, 13, 27, 54, 72,135, 15, 31,206,166, 95,107,219,182, 45,118,238,220, - 41, 45, 92,184,240,100, 39, 39,167,157, 89,217, 99, 89, 86,224,234,234, 10,103,103,103,180,105,211, 70, 86,160, 64,129,183,241, -102,165, 97,164, 41, 84,162, 4,232,200, 72,121, 35,120,108,164,120,174,190,128, 99, 36,249,213,123,101,235,253, 37,157,252,115, -221,102,154,167,137, 2,195,151, 4, 80,237,254,139,100,151,138,213, 91,139, 17,127, 1,224, 45, 0,197,192,175, 76, 65,225,229, - 71,201,158, 0, 42,131,166, 74,151,188, 55,152,202, 50,156,247, 6, 83,160,168,226, 0, 95,253, 90,144,213,165,120,181, 31, 68, -209,209,209, 16,137, 68,144, 72, 36, 40, 84,174,139,224,108,160,197, 11, 60,239, 7,150, 42,149,149,205, 15,145, 72, 36, 83,186, -117,235,230,240,174,205,150, 45, 91, 42,228,114,249,180,108,139, 43, 90, 94, 27,224, 71, 62, 11, 55, 20,217,124, 60,172, 76,104, -140,169, 52,120,140,129, 81,111,183,200,250,208,235,229,235,235,219,160,104,209,162,207,188,189,189,235,101,215, 35,246, 63,226, -234, 74, 51,240,188, 21,180,208, 5,133, 11,122, 97,204,247,126, 74,169, 68,104,151,200, 74, 23, 87,235,214,173,115,144, 72, 36, -184,126,253, 58,196, 98, 49,164, 82, 41,202,151, 47,143,145, 35, 71, 58,202,100,178,124, 39,178, 62, 16, 87, 46,193, 58,173, 30, - 0, 7,160, 7,128,123,217,176, 71,169, 85,154,101, 51,102,204, 24,254,203, 47,191,224,210,165, 75,240,245,245, 69, 84, 84, 20, -252,253,253, 95,234,116, 58,155, 58,254,181,107,215,158, 90,188,120,241,128, 61,123,246, 40,212,106, 53,163,215,235,113,242,228, - 73,204,159, 63, 31, 41, 41, 41,240,241,241,161,211,190,235, 28, 30, 30, 62,219, 78, 81, 37, 46,233,228, 47, 7,160, 0, 32, 47, -233,228, 47, 93, 54,117,151, 88,173,210, 72,210, 4,166, 84,173,210,136,190, 1,111, 84,250,135,183,227,187,204,238,179,215, 38, -245,193,119, 31, 19,101,185, 17, 78,251, 4, 22, 0,152,227,163, 32, 1, 7, 57, 67, 65, 38,160,222,252,159,161, 32,163,121, 8, -226,163, 64,217,169,203, 41,138, 2, 69, 81, 80, 40, 20, 80, 42,149,255, 35,178,148, 74, 37, 36, 18,201,123, 13,189, 45, 54,221, -220,220,224,238,238, 14, 71, 71, 71,136,197, 98, 30,120, 51,215,203,221,221, 29, 46, 46, 46, 80, 40, 20,144,203,229, 54,217,164, - 40, 10, 82,169, 20, 74,165,146,186,120,241, 34,174, 93,187, 6,153, 76, 6, 23, 23, 23,200,100, 50,234,198,141, 27,120,248,240, - 33, 20, 10, 5, 92, 93, 93,237, 18, 47, 0, 96,181, 90, 63, 26,150,140,174,103, 4,199,113,161, 41, 41, 41,212,165, 75,151,144, -146,146, 2, 15, 15, 15,120,121,121, 33, 57, 57,217,114,249,242,101,152,205,230,183,215,104,154,182, 59,157,188,189,189,225,237, -237, 13,134, 97,144,148,148,100,125,247,154, 64, 32, 64, 98, 98, 34,197,113,220,107, 91,236, 37, 39, 39, 35, 57, 57, 25, 23, 47, - 94, 68,108,108, 44,158, 63,127,158, 38,176,232, 68, 14,216, 10,240,221, 5, 28,207,240, 60,238,131, 71, 37, 43, 47, 98, 64,200, - 8, 39,112,116,211,196, 20,139, 56, 49, 85,232,228, 90,184, 46, 16,127, 14, 0, 3, 8,157, 81,170,120, 49,196, 38, 67, 17, 30, -103,144,129, 71, 51, 0,206, 54,217, 4,223, 52, 33,197, 44, 13, 73,114,117, 42,166,174,130,248,248,120, 72, 36, 18, 72,165, 82, - 20, 45,221, 16, 81, 9,144,191,142, 49,200,193,240, 77,108,180, 9, 0,232,222,104, 84,113,169, 84, 90,203,207,207,143,122,215, -102,237,218,181, 65,211,116,197,110, 13, 71,150,177, 75, 92,197,246, 19,131,146,215, 2,248,145, 47, 35,244, 62, 23, 30,164,168, -107,214,110,226,178,239,124,100,153,144, 40, 99, 81, 88,169, 49, 72, 73,173,154, 93, 79, 86,163,242, 61,235,203,229,242, 3,211, -167, 79, 47, 42,149, 74, 15,215, 47,211, 45, 91, 67, 88, 50, 49, 54, 14,252,161,231, 59,226,138, 5, 45,114, 1,149,246, 41, 90, -164, 48,122,182,175,171, 20,139, 69,219,109,181, 41, 20, 10,183,140, 24, 49,194, 65, 42,149,226,250,245,235, 16,137, 68,144, 74, -165,111, 63,126,126,126,232,213,171,151,163, 66,161,216,252,153, 5,149,179, 90,165,105,174, 86,105, 58,171, 85,154, 78,239,136, -171,162, 0, 26,169, 85,154,166, 0,188, 0,156, 13,214,105,111,219,104,179, 94, 25,215,134, 7,187, 54, 24, 17, 38, 16, 8, 30, -204,154, 53,235,167, 9, 19, 38, 96,201,146, 37,104,208,160,193,211,137, 19, 39,226,209,163, 71,214,212,212,212,182,193, 58,173, - 77,147, 89,105,154,238, 31, 16, 16, 32,115,112,112,128, 84, 42,197,230,205,155, 49,104,208, 32, 72, 36, 18, 80, 20, 5,185, 92, - 14,185, 92,142,190,125,251,202, 40,138,234,107, 99, 56, 43, 15, 25, 50,196, 9,128, 4,111,230,189,202, 1,200, 31, 60,120,160, -244,244,244,116,170, 93,187,182,178,108,217,178,202, 77,155, 54,149, 20, 10,133, 21,191, 81, 15,214,215,242,188,236, 11, 44,134, -194,157, 87, 87,207,194,165, 92,149,247, 61, 88, 2, 10,114, 71, 39, 60,123,253, 18, 34, 80,247,115,226,193,122, 87,100,197,197, -197, 97,218,180,105, 41, 27, 55,110, 12,212,235,245,245, 86,239,157, 62,193, 86,123,238,238,238,120,246,236, 25,191,124,249,114, -253,241,227,199, 5,233,162,235,233,211,167,252,239,191,255,110,216,181,107, 23, 99,207,252, 38,153, 76,134,147, 39, 79, 10,102, -204,152, 97, 8, 9, 9,129,139,139, 11, 92, 93, 93,113,244,232, 81,193,228,201,147, 13,193,193,193,188,139,139, 11, 92, 92, 92, -236,207, 1, 60,255,209,185, 86, 25, 93,207,136, 91,161,135,127,137,143,143,239,222,189,123,247,164,173, 91,183, 90, 61, 61, 61, -225,229,229,133,127,254,249,135,234,220,185,115,202, 95,127,253,101, 73, 23,153,246, 8,172,116, 17,236,233,233,137,127,255,253, -151,237,221,187,119,202,250,245,235,197, 20, 69,193,203,203, 11,187,119,239,102, 59,116,232,144, 18, 27, 27,219,231,250,171, 3, -163,108,177,169,213,106,113,238,220, 57,220,186,117, 11, 87,174, 92, 65, 96,224,155, 61, 43,153,100, 51,159,246,242,111, 2, 40, - 96, 44, 0, 45,192,215,222,175,203, 81,159,144,242, 4,199,251,223,125,154,172,242,171,213, 66, 66,165, 4, 2,214, 20, 64,228, - 12, 8,157, 65,139,157, 81,189,114, 21,230,244,189,100, 79,240,124, 93, 80,172, 13, 67, 48,180, 7,120,104,174, 7, 27, 85,197, -170,246, 23, 39, 37, 37,131, 97, 24, 72, 36,146, 55,130, 72, 38, 71,249, 90, 63,208,167,238,233,189,192,243,245, 0,206,215,214, -224,138, 68,162,241, 93,187,118, 21, 39, 39,191,111, 83, 38,147,161,125,251,246, 18,165, 82, 57,217,102,113, 21, 62, 68,132, 72, - 73, 45, 80,111,196,213,185,251,201,165, 58, 5, 76,147, 21, 47, 89, 1,223,213,242,144,253,123, 38,178,220,179, 8,125, 49,208, -244,104,164,166, 86, 43,185,195, 62,145, 85,191, 76, 55,127,169, 84,122,240,208,161, 67,242,198,141, 27, 99,226,196,137, 10,169, - 84,122, 88, 83,186,171,198,222,100, 74,177, 96,208,170,191,215, 39,223,218, 81, 19, 60,184, 55,226, 74,232, 10, 74,228, 2, 90, -232,130,240,120, 26,219,254,187,156,108, 50,154,251,219,106,211,108, 54, 15,156, 63,127,126,242,222,189,123,255, 71, 92, 73,165, - 82,132,134,134, 98,203,150, 45,201, 41, 41, 41, 3, 63,163,184,114,193,155,121, 85,119, 0,236, 2,112,242, 29,113, 85, 18,192, -238, 52,175,213,205, 96,157,246,165,141, 54,235,180,104,209,226,244,211,167, 79,191,187,125,251,182,119, 68, 68, 68,153, 49, 99, -198, 96,241,226,197, 24, 63,126,252, 22,158,231, 75,237,216,177,195,239,234,213,171, 21,131,117, 90,155, 61, 98,122,189,190,223, -244,233,211, 13,175, 94,189, 66,217,178,101, 17, 27, 27,139,230,205,155,163, 85,171, 86, 80, 40, 20,240,243,243, 67, 84, 84, 20, -166, 78,157,154,106, 52, 26,251,217,104, 54,124,205,154, 53, 37,206,158, 61,235,144, 38,176, 20, 49, 49, 49,202,216,216, 88, 7, - 95, 95, 95,199,128,128, 0,215,121,243,230, 21, 26, 62,124,184,194, 98,177,132,125,229,226,138,202,196,115,244,165, 63, 47,103, - 2,203, 12, 76,221,176,115,131, 65, 92, 88, 13,167, 50,149, 33,151, 74, 33,147,136, 33, 83,185,192,192,178, 88,243, 34, 50, 53, -133,231, 39,103,231,193,239,122,173, 4, 2, 1, 54,111,222,108,156, 50,101, 74,226,203,151, 47, 71,232,245,250, 10,246,172,134, -137,141,141,197,182,109,219,140,219,183,111, 15, 53,155,205, 53, 25,134, 97,147,146,146,176,113,227, 70,227,170, 85,171, 34, 13, - 6, 67, 61,134, 97, 88,123,230, 96,165, 11, 29,171,213,170,217,190,125,123,212,222,189,123, 77, 74,165, 18, 0, 96, 48, 24,106, -109,220,184, 49,124,195,134, 13, 70, 7, 7,135,108,180,143,111,122, 70,182, 94,207,140, 96,157,246,128, 94,175, 47,191, 96,193, -130,135,173, 90,181, 74, 77, 74,122,179, 72,208,104, 52, 86, 95,188,120,241, 93,141, 70,147, 26, 25, 25,105,151, 77,139,197,130, -148,148, 20,180,111,223, 94, 63,103,206,156, 71, 6,131,161,156,197, 98,129, 94,175, 71,155, 54,109,244, 83,166, 76,121,172,215, -235, 43, 60,140, 61,189,203, 86,155, 17, 17, 17,136,136,136,192,227,199,143, 17, 17, 17,129,244, 48, 81,114,129, 19, 13,244,224, - 41,106,155,149,166, 88,176, 92, 37, 30,184, 35,160, 41, 22,132,143,195,178, 10,208,188, 60, 36,218,224, 40,147, 80, 20, 98, 79, - 2, 66,103, 64,168,122,243,127,145, 51, 92, 61, 10, 82, 65,175, 83,156, 64,241, 18,176,140,103,214,238, 80,171, 3, 40, 94,241, - 36,130,119, 20, 75,157,169,216,216,216,183, 66, 40,253,227,233, 91,150,122, 18,158,226, 8, 26, 50,208,180,151, 29, 29,138,214, - 42,149, 74, 16, 23, 23,247, 63, 54,139, 22, 45,202, 88, 44,150,230, 54,191,123, 8,235, 13,142, 27, 26, 18,101,244, 57,247, 32, -165, 84,199,222,191,202,228, 76, 10, 16,254, 47,138,248,122,161, 67,147,202,226,173,103,162,202, 61,126,157, 90, 28, 20, 51, 8, -229,147,221,109, 18,110, 78,254,168, 95,166, 91, 61,133, 66,113,248,208,161, 67,114,133, 66,129,167, 79,159,194,207,207, 15,115, -231,206,149, 43, 20,138, 67, 13,203,245,104, 96, 79, 50,205,250, 87,123, 53,197,194, 55, 89,190,159, 74,126, 30, 37,127,235,185, -162, 69, 46,136,208,209,152,189,236,191,228,212, 84, 99,151,153,187,180, 71,109,181,185,237,212,162,211, 6,131,161,221,230,205, -155,147,227,226,226,254, 71, 92, 77,158, 60, 57, 57, 53, 53,181,229,214,147, 11, 47,124,198, 28,234, 7,224, 22, 0, 3,128,250, - 0,228,106,149, 70, 0,160, 54,128, 19,193, 58, 45, 27,172,211, 70, 6,235,180,225,182, 26,100, 24,102,194,138, 21, 43, 4,122, -189, 30, 3, 6, 12, 64, 72, 72, 8,194,194,194, 48,105,210,164,231, 60,207,247, 73,179,121, 59, 88,167,125,104, 79, 64,183,157, - 90,116,204,108, 54, 15, 9, 8, 8,208,175, 91,183,206,218,167, 79, 31,212,168, 81, 3,126,126,126,232,211,167, 15,214,172, 89, - 99,237,220,185,179, 49, 53, 53,117,236,150, 19, 11,246,219, 88, 39, 71, 89, 44,150,240, 38, 77,154, 20,108,208,160,129,219,188, -121,243,156, 94,188,120,225,200,178,172, 42, 48, 48,208,121,235,214,173, 78,109,219,182, 21,234,116,186, 87,246,196,193,151,216, - 21,252,196, 30,165,204,158, 71,101, 18,142, 15,127,151,107,226, 44,211,213, 64, 51,110,104, 47,206,168,166,153, 55, 99,237,234, -113,189, 43,150,145, 21, 41, 90, 22,108,178, 14,119, 35, 34,176, 33, 60, 33,213,194,243,203,102,222,208,158,206,142,192, 80, 40, - 20, 16, 10,133, 56,127,254, 60,255,247,223,127, 27, 56,142,219,102, 52, 26,179,179, 77, 3,126,248,225,135,212,228,228,228,195, - 73, 73, 73,125,119,106,151,166,246,110, 54, 14, 1, 1, 1,250,132,132,132,147, 22,139,165,247,182, 83,139,146,122, 55, 27,103, -215,100,244,244,123, 55, 31,159,127,189, 71,227,209,234, 43, 87,174,108,123,242,228,137, 63, 0,249,246,211,139,239,254,208,234, -151,210,151, 47, 95,222, 24, 20, 20,212,132,227, 56,187,150,254, 9, 4,130,143,206,181,202,232,186, 13, 5, 58, 68,173,210, 84, -185,126,253,250, 31,165, 75,151, 30,104,177, 88,196, 0, 34,146,146,146,106,222,186,117,107,102,153, 50,101, 70,232,245,122,155, -123,242, 22,139,133, 46, 90,180,168,222, 96, 48,252,147,146,146, 50, 38, 88,167,181,168, 85, 26, 20, 43, 86, 76,159,146,146,178, - 33, 37, 37,101,100,176, 78,107,182, 35,189,173,175, 95,191, 22, 80, 20, 5,150,101,217,199,143, 31, 51,142,142,142,105, 57,155, - 22,114, 60,119, 7, 44,245, 31,203, 82, 18, 90,204, 6, 80,160,143,210,172,213, 12, 66, 6,221, 34, 65, 18, 56, 46,202,191,162, -179,116,223,190,237,226,239,234,150,144, 20, 40, 80, 40, 77,100, 57,227, 69, 68, 50, 54,237,220,202,117,175,239,246, 12, 28, 21, - 6, 26, 15,109,178,201,115,209,173,170, 11,165,219,143,141, 43, 86,172,214, 68,177, 79, 97,191,183, 66, 40, 54,226, 30, 14,110, -254,145,235, 94,223,249, 25,120, 68,128,135,205, 13,153,213,106,237,188,104,209,162, 35,125,251,246, 85,148, 47, 95,254,173,205, -231,207,159, 99,238,220,185,122,163,209,216,201, 54, 17,164,161, 32, 43,229,199,114,240, 56,113, 35,182,100,199,246,157,101,114, - 65, 18, 16,182, 21, 96,228,128,208, 9,197,138,184,161,107, 27, 47,225,134, 61,251,203,253,222,167,120, 50, 44,162,178, 0,108, -242, 18, 8,133,194,131,243,231,207,151,203,229,114, 4, 7, 7, 67, 38,147, 65, 42,149,162, 90,181,106, 88,177, 98,133,124,192, -128, 1,135,213, 42,141, 3,207,243, 54,175,200,157,245,175,246,234, 47, 93, 53, 77,150,238,140, 57, 49,188,119, 1, 7,117, 9, - 23, 68,196, 83,152,181,244,191,164,212, 84, 99, 87,123,196,213,187, 34,171,123,163, 81,237, 86,172, 88,177,111,226,196,137, 14, -101,202,148, 65, 88, 88, 24,166, 76,153,146,148,154,154,250,221,103, 22, 87,192,155, 57, 71,161, 0,170, 3, 40, 1, 64, 30,172, -211, 30, 84,171, 52, 73,193, 58,109,182, 58, 78,229,202,149,171, 82,184,112, 97, 12, 27, 54, 12,107,214,172,137, 55, 24, 12,206, -191,253,246, 27,212,106,181,227,238,243,203,115,212, 25,219,112,100,238,250, 94, 77,199, 94,223,184,113,227,120,154,166, 53, 70, -163,209, 19, 0,127,226,196,137, 48,171,213,122,198,104, 52, 46,222,124,124,126,160,157,117,114,168, 90,165,137,187,122,245,170, -235,221,187,119, 85,147, 38, 77,114, 0, 0,177, 88,156,146,154,154, 26, 15, 32, 54,125,159,194,175,149,180,237, 12,168, 76,196, - 80, 70,127, 83, 54,222,103,203,223,200,166,221,236,216,183, 79, 96, 1,192,148,235,218, 95, 39, 87,209,156, 92,115,249,234, 76, - 51,207,251,241, 0, 37,166,169, 59,201, 60,159,173,141, 70, 1, 32, 41, 41, 9,177,177,177, 88,188,120,113, 74, 68, 68,196,139, -148,148,148,108,111, 52, 42,151,203, 47, 69, 71, 71,255,189,249,248,252,245,239,120,159, 46, 68, 70, 70,110,223,116,236,143,213, -239, 84,158,225,181,107,215, 46, 40, 22,139,227,145,197,126, 85, 66,161, 48,170, 75,151, 46,158,105,247, 34,237, 72,159,150,125, - 90, 76, 24, 46,147,201,250, 0,192,218,131,179,146, 1,180,239,221,108,220, 32,153, 76, 54, 16, 54,238,129, 5,224,173,107,223, -214,235, 54, 22,104, 43,128, 81,106,149,230,132, 82,169, 28,158,148,148,100, 72,171,204,126, 86,171, 52,167,148, 74,229, 56,139, -197, 98,203, 46,220, 22,133, 66,113, 52, 38, 38,102, 89,176, 78,123, 56,253,162,163,163,227,225,200,200,200,191,130,117,218,255, -178, 33,168,103,221,189,123,247, 23, 0, 40, 81,162,196,206,192,192,192, 54,222,222,222,114, 0, 16, 11, 13,241, 38, 11,181,134, -161,120,134,146, 8,250, 80, 60, 37, 52, 91,248,237,230,196,196, 40,162,164, 50,116, 55,189, 4,197,205, 43,232, 46,157,208,188, -134, 43,181,227,204,147, 98,157,154,251,138, 10, 21,118,198,139,200,100,252,189,121, 61,215,189,190,219,211,242,133, 28, 94,130, -199,159, 0,162,108,178,201, 99,126, 65,119,217,132,206,117, 82,169, 45,218,233,197, 29, 28,230, 9,157,157,107, 33, 54,226, 30, -246,173, 11,224,122,212, 87, 61, 45, 95,200, 33, 4, 28,247, 39,104,202,230,244,217,122,114,225,133, 30,141, 71,183, 88,191,126, -253,145, 17, 35, 70, 40, 42, 85,170,132,231,207,159, 99,250,244,233,122,131,193,208,122,219,169, 69,182,119,210,120,138, 79,243, -138,177,107, 55,111, 53,153,173, 28,101,101,121,202,196,130,182, 88, 57,202,204,114, 20,203,113,148,139,163,244, 77,163, 75,243, - 54,143,141,211, 52,157, 48,120,240, 96,101, 70,223, 75, 36,146,108,237, 98,159, 46,178,254,220,124,231, 68,143,118, 14, 14,219, -247, 95, 73, 74, 77,213,103, 75, 92,125, 40,178,230,206,157,187,111,224,192,129, 14,107,214,172, 73, 74, 73, 73,201, 15,226, 10, - 0, 82, 0,248, 2, 8, 2, 32, 5,240, 88,173,210,136,145,131,147, 67, 30, 60,120,112,243,229,203,151,222,253,250,245, 67, 98, - 98,162,115,183,110,221,240,244,233, 83, 4, 5, 5,229,104,223,175,244, 69, 37,215,174, 93, 11, 4,208, 39, 55, 35,129,231,121, - 3,128,215,105, 31,194, 55, 8,197,243, 25,123,238,242, 98, 15,153, 94, 77,199, 90, 90,180,104,193,158, 62,125,218,104, 54,155, - 71,178, 44,155,239,142,202,153, 60,112, 25, 19, 19, 19, 35, 4, 96,205,108,199,247,140, 10,107,102,212,173, 91,247,149,209,104, - 44,152, 38,168, 98,204,102,179,247,214,147, 11,173, 63,180,250,229,127,174,127, 45, 71,229,124,152,143,122, 53, 29,171,225, 56, -238, 32, 0,197,214,147, 11, 41, 0,232, 58,209, 84, 2, 52, 53, 0, 52,119,130,210,179,119,182, 47,148,199,124,234, 13,248, 30, - 39,156,179,107,213,159,173,229, 35, 79,108,222, 27, 44, 1,184, 26, 0, 61,225,105,120,106,145,127,207,198, 21,247,175,219, 64, -112,228,204,137,119,197,213, 60, 80,184,244,184,194, 74,131,205, 54,121,212, 6,133, 9, 79,194, 83, 11,110, 60,157, 80,194,175, -254, 8,230,218,169,133,239,138,171,121,160,233, 11,182,218,124,151, 30,141, 71,215,149, 72, 36,135,123,244,232,225,176,117,235, -214,247,196,149, 45,113,244, 56,225, 28, 74, 62, 28, 84, 8, 86,234,119, 0, 5,109,168,221,130, 97,193, 76, 52,124,248, 42, 63, -228,251, 95,186,106,106,200, 68,162,157, 70,131,121, 96, 78,196,213,187,116,111, 52,170,161, 92, 46,223,160,215,235,187,127, 40, -174, 62,215, 6,150, 20, 69,185, 0,168, 7,224, 82,176, 78, 27,173, 86,105, 28, 0, 84, 3,240, 42, 88,167,125,150, 29,155,106, -149,166, 78,179,102,205,206,206,154, 53, 75,224,232,232,136, 39, 79,158, 96,230,204,153,236,197,139, 23,155, 4,235,180,103,114, - 90,238, 8,132,175, 66, 96,245,111, 51, 57,136,162,168,115,169,169,169,228,176,231,111,132,140,142,202,161, 40,106,242,214,147, - 11,155, 1, 64,143, 9, 6, 47,150,162, 21, 12, 79,153,182,206, 21,133,124,142,248, 76, 15,167,173,141,125,110,231,141,108, 28, -149,243, 86,100, 5,135,166, 20,221,125, 49,190,112,235,154,170, 87,217, 17, 87, 31, 19, 89, 65,161, 41,133,118, 95, 74, 44,220, -166,134,242, 85, 78,197,213,187, 34, 75, 42,149,110,208,235,245, 3,222,245, 92,217, 44,176,194,135,136, 16,111,241, 5,207, 84, - 0, 15,113,198, 14, 57, 62, 21, 66,230, 30,194, 17,137,206, 15,200,112,243, 39, 46, 71,106,149,198, 29,111,134, 8, 5,120, 51, -172,114, 63, 88,167,125,154, 19,187,106,149,166, 30, 77,211, 19, 74,148, 40, 81,233,233,211,167,247, 88,150,253, 35, 35,113, 69, -234, 99, 66,190, 23, 88, 4,194,183, 42, 4, 51,171,156,179,219,241,200, 19,155,233, 34,139,167, 70,128, 70,193, 55,243,163,168, -197,217, 17, 87,255, 43,178,248, 81,160,224, 5,158,138, 1,199, 45,204,169,184,202, 77, 1, 90,210, 73, 67, 97,122, 38,243, 33, -166,129,127,156,240,230,204, 76,210,208, 18, 8,132,124, 39,176,242,195, 49, 19, 4,194,151, 74, 78, 27,246,220, 44,127,159, 67, -100,228, 36,252, 68, 20, 17, 8,132, 47, 29, 1,137, 2, 2, 33,255, 9, 12, 2,129, 64, 32,124,217,208, 36, 10, 8, 4, 2,129, - 64, 32, 16,114, 23,226,193, 34, 0,200,249,144, 12, 69, 81, 8,214,105, 73, 68, 18, 8, 4, 2,129, 0,226,193, 34,228, 18,100, -177, 4,129, 64, 32, 16, 8,255,207,103,247, 96,165,123, 78,200,124,149, 47,155, 47,217,131,149, 27, 19,170,243, 75,254,253,216, -187,228,183,178,149,147, 50,255,225,111,108, 77, 59,123,247, 56,203,139,188,240,225,243, 63,118, 95, 70, 97,204,202,102,102,113, - 73, 22, 12, 16, 8,249, 72, 96,125,202, 10,153, 8,171, 79, 35, 18,242, 83, 60,127, 44,172,206,206,197,112,229,249,186, 92,127, -247, 46, 93,186, 96,230, 95, 67,191, 72,225,150, 91,123,109,229,215, 6, 54,167,157, 43,123,222, 43, 63,198, 65, 73, 39,255,108, -111, 86,251,161, 96,252,152, 45, 91,236,219, 42, 6, 63,188, 55,191,237, 81, 71, 4, 38,225,139, 17, 88,132,175, 75, 92,217, 91, -153,127,142, 48,198,199,255,255, 6,207, 14,158,197,113, 51,104,109,174,216,221,177, 99,199,103, 21, 89, 95,130,152,179,183,113, -202, 78, 67,155,217,125,239,126,151, 23,187,227,231,231,244,200,206,187,103,100,223,214,107,159,187,195,156,217, 59,103,183,147, - 64, 70, 66, 8, 95,172,192,202,201,176, 67, 94, 28, 19,146, 85,129,205,234,239,111,181, 97,253, 92, 34,203,222, 74, 62, 57,242, - 41, 36, 46, 69,113,239,217,250, 92,121,126,104, 72,240, 55, 91,192,237,217,157,222,214,116,203,203,124,100,139,237,175, 69, 92, -125,137,239,149,219,123,155,229,182, 48,250,220, 29, 73, 2,193,110,129,149, 19, 17,100,207, 60, 3, 91,230, 40,216, 91,136, 63, -246,119,126,158, 47,147,215,189,248, 47,165, 2,114,118,243,205, 53, 91, 98,209,183,185,150,227,115,123,131,242, 66,104,144,225, -158, 47, 79, 60,126, 9, 30,118, 2, 33, 47,160,179, 83, 88, 72, 37,151,183, 21, 21,137, 95, 64,166,116,205, 53, 91,124, 38, 39, -170,124,205, 98,138,228,163,111, 79, 44,231,198,239,114, 43,223,124,174,182,130,228,123,194, 23, 43,176, 62, 85,225,249, 90,230, - 98,144, 10,224,243, 67,209, 95,231, 22, 18,233,101, 48,179,178,248,181,229,181, 47,193,203,145, 87, 98, 40, 55, 70, 15, 62,165, -184,250,156,245, 34,169, 99, 9, 95,180,192,250, 88, 37,255,185, 42,201, 15,237,101,245,247,215, 46,174, 30, 39,156, 35,238,246, -119,176,152,173, 95,165,184,250, 18,197,199,183, 66,122, 25,180, 69, 52,217, 83, 94,115, 58, 17, 62, 59, 34,253, 75, 21, 55, 68, -100, 17, 62, 55,130,252,152, 73,223,157,152,155,221,138, 39, 63,139, 44,194,167, 69, 40,118,253,170,222, 39, 63,120,171, 62,103, -227,245, 41,247,180,202,175,226, 45, 55, 86,111,126, 11, 16,145, 69,200,215, 2,235, 91,173, 36,243, 98,101,226,167,122,223,111, -169, 82,201, 42, 31,213,240,171,128, 77,167,151,145,146, 78,200,151, 13,124,118, 38,119,127,206, 78,111, 94,138,252,111, 93, 56, - 19,190, 62,232,204, 10,177, 45,153,221, 94, 23,119,102,133,214, 30,177,146,221,251,115,163,146,204,234,111,210,147,202, 63,188, -142,140, 37,145, 96, 99, 25, 38,124,157,105,155, 31,108,124,201,239, 79, 32,100, 23, 65,118,197, 0,201,184, 57, 47,248, 57,221, -166,225,107, 38, 54,252, 73,174,196,165, 88, 44, 38, 13, 44,129,164,125, 62,207, 63,182, 78,240, 39,109, 19,225,139, 23, 88,159, - 43,243,126, 43, 5, 35,253, 61,115,250,190,217,113,169,127, 41,113,108,230,245, 54,223,155, 89, 28,152,205,102,210,168,126, 69, -157,143, 47,137,140, 22, 34,228,197,222,124,217,157,182,144,147,141,104, 63, 71,157,148,147, 35,115, 8,132,124, 47,176, 50, 43, - 60,121,113,212, 67,126,169,228,179,250,251,115, 53,124,246,132,227,115, 85, 62,246, 84,226, 14,170,162,184,249, 98, 61,238, 4, -174,203,149, 56, 16,137, 68, 95,165,136,250,156,171, 8,243,234, 76, 58,210, 56,126,190,248,251, 28,162,150,164, 55,225,155, 20, - 88,159, 34,227,127,137,251,217,228,215,149,137,182, 84,142,249, 33,172, 89,133,147,162, 40, 4,235,180,185, 98, 59,221,214,177, -219, 27,190,218,198,244,115, 45,171,183, 87,208,147, 97,157,111, 79,232,229, 86, 71,220,158,103,144, 60, 68,200,111, 80, 60,207, -147,202,142,240,201,121, 79, 12,249, 84, 69,112,224,194,124, 17,150,220,236, 48,228,212,110,110,150,195,220,246, 78,228,198, 38, -150,159,187,158,249, 84,233,243,177, 33,192,156,158,143,250, 53,159,175, 74,200,223,245, 53,129, 8, 44, 2, 41, 44, 95,108,239, -159, 64, 32, 16, 72,155,241,229, 67,147, 40, 32, 16, 8, 4, 2,129, 64, 32, 2,139, 64, 32, 16, 8, 4, 2, 33, 95, 35, 32, 81, - 64, 32,228, 31, 62,165, 43,158, 12, 71, 18, 8, 4, 91,235, 10, 50, 76,104, 63,196,131, 69, 32, 16, 8, 68,148, 19, 8,132, 92, -134, 76,114,207, 5,212, 42, 13, 5, 0,193, 58, 45, 79, 42,249,111,139, 54, 83,108, 47, 43,251,103,124, 59,113,212,119,225,237, -255,237,205, 21,118, 67,202,190,153,229,221,221, 60, 61,253,202, 21, 10, 7,240,188,111,223,190,134,236,218,179,151,159,127, 72, - 38,149, 21,129, 64,234,248, 79, 70,134, 71,229,124, 76,100,169, 7, 46, 19,121, 4,243, 7, 24,161,176, 33,207, 90, 5, 28,103, - 29,123, 78, 59,114, 65,126,123, 41, 77,221,133,101, 28, 85, 78, 63,210, 12, 37,136,143,215,173, 58,119,110,244,253, 60, 20, 87, -178,223, 6,148,107, 37,160,105, 78,173,210,236, 13,214,105,217, 92,176, 41, 1, 80, 16,192,171, 96,157,214,100,203,111,202,171, -199,149,151, 58, 42, 15,155,146,204,245,238, 6,205,120,153,203,239,232,236,229,229, 85,142,101,217, 2, 52, 77,135, 70, 70, 70, - 62, 8,214,105,227,108,253,253,135,121,201,175,212,143, 5, 1, 4,184,123,250,212,142,142, 12,187, 10, 96,227,173,160,213, 47, -236, 41,204, 89,117, 2,108,221, 69,219,238, 74,166,195,178,245, 38,139,181, 9,120,158, 18, 10,153,203,101,202, 85,234,248,169, -243,247, 79,139, 47,189,253,247,138, 81,117,168,158, 63, 78, 24, 18,155,160,159, 24,153, 96,246,116, 84, 58, 38,186, 42,133, 11, -239,222,184, 52,183,217,247, 51,223,230,197,229, 35,107,103,235, 89,189, 23, 62, 0, 0,108, 26, 93, 46, 71, 97, 94, 55,186, 50, -181,106,247,141,225, 49,181, 91,207,190,116,240,239,157, 7,246,108, 17, 24, 13,201,179,250,246,237, 27,104,143,157, 3,107,126, - 73, 53,243, 98,137, 84,192, 25, 90,246,157,174, 32, 85, 56,129, 64,248,162, 4,214, 71, 27,217,129,203, 68,158,207,232, 56,117, -169, 34,138,105,163,122, 98,237,190,235, 56,117,252,232, 92, 0,249, 66, 96,213,174,255,135,143,147, 84,209, 87, 40, 18,255, 80, -190, 66, 41,135,142,173,155,184,128,162,176,247,208,169,174,109,219,252,147, 98,101,185,245,250,164,228,127,206,156, 31,253,218, - 22,123,254, 13,150,189,226, 89, 75,193,204,238, 81,184,248, 28,152, 51,184,252,246,241,189,212, 51, 86,236,126, 54, 31,128, 27, -128,200,143,221, 91,191,201, 63,135, 41, 70, 82, 20, 0, 40, 26, 96,104, 10, 96,205,225, 39,142,124,223,240, 67,193, 54,103,112, -249,118, 99,122,168, 71, 8,235,237, 26,161, 86,105,174,103, 37,218, 42,148, 29,223, 66,233,226,114,160, 84,149, 6,204,227, 91, -167,130, 42, 84,152,216,241,222,189, 57,135,114, 40,170,196,238,238,238,165, 4, 2, 65,233, 70,141, 26,137,135, 14, 29, 42,110, -218,180, 41,142, 31, 63,174, 94,190,124,121, 33,255, 82, 93, 44, 38,147,233, 97, 66, 66, 66,112,176, 78,107,180,213,174, 95,169, - 31, 11,212,174,215,240, 65,143, 31, 70, 56, 8, 21,110,120,246,226, 69,139,221, 27,254, 28,231, 87,234,199, 74,183,130, 86, 63, -205,173,252,224, 89,190,141,135, 88,230, 48, 82, 64, 83, 29, 44, 44, 14, 25,173, 73,243, 47,156, 30, 27,158, 83,187, 70,179,185, -218,184, 49,163,189,141, 22, 30,127, 46, 90, 88, 51,171,251,175, 31, 94, 21, 4,154,118,162, 64,193,231,216,223,160, 40,128, 6, - 5,138, 2, 0,220, 57,113,180,127,243,236,244, 20,245, 47, 78,213, 77, 49, 88, 23, 86,106,252,125, 5,119,175, 66,226, 81, 35, -218,162,116, 17, 15,220,126,145,228,178,126,231,137,223, 37, 47, 99,167, 63,189,177,255, 62,109, 78, 28, 80,180,118,239,155,182, -188,155,123,149, 94,201, 6,131, 89,194,209, 66, 10,160, 40,154,211, 91,229, 34, 36, 52, 9,248,205,163,247,194, 7, 54,139,172, -119,189, 77,109,107,121,210, 65, 47,227, 23,172, 56,252,186,139, 80,162,208,105, 79,172,254,215,191,186,159,178, 72, 65,111, 28, - 62,124,248, 55,154,166,239, 3,216,195,113,220, 61, 91,236,153, 33,149, 36, 61,218, 67,139, 75,116,146, 95,214, 30, 75,146, 72, -196,102,177, 72,144, 36, 98, 16, 38, 18, 82,207, 5, 12, 29, 36,100,168,107,206, 74,197,197,255,142,158, 79, 54,154,245,140, 84, - 36,176,180,239, 61,226,147, 30, 74,153, 93, 33,255,169, 71, 15,210,195,105,203,115,109,189, 55, 47,108, 18, 8, 95,181,192,242, - 8,230, 15,150, 46, 91, 76, 49,115,202, 56,140,254,243, 12, 94, 93, 61, 10,158,181, 76,200,173,128, 84, 42,251, 83, 1, 1, 37, - 26, 68,209,148, 19, 40, 90, 6,142,125, 37, 54,153,230, 95,120,188, 34, 37,171,223,214,169,189,196, 75, 32, 18,190, 42, 81,188, - 40,166,141, 31,194, 56,171, 28,223,126,215,160,110,117, 23, 93, 66,146,203,239, 11, 86, 77,185,118,243,254, 84, 77,131, 69, 69, - 1,188,212,158, 25,149,169, 77,158,179,122,255,185,108, 57, 60, 84, 18,196, 36,154, 49,108,232, 80, 44,249,243, 79,248,184, 74, -145,164,103,241,215,177,208,176, 42,201,243,206,142,111,163,158,177,245,228,235, 21, 67, 23,222,190, 7, 32, 85,173,210,124,124, - 55,114, 90, 80,108,253,202, 89, 37,125, 93,197, 96,104, 26,241, 41, 22,244, 28, 56, 94,212,162,237, 22, 28,249,175,231,123,226, -106,124, 47,245,140,149,123,159,111, 4, 32, 4, 32, 85,171, 52, 41, 25,237,112, 94,161,236, 47, 67, 28,157,221,150, 54,236, 50, -150, 86, 23, 43,136, 58,213, 43,139, 47,156,216,123,160, 93,171, 21, 48, 24,244,188,217,202,135,197,198,197,143, 7,176,253,254, -131,217, 54,165, 69,115,191,239,235,149, 42, 85,170,232,128, 1, 3, 68, 93,187,118,103,126,158,187,161,229,228, 63, 15,214, 26, -242,219,102,149, 74,233,152, 88,161,140,255,181, 75,107,214, 30,216,191,119,119,181,149, 43, 87, 86,108, 92,161,215,203,144,144, - 16,155,106, 72,177, 88, 50,184,223, 79, 19, 28, 46,157, 59,137,227,251, 54,160, 74,227, 94,168,211,102,136,252,197,195, 27,163, - 0,252,148, 27,121,169, 97,227, 63, 92,139, 23, 47,122,111,244,168, 81,174, 46,174,174,244,241, 75,193, 37,254,219,190,170,123, -221,134,243,171, 68,223,242,183, 89,100,149,236,176,108,189,201,108,105, 2,128, 18, 10,153,203, 79,247, 14,239, 8, 0,169, 70, - 43,246,237,219, 7,208, 84,150, 67,194, 50,185,131,243,138,197,191,187, 57,202,132, 96,104, 10, 12, 67,129,161, 41, 68, 39,154, - 49, 96,240,168,146,217,121,191,160,235, 71,131,165, 98,166, 88,159,174,109,152, 86,154,242, 16, 9, 5,176,178, 64,178,145,131, -218,199, 1,127,140,105, 15,122,116, 91,193,145, 75, 79, 42,255,181,245,240,245, 27,231, 15, 71, 98,100,109,239,172,236, 26,140, - 22,201,205,211,219,104, 23, 5, 77,241, 60,144,100,228,132, 21,235,119,119,201,174, 55,235,193,173,243,113,145,145, 37,156,171, - 86, 46,111, 18, 37,199,140, 20, 36, 94,223,115,251,252,193, 69,149,139,246,130,167,167, 39, 70,142, 28,137,148,148,148,242,123, -247,238, 45, 47, 16, 8, 94,113, 28,183,138,227,184,199,153,217, 20,178,201, 22,169,186,147,216,193,167, 28, 14,175, 25,239, 16, -151, 2, 68, 37,241, 46, 97, 58,190, 72, 68, 92, 82,221,200,200, 72,132,133,133,225,246,203,151,208,167,196,195,242,100, 23,228, -149, 7,145,197, 60, 54, 8,157,204, 68, 78,118, 4, 99, 94,216,204, 47, 98,243,115,218, 36,194,244, 43, 20, 88,180, 80,168,249, -117,100, 79, 76, 92,121, 9,175,174,110, 3,207,190, 25, 30,172, 91,127,241, 16,177, 64,188,216, 98, 49,253,156,157,225, 66,117, -229, 62, 18, 7,214,117,138,135,155,231, 15,154, 86, 1,188,131,210,137,143, 73, 48, 90, 94,191,122,138, 39,215, 15, 14,168, 90, - 97,228,194, 27,247, 22,103,106,247,226,165, 17, 17,254,154,249, 37,158,191, 10, 29,245,195,176,201,157, 27,214,171, 46,235,208, -186,169,146,162, 40,236, 57,120, 34,229,180,246,138,158,231,177,135,227,184, 5,224,240,242,194,133, 49, 54,133,205,197, 65,132, - 17,171, 31,193,194,190,105, 71, 61, 84, 98,204,252,247, 5, 36, 34, 58,172, 74,242,188,133,147,219, 88,126,218,112,214,188,101, -218, 1,223,230,112, 12, 90, 11, 32, 57,248,229,254,140, 69,170,147, 8,195, 86, 5, 65, 38, 21,192, 73, 46, 2,147,230,198,248, -152,184,250,105,254,173,179, 0,130, 1,100, 40,174, 42, 87,158,186, 88,229,230, 49,188,113,247,241, 84, 81, 95,119,120, 57, 75, -224, 83,162, 42,252,107, 87,163, 0,192, 96, 50, 83,151,175,222, 44,176,115,243,170,173,177, 81,113,142,149,203, 77, 90,125,251, -193,239, 89,123, 71,244,250, 2,123,247,238,101,221, 60, 61,163, 91,245,153,182, 88,238,224,228,221,171, 79, 63,145,167,151, 55, -226,227,117,206,167, 78,157,104,212,190,255,111, 21,182, 46, 30, 51,220,106,181, 50, 51,102,204, 40,104, 79,154,167, 24,172, 48, -152, 89,176, 44, 15,189,137, 5,109,176,100,199,195,198,100,232,217,179, 10, 39,143, 28, 49,220, 61,214,164,196,206, 99, 58,168, - 20, 94,148, 79,133,118, 30, 73, 23,255, 29, 7, 96,148, 61,222,170, 81, 35, 71,123, 3,192,194, 5, 11,106,150,236,176,108,189, -193, 96, 46,249,251,239,191, 67, 40, 96, 44,174,206, 78, 39,179, 20, 88, 82, 17, 24,154,198,172,157, 47, 32,147, 8, 32, 19, 51, -144,137, 5,144, 73, 24, 80,239,164,191, 61, 68, 68, 70,121, 6,158, 92,197, 88,172,111,242,101, 66, 42, 11,147,149, 7,207,115, - 0,199,193,202,208,160,105, 6, 65,161, 73,184,124,252, 24, 37,116,240,118,183,197, 46, 75,203,104,149,156,166, 22, 31, 75,134, -147, 82, 65,121, 41,193,243, 16,102,187,114, 9,126, 22,234,220,189,247, 64,126,231,238, 61,226,199,119, 47, 46,155,212,183,102, -247,210, 37, 75,132, 38, 38, 38,190,189, 71,169, 84, 98,240,224,193, 48, 24, 12,133, 70,140, 24,209, 13,192,111,153,217,108,243, -227, 60,201,235,171,155,124, 66, 12,178,144,237, 87,244,116, 65, 55, 9, 60, 28,128, 42,133, 40, 56,150,118,130,131, 68, 5,153, -168, 52,196, 2,192,197,255, 57,196, 37, 59, 65, 46, 21,155,190,182,138, 59,183,142,162,121,119,216,220,150, 97,117, 91,108,127, -104, 51,171, 83, 14,242,155, 72,200,141,195,183,243,194,102, 86,231,247,230,183,120, 28, 55,110, 92, 94,153,230, 1, 80,153,124, -135, 76,190,183,155, 63,254,248, 35,219,191,181,125, 21, 33,103, 21,169, 92,220, 96,229, 1, 42, 45,236,117,235, 47, 30, 34, 19, - 75,151, 15,235,223, 73,200, 48, 2,187, 67, 81,177,244,143,133,149,172,234,222,208,225,163,186,239,223,187, 11,154,122,254,209, -180,162,192, 83,133,179,111,168, 79,193,178, 17,197,107,116,143, 20, 73,157, 70,251,149, 30, 18,144,145,141,166,205,254,186,221, -226,187,181,199,121,142,246, 74,208, 37, 14,127,148, 34, 42,184,239,208,201,126, 67, 39,204,188, 57,116,252,204, 59,123, 14,159, - 30, 72,197,166, 22,160,227, 82, 7, 51, 2, 94, 44, 83, 58,239,110,218,226,159,139, 77, 91,252,147,101,248,162, 18, 76, 96,249, -255, 79,169,132, 20, 43,228, 18,230, 61,113,181, 55,190, 87, 95,163,201,210,160,176,170,189,161,176,170,125,134,182, 40, 0, 52, - 77,193, 65, 38,132, 82, 42,132, 82, 38, 4, 77,211,160,105, 58, 35,113,245, 8, 64,116, 70,226,170, 82,217, 73,221, 21, 14,142, -195,155,245,158, 66, 21,246,113,131,151,139, 4,222, 46, 82,208,244,155,208, 90, 89, 14,113,201, 44, 28,189, 74,161, 65,231,177, - 84,161,146,165, 86, 9, 69,252,181,234,126,191,216, 38, 46,140, 70,217,144, 9,139,190, 87, 56, 56,121,253, 56,120,152,168, 64, -193,194,160, 24, 33,100, 74, 23,212,107,218, 65,232, 89,168,140, 91,207,161, 51,251, 63,125,250,212,201,158, 52, 55,153,140, 43, -255, 89, 49, 55,217,179,120, 53,116, 25,191, 17,174,133,171,224,226,127, 43, 77, 28,207, 46,178,199,206,175,191,254,234,211,201, -127,104, 81,181, 74, 35,251,240, 59,145,136,238,229,225,225,129,179, 15, 83,145,104, 96, 17, 18, 99, 68, 82,170,129, 18, 50, 84, -139,204,108,250,248,248,244, 83,151,173,184,187, 84,217,202,123,125,124,124,134,167,137, 84,236,220,189, 7,160, 41,222,104, 54, - 87,155, 58,121,162, 96,234,212,169,144, 75,165, 49,143,247, 12,253, 62,171,112, 82,160, 32, 96, 40, 40,164, 2, 92, 63,184, 52, -225,244,182,217, 81,135, 54,252, 30,181,107,245,111, 81, 20,197, 63,206, 86,161,229,244,172,209,196,130,231, 41, 68, 39,179,136, - 75,225,145, 98,224,144,100,160,160, 75,101,177,116,231, 13,148,107,220, 31,155,182,237,197, 15,163, 39, 64,238, 44, 55,219, 84, -107,241,111,170, 39,103, 71, 5,229,165, 4,220,149, 20, 56,138,194,149, 67,127, 95,187,118, 96,233,165, 91, 71, 87, 31,125,215, -147,149,165, 61,125, 20, 95,163,152,144,242,242,242,198,190, 77, 75,152, 11,207, 24,255,251,175, 76, 5, 31,196,187,152,158,165, - 56, 27,226,147,173, 72, 73, 73, 65, 74, 74,138, 93, 29,190, 2, 53,122,135,121,202, 83,255, 56,122,244, 40,116,169, 28, 66,117, - 44,158,199,112,120, 28,197, 33, 40,130,197,227, 72, 14, 51,118, 71,192,211, 89,161,111, 80,175,186,115,219, 62, 99,101,223,138, -184,202,142,103,200, 86, 47,147,189,194, 45,163,240,124, 9,199,252,228,133,119, 45,187, 54, 75, 58,249,219,244, 91, 91,239,203, -237,223,126,102,248,143, 8, 47,234, 35,223,229,111, 15, 22, 79, 49,166,152,232, 40,113,177, 34, 5,225, 34,235,131, 91, 39, 55, -206, 23, 11, 40,172, 91, 60, 17,143, 34, 56, 8, 69, 66,187, 38,119, 87, 44,253, 99, 97,137, 72,118,124,237,186, 77,198, 74,101, - 10, 43,151, 31,120,121,226,101,116,170, 33, 57,246,181, 60, 37,230,133, 67,252,235, 71, 30,201,186, 48,165,144,134,217,194, 48, - 63, 3,216,248,209, 23, 16,137, 92,190,235,208,171,210,213,243, 39,171, 68, 69,134,234,188, 76, 9,115,133, 58,229, 38,131, 14, -187,142,221,254, 30,106,213, 25,154,173,244,160,181, 88,170,156,236,225, 94,198,183, 84,213,134,158,183, 79,111, 15,182, 37,140, -163, 71, 12,125,239,239,217,171,246, 37,180,242,210,190, 39,174, 60, 11,148,240,165,104, 65,150,239, 78,209, 20,226,146, 45,144, - 75, 4,112,144, 9,225, 32, 19,128,166, 41, 60, 58,181,194,110,113, 5, 0, 6, 86,186, 95,110, 49, 90, 18, 94,223, 16, 85, 45, -217, 12,222,206,146, 55,243,186, 0,176, 44,143,168, 4, 19,162,211, 62,188,216, 9,141, 58,143,194,129,181,211,252,236, 73,163, -167, 33, 49,181,186,247,234, 43,166, 40, 10, 86,150, 71,170,201,138,196, 84, 11, 98, 18,140,112, 47, 86, 67,248,228,193,181, 90, - 0,246,218, 99,243, 86,208,234,215,126,165,126, 44,247, 40,240,254,233, 95,102,253, 85,140,150, 26,144,148,168, 11,148,187,151, -138,179,199, 78,177, 98,197, 44,139, 22, 45,114, 90,177, 98, 69,227,122,234,206,175,206, 7,239,188,155,230,217, 42, 80,184,124, -253,232, 83,151, 31, 57,187, 43,125,169,164, 84, 35,146,162, 94, 32, 53, 42,136,183,242,252,193,204, 5, 6, 95,237,206,141,171, - 29,104,154, 66,241,154,221, 10, 25, 12,230,146,115,231,206, 5, 0, 8, 5,140, 39,199,113,238,246, 12, 15, 2, 0, 77, 1, 2, -134,130, 92, 34, 0,107, 54,234,142, 31,233, 95, 52,199, 53, 10,197, 80,201, 70, 30, 12,195, 33, 33,149, 67,146,158, 67,170,153, -195,173,151,102,236,250,247, 95,120,171,120, 12, 30, 62, 6,148, 88, 5,179, 62, 9,128,201,166,176, 50, 48,242,177, 41, 28,229, -169, 4,239,161,164,224,173,228,121, 10,192,134, 21, 51, 69, 6, 19, 43, 24, 52,122,250, 91,119,150, 45,115,178, 24, 10,188,222, - 12,138,227, 56, 56, 43, 40,204, 29,219, 13, 91,170,250,215,189,119,227, 60, 94, 5,223,129,131, 55,187, 71,136, 55,139, 8,105, - 58,227,190,222,186,209,149,223,251,187,239,194,219, 40, 86,173,221,196, 27,218,125,189, 94,132, 84,245,169, 82,218, 7, 98, 33, - 7, 17, 67, 67, 34,164,112,242, 65, 10,182,108, 92,103, 41, 95, 80, 81,209,165,164,191,142, 12, 84,216,231,201,202, 11,155, 25, -121,199,242,187,144,205,237,131,169,243,194, 59,150, 87, 30,177, 47, 36,173,168,108,126,151,127, 4,150,166,238,130, 81, 2,169, - 76,236,232,160,128, 74, 97,130, 66, 90, 28, 37,126, 24,137,158, 26,119,132, 25,156,177,115,215, 34, 88,173,214, 43,246,136, 43, -177, 64,124,116,229,234,191, 95,151, 85, 23,146, 47, 59, 24,178, 71,111,178,176, 98,107,172, 60, 49,233, 37, 21,246,240, 84, 81, - 93, 84,168,144,229,173,203, 24, 90, 80,155,231,185, 76,231,143, 20, 44, 82, 2, 5,139,148,112, 78, 78, 74,112,190,121, 69,187, -232,254,237,171,227, 1,148, 0, 0,159,234,207, 47,184, 23,245, 47, 91, 64, 93, 67, 41, 87,200, 32, 22, 50,224,109,212,181,127, - 46, 91, 14, 31, 87, 41, 18,245, 44,102, 44,219,155,208,210, 67, 59,243, 61,113, 85,176,132,175, 82,169,180, 45, 23,240,214,103, - 63, 12,249,133,103, 24, 10, 52, 77, 65, 64, 83,176,154,141, 81,217, 17, 87, 0, 16, 28, 52, 57,181, 74,233, 17,190, 23,142,237, - 58,117,251,220,126, 53,195, 48,140, 66, 46,163,171, 84,175, 69,149,171,218, 0, 70, 40, 16,157, 96, 68,178,209, 2,165, 84,128, -203,167,247, 34, 42,236,249, 20,123, 50, 71, 82, 82,138,179,187,167, 23, 44, 44, 15,189,145, 69, 66,138, 25,209, 9, 70,132,197, -234, 17, 26, 99,132,222, 96, 82,242,111,218, 96,187,184, 21,180, 58,164,158,255,162,133,183,110, 92, 89,222,160,105, 91,116,234, - 61,200,239,192,174,205,247,234,249, 47,234,127,254,220,168, 99,182,216,216,191,127,127,116,129, 2, 5, 60,255,250,235,175,200, - 89,179,102, 85,108, 84,190,103,217,208,208,208,221,174,174,174,253, 39, 12,235,165,221,176,119,125, 1,135,130,181,228,113,137, -169,148, 81, 23,202,235, 99, 30,199,152, 12,134, 44,189,172, 20, 77, 35, 54, 54, 6,156,200,201,233,151,159, 39, 10,156,210,124, - 31, 49,201, 28, 51,111,222, 92,126,197,242, 63, 31,234,245,134, 98, 0,229, 89,168,213,162,240,172, 86, 18, 82, 20, 5, 33, 67, - 67, 33, 17,128,162,128, 58, 53, 23, 56,208, 18,225,107,112,172,227, 71, 69,137, 80,252, 32,252,166,127,249,204,194,200,114, 34, - 58,201,192, 35,197,108, 69,170,145, 67,178,129,131,222,204, 65, 34,164,208,173, 91, 23, 88,173, 38, 24,204, 60,244, 6, 35, 76, -102,128,231, 5, 89,166, 81,239,133, 15, 32,151, 74,245, 53, 27,117,145,114, 20, 13,158, 22, 80, 60, 79, 65,232, 92,148, 63,247, - 32,158,114,148,139,132,156,192,193,174,137,226, 44,104, 20,114,166,240,199,208,250,152,176,252, 12, 88,150,195,172,159, 26,161, -187,127, 39,180,239,117, 42, 49, 53,193,132, 68, 78,250,166, 34, 18,216, 63, 77,202, 75, 97,105,126,248,224,190,123,126,165,135, - 82, 98, 1, 13,177, 0,184,246,156,197,170,149,203,184, 50,222,146,250, 46, 37,253,159,130,144, 47,133,219,151, 50,119,232,107, - 21, 89,159,200, 91,197,127, 68,240,240,153, 8, 32, 91,191,195, 71,188, 86,252, 7,247, 81,248,223,161,196,140,236,243, 31,185, -159,207, 13,161,150,101,173, 86,199,127,241,112,137, 84,186,240,239,249, 19,112,232, 1,143,248,184,120, 8, 96,128,139,143, 55, -142,220,140,195,169, 99,155,240,252,233, 99, 83, 24,156,154,217, 44,174, 24,209,225, 5, 11,151, 94,171, 88, 78, 45,216,125, 37, -242,140, 68, 68,177, 98,161,156, 50,199, 24,156, 40,107, 50, 18,162, 95,251, 36,169,248, 18,193, 23, 86,153, 1, 44,177,245,101, - 28,148, 78,168,223,180,173, 60,248,193,109,217,255, 55,152, 66, 23,183, 18,117,148, 16,208,176,178, 60, 24,218,118,175,161,135, -211,255,207,185,250,206,243,204,194, 15,197,149,163, 82, 9,137,136,177,201,214,169,163, 63,180,124,247,239,236, 12, 11,126,200, -205, 71, 75, 98, 0, 84, 72,255,187,114,197,201,158, 79,158,191,152,234,114,252,232,143, 77,186,141,167, 33,113,134,131,228,141, -184, 10, 60,191,115, 10,128,217,119, 31, 45,182,249,253,149, 74, 69,124, 92,188,206, 67,225,232,134,132,148, 55,158,171,176,216, - 84,188,136, 76,134,147,140,134, 76, 42, 78,162, 40, 42,187,110,216,191, 79, 31, 63,212,214,104,182, 54,173,215,184, 13,250,120, - 20,242, 61,176,227,159,195,245,252, 23, 53, 62,127,110,212,153,172,126, 60,243,175,161,172,127,169, 46,143,163,162,162,252,103, -207,158, 29, 89,186,116,233,194,211,167, 79,255,213,205,205,205,125,208,128,126,207, 91,127,215,122,221,220,229, 91,235, 30,185, -117,177,132,209,200,109,227, 25,243, 47,231,206,143,139,205,178, 70,224, 56,152,205,111, 70,212,222, 12, 15, 30, 4,199,113,255, -175,151, 64,169, 56,142,167,167, 76,158,196, 88, 57,222, 43,171,149,132, 22,171, 21, 70, 11, 7,185, 84, 0, 10, 20, 40,129, 88, - 46,149,138, 69,203,150, 44,132, 66,202,128,162, 0,134,166, 33, 96, 40,188,142, 74,193,240,145,163,179,156,207,198, 81, 98, 65, -138,137, 67,146,145, 71,170,145, 71,170,137, 67,170,209, 10,138,162, 97,230, 0,131,209, 10,189,193, 4,163,209, 8,163, 65, 15, -158,179,218,148, 32, 77,187,143,126,219, 91,184,122,112,213,213,117, 43,102, 75, 46, 61,138,231, 28,165, 66,200,165, 2, 6, 60, -143,135,103, 54, 12,176,152, 18, 83,249,212,248, 24,140,222,117, 34, 83,129, 69, 41, 40, 71, 41,133, 36, 99,122,189,197,165,121, -171, 24,112, 22,147, 62, 37, 33, 6, 2, 56, 1, 0, 68, 34,145,205, 25,103,221,232,202,232,187,240, 54,124,170,116,126, 96,184, -182,127,195,190,163,231,191, 31,210,165, 54,158, 68, 88,176,112,209,159,124,105,111,113,103,143, 50, 13, 47, 17,121, 67, 32, 34, - 43, 95,121,152,248, 76,254,182,247, 59,100, 32,222,168, 44,132, 88,118,194,146, 55, 30,172,186,254, 11,134, 73,196,210, 37,127, -207,159,136, 43, 97, 74,220, 15,122,134,171,135,215,128,166,104,139,217, 98, 18,138,197, 98,150, 99,217,235,146,196,228,102,193, -215, 7,235,109, 17, 87, 34, 90,120,112,252, 47, 83,118,212,170, 89,197,124, 46, 48,241,150,132, 17,113, 50, 71, 17,101,229, 57, - 26, 30, 30,186,132,136,199, 6,158,167, 56,183,104, 94, 4,192,156, 11,137, 10, 43,203,191, 21, 87, 12,195,129,179,209,133,149, -144,106,133, 76,194,132, 85, 78,156,251, 86, 92,237,211,189, 47,174,164, 98,198,238,192,125, 40,174,126,222, 33, 76,112, 47,223, -201, 87, 40,117, 86, 0, 64,195,239,182,128,226,204,169, 0,206,158, 58,210,215,102,187,183,239,206,140, 4, 48,164, 82,217,177, -142,207, 31, 94,239, 81,161,246,119,239,138,171,153,246,136, 43, 0, 40, 94,208,237,242,217,147,199, 91,214,105,218, 89, 20,157, - 96, 68, 88, 76, 42, 94, 70,189,153, 47, 99,138,188,103, 85, 74,153,203,182,218,170,231,191,168, 45,128, 1, 0, 54,158, 63, 55, -106,199,249,115,163, 44,245,252, 23,181,188,116,246,216,252, 87, 47,158,141,108,214,190, 15, 52, 45,187,209, 59,214,204,155, 12, -224,140, 45, 54,207, 5,237, 72,173, 89,180,221,165,228,228,228,118, 91,182,108,137,173, 92,185,178,192,201,201, 41, 14,128, 56, - 60,236, 21,189,107,221,188,136,216,216,216, 65, 15,162, 79, 94,179, 53,156, 28,199,195,108, 54, 67, 78, 37, 58,173,153,253,211, -203, 55, 30, 35,142, 79, 96, 10, 20,250,117,218,175,140,133,229,188,166, 79,159, 14,163,217,130, 3, 7, 14,100, 57, 84,152,156, -152, 24,255,253,192,145, 28, 69, 1, 72,155,115, 37, 22, 11, 41,158,231, 49,108,213, 35, 40, 36, 2,200,165, 2,200, 37, 2, 8, -121,163, 77,165,218, 74, 75,153, 36, 3,143, 84, 19,143,100,163, 21, 41,198, 55, 30,198, 20, 19, 15,163, 62, 21,122,227, 27,113, - 37, 20, 10,161,139, 73, 4,111, 53,114,246,119, 61, 41,164, 24, 44,172,163, 76, 72, 43,100, 34,161,163, 76, 0,206,106,208,255, - 60,121, 52,197, 48,180,124,198,236, 63,178,156,215,196,210, 2,234,252, 19, 22,155,255, 59,135,223, 7,215,135,152,225, 49,126, -249, 25, 88, 89, 30,137,241,177,204,197,187,215,160, 46, 91, 25,197, 11,218,238,193,162, 40,170, 13, 0, 57, 0, 61,128,253,223, - 47,184,213,247,223, 21,147,251,156,223,201, 83, 22, 67, 2, 95,185,110,139, 31, 61,203, 52,218, 3, 0,255, 78,111,214,213,152, - 18,199,240, 28,151, 10, 96,255,207, 63,124,187, 27, 1,231,196,219,244, 37,121,156,242,171, 64,203,171,116,201,110, 58,229,133, -205, 47, 0,222, 70,205, 64, 33,151, 38,203,103, 88,171,213,213, 44,252, 73, 44,150,254,249,215,252, 9,184,244,218, 1,247, 30, - 62,197,245,227,107,193,154,204,191,157, 59, 63,114,154,189, 25, 76,234, 85,186,176,144,162, 15, 52,253,174,221,204, 14,173, 91, -196,223,125,102, 10, 87,200,196,156, 76, 76,211, 60, 75,209, 52, 13,202, 73, 81,146, 22,195, 16,253,224,246,217, 61, 17,161,161, -199, 43,149, 26, 52,218, 32, 53,220, 9,190,189,193,104,207,243, 56,254,253, 24,181,114, 28,172, 44, 5,134,230, 32, 96, 41,155, -103,190,253,115,226,117,120,117,253,194,247,196,149, 71,129, 52,113, 37,102, 32, 21,189,249,216,147, 2, 31,243, 92,185,151,239, -228,187,121,195, 74,206,219, 85,170,100, 0,232, 82, 89,244, 26, 56, 49, 91, 9, 90,185,204,232, 95, 43,212,108,214,163,124,173, -230,184,116,114, 39, 30, 94,220,155, 45,113, 5, 0, 99, 6,180, 62, 54,116,234,218,202,103,142,237,245,118, 47, 81, 91, 24, 26, -107,130,147,140,134, 57,234,190, 53,234,217,181,232,186,101, 20, 7,108, 20, 87, 2,165,163,211,230, 1,195,126, 86,108, 92,179, -164,105, 61,255, 69, 23,207,159, 27, 21,118,254,220, 40, 22,192,168,122,254,139, 30, 94, 59,127,252,175, 26, 13, 59, 64,229,230, -213,176,158,255, 34, 97,212, 61,127,155,150, 22, 94,121,190, 47,177, 70,145,182,103, 71,140, 24,209,254,159,127,254,137, 7,192, - 24,141, 70,105,187,118,237, 10, 70, 68, 68, 12, 13,214,105, 95,216, 85, 2,249, 55, 30,172,107, 71,215,170,196, 98,177, 10, 0, -172, 86, 43,138,180, 93,108, 53,152,204,244,193,131, 7, 33,149,136,173, 43, 87, 44,125, 12, 0, 82,177,232,122,102,246, 78, 28, - 31, 88,234,189,114, 85,119,153,103,154, 80,128, 34, 77, 88,201, 37, 2, 40, 36, 2, 8,120,198,166,226,204, 91,146, 89,189,222, -132,100, 35,143, 20, 35, 11,131,153, 69,138,222,140, 84, 19, 96, 54,164,194,100, 54,131,166, 0,125,106, 10,244, 6, 51,120, 42, -235, 33,194, 77,163,203,189, 55,121, 93, 36,164, 19,135,141,153,228,192,209, 98,134, 23,200, 25,206,106,177, 72, 37, 2,221,211, - 87, 17,188, 92, 42,225,105,129, 68,156,117, 57,164,160,148, 80, 31,116, 17,223,148, 62,134,161, 13,122,125,234,228,219, 55,175, -117,121, 16,232, 86,190,127,255, 30,148, 79,193,162,110, 43, 87,174, 20, 95, 51,212, 52,165,123,170, 62,130,156,231,249,109, 20, - 69,117,163,104,186,251,246,105, 13,197, 10, 71, 55, 67,212,211,199,178,130,133,139,167, 94, 63,252, 23,125,105,239,194,190, 22, -163,193,194,113, 22,174,207, 31, 55,182,174, 31,227,215, 21,111, 22,244,176, 32,100,171,129,207, 45,129,240,165, 53,214,121, 17, -222,236,216,180, 69, 16,217,107, 55, 47,108,126, 65,222, 52, 91,239,205,145, 55, 43, 67,129,197,208,194,165,171,230,141,199,133, - 16, 7,220, 11,124,140, 91, 39,214,195, 98, 49, 79,189,112,126,212,140,108, 61,136,162,155, 73,101,178, 65,211, 71,254,118, 61, -146, 5,237,129, 24,196, 8, 10, 83, 82, 89, 4, 5,111, 47,136, 98,162, 40, 99, 50, 77,123, 23,241,163,170, 47, 59,122,111,244, -200,214,126,225, 33, 47, 71,210, 70,105,137,170,165, 7,111,187,241,104,229,252,143, 86,226, 86, 11, 21, 19, 21, 14, 55,143,119, -167,105,113,239, 41, 44,150,229, 97,165, 57, 48, 52, 5,125,114, 34, 56,139, 37,203, 8,115,112,241,217, 89, 53,101,209,173,201, -237,222,241, 92, 21,120, 51,231, 74, 42,102,222,120,175, 68, 12, 36, 98,198,230,232,207,104, 88, 80, 40,117, 86,120, 56,138,148, - 63,173, 8,132, 92, 42,132,179, 92, 4, 38, 27, 59,247, 84, 46, 51,250,215,242, 53,155, 77,171,218,164, 7,206,239, 95,141,199, -119, 46,100, 75, 92, 89, 44,150,248,225,195,135, 11, 38, 76,152, 32, 89,246,235, 15,115,254,248,251, 64,203,187, 39,214,212, 74, - 76, 74, 81, 73, 37,162, 68, 7, 9,125, 77, 83, 70,113, 32, 53, 53,217,122,250,210, 37,147,213,106,205,106, 34, 49,107,177, 88, -172, 34,169, 3, 42, 84,169, 35, 60,117,104,231,154,122,254,139, 54, 1,184, 5,160, 50,128, 54, 18,185, 35, 76, 22, 22, 70,125, -106, 42,236, 92,253,113,245,197,127,175,154, 86, 10,120,188, 98,197,138,114, 67,134, 12, 49, 12, 25, 50,164, 96, 74, 74,202,118, -123,197,213, 27,129,245,198,131,245,252,249,115,208, 52, 13,134, 97, 64,211, 52,156, 83,111, 37,175,153,253, 83, 34, 0, 56,152, -227, 19,204,193, 87,214,133,133,133,253,105,207, 81, 57,239,149,135,180,137,239,239,122,176, 24, 78, 96, 83, 86, 18,241,198, 23, -243, 22,175,244,237,212,165,139,210,194, 56, 82, 41, 6, 14, 22,125, 34,140, 38, 6, 38,125, 50,164, 98, 6,201, 41,169, 8, 13, -143, 67, 80,224, 45,179, 84,244,241,205,111, 51, 19, 89,126,205, 6, 52, 77,191,254,232,220,150,193,227, 71,143,100,159,133, 68, - 50, 82,137,152,118, 83, 73, 83, 0, 46,203, 49, 61, 79,103, 73,210,132,121, 27,149,179,199, 5, 96,225,142,251,136,137,137,193, -236,159, 26, 64,196, 80,168,127,240, 79,234,251,127,159, 61,234,226,145,180,225,121, 28,189, 72,151,156, 92,168,174,129,230, 69, - 34,145, 12, 6,100,182,173, 66, 42, 69, 81,221, 1, 88,120,142,219,103, 72,214, 89,221,221,221,135,248,248,248, 20,176, 88, 44, -175,147, 98,163, 87,167, 9, 88, 41,128,239,214,143,241,235,158,230,237,226, 64, 32,100,195,251,148, 95,182,108,200, 47, 98, 47, - 15,197, 15,111,131, 71, 41,183,236,103, 38,184,114,101,254, 85,166, 2,139, 7,176,242,240,107,176, 16,226,222,233, 13,176,154, -205,191, 92, 56, 63,106,118,118, 19,241,230,195,149,171,223,252,117, 14,222, 0, 80, 9,240, 70, 72,218, 29, 79,222, 28, 12,243, - 14,255, 29, 25,119, 22,192,217,172,108,235,245,201,157,182,175, 95,182,166,112, 81,181, 79,195, 22,237, 85,114,133, 18, 60,255, -255,145,194,227,205,150, 5, 20,103, 70,100,224,249,184,228,168,199, 65,214,148,196, 1, 54, 8,161,131,227,219,169,103,188, 39, -174, 28,149,111,189, 86,233,195,131,182,206,193,202,108,206,213, 27, 65,203, 64, 41, 21,194, 81, 46,130, 74, 33,130,192,206,145, -199, 74,101, 70, 13,175, 80,179,121,142,197, 21, 0, 92,126,182,247,168, 90,165,241, 25, 48, 96, 64,157, 90,181,106, 73,135, 15, - 31,126,208,209,209,241, 96,104,104,104,196,137, 19, 39,188,140, 70, 35, 46, 94, 60,111,126,245,234,149,209, 96, 48, 92, 0, 16, -154,153,189,243,231, 70,241,245,252, 23,237,188,125,227,242,128,242, 85,253,161,112,116,107,254,242, 89, 80,243,232,136, 16,184, -184,251,194,163, 96, 9,184,251,150,196,211,135,183, 97, 72, 77,218,115,254,220, 40,171,189, 97,126,245,234,213,241, 37, 75,150, - 84,144, 72, 36,158, 7, 14, 28,224,147,146,146,182,103, 39,175,114,105, 2,139,162,168,247, 4,214,213, 52,143, 22, 69, 81,176, - 88, 44,168, 84,165, 86,125, 0,127,102,175,164, 83, 16,164, 77,124, 79, 23, 87, 10,137, 0, 20,107, 91,162, 55,238, 56,160,220, - 93,237,191,147,102, 78,155, 56,162, 82,213,218,146,138,181, 91, 56,152, 44, 52,216,212, 8,152, 76, 60, 18,162,117, 8,186,127, - 57,241,101,104, 28, 83,170,144,211,252,138,205, 7, 79,207, 73, 37,193,154,245, 6,134,166,197, 98,137,132,242,116, 22, 39, 59, - 41,165, 44,248,172,199,217, 27,183,236,236,248,236,206,169,185, 29,250, 77, 28, 95,170,116, 89,180,108,217,242,109,125,101,149, -122, 43,203, 67,127,232, 73,170, 79,195, 36, 67,244, 21,189,158,109, 32, 41,222, 62,241, 66, 98,150, 2,120, 63, 69, 81, 2, 0, - 53, 0, 52,166, 40,234, 2,207,243,213,222,139, 95,138, 42, 1,160, 60,222,236, 35, 23,200,243, 60,247, 53,245,198,179,242, 60, -228,230,123,146,161, 65, 66,118,249,227,143, 63,168, 44, 4, 77, 86,127,219,242, 29,149, 11,246,237, 9, 71,238, 8, 44,142,103, -135,222, 60,177,105,249,155, 74,141, 29,119,254,252,168,249,249, 49, 17,207,105, 71, 95, 5, 80,190,126,253,165, 29, 66, 94, 60, - 89, 80,161,106, 45, 23,158,231,222,174,249,230, 56,150,209,189,184,154,146, 26,126,247,181,213,156, 58, 28,192,201,115,231, 71, -102,106,115,100,151,146, 77,199,247,122,179, 67,251,212,255,124, 27, 25, 77, 27,125, 41, 58, 99,151,146, 80, 40,140,127, 89,248, -165, 53, 19,113, 37,201,108, 66,123,195,239,182, 32, 54,213, 12, 71,185, 8, 74,133, 8, 74,165, 16,140,157, 46, 44,145, 84, 58, -202,175, 65,231, 28,139,171,116,130,117,218, 48, 0, 59,212, 42, 77,177, 75,151, 46,213,104,215,174,157,184,118,237,218,244,205, -155, 55,173,143, 30, 61, 50,165,166,166, 94, 5,240,212,214, 9,249, 0,198, 31,255,111, 75,229,184,184,216,170, 5,139,151,135, - 95,189,239,192,178,128,149, 99, 17, 23, 19,133,123, 87, 79,226,209,245,147,119, 97,199, 70,160, 31,132,215,170, 86,105,214, 78, -152, 48, 97,102,108,108,236,236, 96,157, 54, 91, 30,139,228,148, 84,164, 26,204,160,105, 26, 20, 69,189, 21, 88,143,130,159,190, -253, 55, 77,211,160,232,236,123, 68, 44, 22, 43,159,106, 98, 33,151,166,121,176,210,132, 22,172, 2,155,139,118, 69, 77,215,223, -139, 62, 59, 53,239,209,139,231,107,214,175,156,211,174, 82,229, 26, 18,223, 2, 5, 68, 79, 30,222,209, 63,124,112,219,228,235, -233,244,111,253,138,222, 35, 61, 42,180,178,107,147,205,244,173, 23,222, 29, 46,164,105,164,204,154,255,167,204,170,143, 75,100, -141,201, 38,129, 76, 37,167, 41, 38,218, 22,123,197, 42, 53,154, 80,172, 18, 38, 60,189,119,110,211,130,249,243,122, 29, 59, 86, - 17, 85,171, 86, 69,153,170, 13,149,102, 90, 81, 41, 57,242,121,243,231,177,208, 2,182, 47, 80,228,121,222, 10,224, 34, 69, 81, -106, 0, 77,210, 54,108,149, 0, 48, 2, 72, 73,235, 87,157,226,121, 62,241,107,109,188,242, 74,248,124,201,195,121,185, 21,167, -185,185,194, 46, 47,108, 18,190, 28,168,143,117, 68,191,212,130,165, 30,184,140,241,125, 37, 24, 34,100,132, 77, 1,180, 62,122, -184, 31,234, 55,249,103, 43,199, 91, 78, 71,221,220,246, 15, 0, 62, 43, 65,160, 86,105,168,238, 77, 11,182,170, 92,210,209,107, -252,178,251,129, 0,238, 1, 72,182, 67, 72,124,204,102, 81,163,182,227,186,127, 14,188, 56,253,177,213,130,141, 90,172,171, 47, - 18, 74,229,140, 0, 16, 48, 0,195, 8, 96, 53, 25, 82, 1,156,253,111,111,111,219, 60, 88,165, 71,116, 19,136, 36, 51,172,102, -243, 74, 0, 11,239, 60, 90,148,123,241,170,210,208, 10,133,162,140, 72, 36, 82,155, 76,166,199,169,169,169,129, 0,184,119,227, -196,150, 30,117, 61,255, 69, 18, 0, 63, 0,104, 33,150,202,235, 59,186,120, 42, 18,227,162, 82, 77,134, 20, 45,128,163, 0,254, - 57,127,110,148,222,150, 10,137,162,168,186, 0, 90, 3,240, 4,224,241,193,255,163, 62,242, 57, 26,172,211,158,204,204,174,143, -143, 79, 15,158,231,109,170, 9, 41,138,186, 30, 22, 22,246, 79, 86, 67,132,243, 63, 56, 52,160, 78,205, 5, 14,140, 84,244,154, -103,173, 31,221,166, 65, 44,145, 60, 8,185,182, 45,211,109, 26,222, 61,236, 25, 0, 94,223,222,239,241, 34, 36,102,109, 84, 98, -106, 13, 55,149,227,221,226, 5, 84, 61,124, 43,181,137, 74,255, 62,187, 7, 61,231,132,119,207, 15,124, 47, 47,220, 57,123,232, -254,179,184,150,229,202,148, 48,169, 75, 87,144,100,244,251, 12,230, 95,125, 44, 29,220, 0, 52, 78,159,151, 5,224, 22,207,127, -124, 3,215, 79, 89,175,125, 41,103, 17,102, 22,246, 47,225,200,152, 79,145,126,185, 21,230, 47, 97,131,213,188,200,211, 68, 96, -125, 37, 2, 43, 23, 5, 5, 5,192, 29,111,230,110,228, 72, 92,165,217, 19, 3, 40, 13,192, 1,111,134, 45,162,115,106,243, 75, - 42,124, 31,203, 79,245,252, 23, 9, 0,248, 0, 8,251,216,144,224,151, 82,152,109,153,131,181,127,198,183, 87, 49,101, 36,176, -178,194, 86, 97,245,129,200,122,111,101, 33,159,193,240, 37, 25,238,250,188, 2,139,196,255,215, 91,199, 19,136,192,202, 15,194, - 77, 12,192,244,181,137,171,111,185,240, 17,129,245,229, 64,234, 53, 2,129,212,241,159, 93, 96,145,202,136, 64, 32, 16, 8, 4, - 2, 17, 88,217, 71,144,145,184, 34,145,153,251, 61,103,181, 74, 35,200,137,157,180,201,189,132,124,156,198, 4, 2,105,240, 72, -185, 36, 16, 50, 20, 88,132,188, 33, 88,167, 37, 2,137, 64, 32, 16, 8,132,111, 0,154, 68, 1,129, 64, 32, 16, 8, 95, 14,196, -123,249,101,240, 69,123,176,166, 79,167, 62, 26,254,133, 11, 81, 80, 42, 69,202,224,193,136,207,236,247,211,166,145, 33,183, 79, - 65, 70,110,250, 6,101,187,183,230,121,190, 13,199,113,188, 80, 40,252,227,212,253, 45, 79, 62,103,101, 82,162, 68, 9,165,163, -163,163,205,167, 14,223,188,121, 51, 5,128, 21, 32,222, 73, 2,225,107, 20, 49,249,101, 23,247,143,213,133,100,101, 38, 17, 88, -255,211,200,170, 85,154,130, 0, 82,130,117,218,248, 70,229,123, 58, 91,173,214,134, 12,195,212,230, 56, 46,149,231,249,211, 46, - 46, 46, 23,247, 92, 88, 97, 86,171, 52, 69, 0,232,130,117,218, 4,123, 26,217, 25, 51,176,153,227,208, 37, 37, 5,236,239,191, - 83, 19, 38, 77,226,237,218,109,123,250,244,233,239,197, 73,120,120, 56,117,226,196,137, 82, 22,139,165, 30, 77,211,133,121,158, -191, 47,147,201,206,119,239,222, 61,244,227,162,109,154, 93, 13,173, 90,165, 41,236,236,236,220, 94, 40, 20,242, 44,203, 70,198, -198,198, 30, 15,214,105,227,237,141,219,101, 83, 7, 40,239,222,150, 93,166, 24, 69, 9,138, 18, 8,120,222,106,161,184,132,123, -110,158,129,117,102,254,117,214,156, 31,123, 60, 30, 30, 30, 67, 86,173, 90,229,242,250,245,107,234,199, 31,127,236, 11,224,151, -180, 56, 41, 1, 32, 46,163,120,120,156,112, 14,117, 75,118,146, 9,133, 66,209,153,192,109, 9, 0, 80,183,100, 39, 23,161, 80, -216, 10,111, 22,110, 28, 59,251,112,123, 68,154,173, 38, 52, 77,205,164, 0,134,229,248, 41,193, 58,237,145,140,226, 66,165, 82, - 37, 10, 4, 2,208,116,214,142, 93,139,197,130,186,117,235,166, 92,184,112, 65,149, 23,189,204,140, 42,206,188,176,249,185,123, -223,164,145, 32,124, 73, 29,195,156,230,247,220,220, 15,139,136, 44, 34,176,222, 82,218, 69,179, 21, 64, 55,138, 2,235,231,219, -242,120,201,146, 37,173,131, 7, 15,166,155, 53,107,134,144,144, 16,236,220,185,179,210,190,125,251, 6, 85,240,104,164, 6, 80, -145,166, 96, 82,171, 52, 67,131,117,218, 53,182,216,159, 51, 7, 85,149, 74,167,174,113,113,113,136, 12,127, 45, 40, 92,180,216, -188, 53,107,220, 85, 66,161,117, 99,159, 62, 49,118,157, 75,183,118,237,218,242, 60,207,215,115,117,117,173,223,166, 77, 27,231, -218,181,107,195,203,203, 11,143, 31, 63,174,126,225,194,133,126, 91,182,108,121,105, 50,153,206, 10,133,194, 11,189,123,247,126, -153,157,248,168, 94,184, 77,147,239,191,255,190,254,178,101,203,196, 52, 77,227,193,131, 7, 62,189,122,245,242, 86,171, 52,127, - 7,235,180,201,182,218, 89,249, 99,128,243,221, 72,223,176,113, 19, 38, 10,253,253,253, 41,145, 72,132,200,200, 72,252,181,122, -101,165,139, 23, 29,226,212, 42,141, 42,171, 9,242, 89, 21,210,238,141, 70,205,163, 40,234, 71, 39, 39, 71,165, 78,151, 16, 79, -211,244,188, 45, 39, 22,204,205, 73,195,207,113,111,118,220,231,121, 30, 44,203, 74,213, 42, 13,197, 80,216, 5,160, 3, 77,193, -156,150,246,127,127,248, 59, 77,233,174,222,165, 74,149,218, 42, 22,139,133, 13,202,118,159,113, 38,112,219, 81,145, 72, 52, 97, -246,236,217, 13, 5, 2, 1,126,249,229,151, 90, 0,126, 84,171, 52, 34,134,166,118, 29, 62,180,223,129,162,128,230, 45, 91,239, - 80,171, 52, 30, 60,207,235, 63, 22, 30,119,119,119,172, 88,177, 2, 12,147,249,145, 53, 44,203, 34, 38, 38, 6, 35, 71,142,148, -146, 42, 36,103,141, 13,121,207,252, 41,130, 9,159, 38, 31,216, 35,144, 50,178, 69, 68, 22, 17, 88, 80,171, 52, 85, 11, 23, 46, -220,253,197,139, 23,136, 12,127, 45, 40, 86, 66,221,244,194,133, 11,199,100, 50, 25, 15, 0, 5, 11, 22, 68,221,186,117, 81,179, -102, 77,223,121,243,230, 85,188,125,251, 54, 30, 7,221, 23,151, 41, 91,241,119, 0,107,178,243, 76,161, 80,132,249,243, 23,180, -252,231,159,127, 26,175, 93,251,112,201, 15, 63, 68,236,178,229,119,107,214,172, 89, 28, 16, 16, 80,174,122,245,234, 40, 90,180, - 40, 94,189,122,133,203,151, 47, 27,183,108,217, 18, 81,187,118,237,130,125,250,244, 97, 70,140, 24, 81,248,193,131, 7,223,159, - 56,113,226,251,181,107,215, 30,248,225,135, 31,150,216, 17, 23, 98, 0,149,186,117,235, 86,255,239,191,255, 22,199,199,199, 35, - 33, 33, 1,238,238,238,212,200,145, 35, 61, 39, 78,156, 88, 27,192, 49, 91,237,221, 9,119,190, 56,110,194, 68, 65,203,150, 45, - 25,171,213,202, 63,123,250, 36, 90, 32, 16,210, 67,126, 26, 38, 14, 9,121, 45,109, 80, 55,233, 12,128,122,217, 77,187, 30,141, - 71, 47,244,247,175, 55,106,236,184,177,112,119,243,192,147,167,193,206,115,102,207,157,211,181,193,136,132,127,207, 44, 89,157, -213,239,253, 75,117,105, 88,170, 84,169,159, 85, 42,149,138,231,249,183,199,216,185,187,187, 99,216,176, 97, 48,155,205, 40, 83, -166, 76, 61,139,197,242, 40, 57, 57, 89,253,232,209, 35,188,122,241, 68, 84,172,184,122,158, 90,165,249, 39,253, 44,185,116, 40, -138, 82,119,234,212, 73,209,161, 67, 7,244,235,215,111, 90,253, 50,221, 66, 40,138,146, 86,175, 94, 29, 66,161, 16, 52, 77,171, - 26,148,237, 62,176,104,209,162,109,159, 63,127,174,108,218,188, 85,154,160,131, 2, 64, 1,188,217,236,245,127,144,201,100,176, - 90,173, 56,123,246,236,123,199,228, 88, 33,134, 54,170, 56,140, 70, 51,132, 41,143,209,221,223, 21, 46, 46, 46,223,172, 48,176, -183, 50,207,205, 70,134, 64,200,235,188,159, 87,158,171,236,230,127, 91,236,124,171,199, 27, 17,129,149, 9, 31, 27,138, 17, 8, -178, 31,164,137, 19,113, 99,198,140,132, 29, 12,195,116,166,105,138,175, 92,217, 47, 76, 46, 87,240, 51,103,254, 46,220,188,121, -243,216,191,255,222,229, 58, 96, 64,228,170,204,108,236,216,177,195,181,106,213,170,229, 2, 2, 2, 32,147,201,112,236,216, 49, -252,241,199, 31,175,205,102,243, 70,131,193,240,228,246,237,219,126,123,246,236, 9,152, 48, 97,130, 83,229,202,149,161, 80, 40, -112,249,242,229, 6, 0,178, 20, 88,106,149,166,163, 80, 40,236, 35,149, 74, 11,182,109,219,246,197,164, 73,147,194,163,162,162, - 12,225,225,225, 72, 77, 77, 5,203,178, 80, 40, 20,180, 64, 32,176,235,156, 59,158,145, 23,171, 91,183, 46,101,181, 90,121,147, -201,196, 62,127, 22,148,242, 58,228,137,190, 84,153, 42,206,223,181,108, 78,173, 89, 27, 94,213, 86, 91,221, 27,141,154, 78,211, -244, 8, 71, 71,165, 99, 66, 66,162,142,227,184, 69, 12,195,244, 31, 57,106, 36,230,206,153,135,118, 29, 91, 99,223,238, 3,232, -219,239,123,126,236,232,241,191, 2,200, 82, 96, 73, 36,146,142, 59,118,236, 80, 49, 12, 3,150,101,193,113, 28, 88,150,133,197, - 98, 65, 68, 68, 4,244,122, 61, 92, 93, 93,113,253,250,117, 44, 88,176,224, 93, 33, 37,252,216, 33,234, 98,177,248,226,223,127, -255,253,164,118,237,218, 37,230,205,155, 39, 28, 48, 96,192,242,152,152,152,212,241,227,199, 67, 38,147,161,113,227,198, 69,107, -213,170, 53,176, 66,133, 10,232,217,163,123,106,251,246,237,229, 0,192,208,212,131,135,113,103,131,179, 10,239,205,155, 55,241, -226,197,255, 59, 60, 25,153, 27,188,235, 12, 67, 7,141, 51,102, 47,188,143,196,138,126,112,116,116, 68,218, 25,120,132, 79,208, -200, 16,114,199, 67, 70,248, 52,121, 49,183,210,199, 94, 59,164, 28,125,163, 2, 43, 88,167,189, 81,218,165,254, 94,138,162,218, - 11, 4, 12,223,169, 83,231,160, 11, 23, 46,240, 5, 11, 22,132,175,175, 47, 98, 98, 98,112,238,220, 57, 60,122,244, 40, 62, 53, - 37, 41,146,162, 40, 79,154, 2,203,241,152,100,207,115,166, 76, 65,207,133, 11,241,179, 84,202,167,232,116, 17,190, 99,198,140, -254,121,224,192, 31,139, 4, 4,244,198,171, 87,175, 2,182,108,185,125,190,103,207,208,192,140,126,111, 54,155, 5, 98,177, 24, - 41, 41, 41, 72, 74, 74, 66,251,246,237,209,169, 83,167, 2, 39, 79,158,156,116,224,192, 1,116,235,214, 13,149, 43, 87, 70, 88, - 88, 24, 46, 92,184,128,184,184, 56,136,197, 98,198, 6,113, 53,160, 66,133, 10,115,119,236,216, 33, 44, 90,180,168,244,229,203, -151, 62,127,253,245,215,131,134, 13, 27,222, 99, 89,214,146,156,156, 12,171,213,138,232,232,104, 88, 44, 22,163, 61,239,204, 48, - 34,129, 72, 36,226,239,222,185, 21, 29, 30,246, 66, 31, 25,254,130, 21, 50, 66,121, 76,212,107,248,248, 22, 6,192,216, 52,113, -187,123,163, 81,211,235,212,173, 61,117,220,184,113,240,112,247,196,211,103,143, 85,115,231,204,251, 45, 42, 58, 26,190, 62, 5, -208,177, 75, 91,152,205,102,116,234,210, 14, 10,133, 3, 37,149, 74, 61,108,177,107,177, 88,182,117,234,212,169,146, 74,165, 18, -191,241, 36,189,209,143,213,171, 87, 71,247,238,221,241,219,111,191, 33, 54, 54, 22, 0, 82,226,227, 98, 19, 40,138,114, 98,104, -138,163,104,102, 70,176,238,204,255,136,205, 99,183, 55,152,235,151,233, 54,122,244,232,209, 91, 87,173, 90,229,240,239,191,255, - 58,176, 44,235,240,174,120,123,253,250, 53,118,238,220, 9,149,179,203,253, 19, 39, 78,232,204,102,243, 85,150,227, 23,102, 89, - 32, 4, 2, 44, 90,244,254, 57,142, 17,241, 38, 44,250,239,245, 27, 47,151, 92,142,170, 85,171, 34, 44, 44,236,155,109,168,191, -244, 51,213,136,184, 34,228, 68,168,228,134,199,137, 8, 35, 34,176,114, 29, 55, 55,247, 65, 37, 74,148, 80,110,220,184,209, 26, - 24, 24,104, 49, 26,141,120,252,248, 49,206,157, 59,135, 27, 55,110, 64, 44, 22, 67, 44, 22,227,135,126, 3,110, 48, 12, 35, 91, -176, 96,193,211,115, 65, 59,236, 30, 30, 28, 61, 26, 33,111,254, 21, 30,127,227,134,119,159,101,203,150, 46, 44, 92,184, 80,213, -126,253,126,160,127,250,233,167, 78, 0, 2,179,244, 10,241, 60,134, 13, 27, 6, 55, 55, 55, 12, 28, 56, 16,245,234,213, 67,227, -198,141, 17, 24, 24,136,213,171, 87,227,248,241,227,122, 47, 47, 47,153,159,159,159,141, 34,136, 25,190,103,207, 30, 73,209,162, - 69,165, 0,224,234,234,234, 90,187,118,237, 34, 55,111,222,124,225,227,227, 19, 31, 22, 22,134,164,164, 36, 4, 6, 6,166, 36, - 39, 39, 63,179,231,125, 57,206,106,141,142,142,134,193,144, 42, 40, 83,174,106, 17,153,194, 21, 5, 10, 20,192,203,231, 65, 9, -225, 97, 97, 34, 1,205,153,108,177, 67, 81,212,240, 81,163, 70, 97,246,172, 57,232,210,173, 3,118,108,223,131,238, 61,186, 97, -242,164,169,120,248,232, 33,118,237,216,135,214,109,191,195,206,127,247,162, 70,173,170, 48, 24, 12, 81,182,216, 61, 19,184,237, - 2,128, 58,239, 94,107, 84,190,103, 9, 47, 47,175,109, 86,171, 21,143, 30, 61,138,187,113,227, 70,139, 96,157,150, 75, 19,163, - 37, 88,142,143, 11,142, 59,149,225,100,255,179, 15,183, 71, 52, 44,215, 99,220,144, 33, 67,230, 85,171, 86, 77,201,243, 60,220, -220,220,208,178,101, 75, 44, 94,188, 24, 71,143, 30, 61,193,243,252, 9,134, 97, 46,222, 10, 61,108,235,251,195,106,181, 98,199, -142, 29,160,105,250,237,199, 10, 17, 30, 92,125, 5,237,127, 47,225,238, 44,197,173, 91,183,224,234,234, 74,106, 15, 34, 4, 8, -196,147,101,115,158,127,215, 22, 41, 27,223, 6,159,124, 31, 44,185, 92,110,240,244,244,180,124, 40,102, 62,252,219,197,197, 69, -207, 48,140, 41,167,207,171, 90, 53,220, 76,211,236,198,107,215,174,193,211,211, 11, 60,207,187,219,250, 91,138,162, 12,207,158, - 61,235,243,211, 79, 63,157,253,251,239,191,113,252,248,113,204,158, 61, 27,107,214,172, 89,104, 50,153,186,219,106, 71,173,210, - 56, 8, 4,130, 50, 69,138, 20,145, 0, 64, 88, 88, 24,130,131,131,193,113,156, 50, 36, 36, 68,166,215,235,145,156,156, 12,157, - 78,135,135, 15, 31,198, 3,136,176,235, 37,217,228, 23,155, 55,109,164,188,188, 11,200,194, 94,191, 76, 62,120,240, 32,130, 31, -221, 77,113, 80,170,164,135, 15, 31, 21,176,166, 56,155, 78,222,117,114,114,114,242,245, 41,128,238, 61, 59,195, 98,181,160,107, -247,142,112,247,112, 67,237,218,181,113,244,232, 17,244, 14,232, 1,119, 55, 55, 52,107,222, 8,251,246,238, 7,199,113,191,218, - 19, 76,181, 74, 83, 76,173,210,184,166,121,177,250,183,108,217, 18, 28,199,161, 81,163, 70, 46,222,222,222,173,211,239, 11,214, -105,159,216,178,146,242,244,131,173, 55,158, 61,123,214, 98,251,246,237,223,111,223,190,253,135, 19, 39, 78,176,233, 94, 64,145, - 72, 52,237,236,195,237,167, 1, 20,168, 95,166, 91,247, 70,229,123, 22,180,185, 80,208, 52, 40,138,122, 43,176,164, 66, 30,131, -191,243,197,200,174,149,208,171, 89,233,116,175, 28,240,177,241, 75, 2, 74, 58,249,147, 6,132,240, 77,117, 18,178,202,243, 68, - 92, 17,129,149,111,224, 56, 14,122,189, 62,215,236, 89, 44,156,166,104,209, 98, 48, 26, 13, 96, 24,198, 98,207,111, 61, 60, 60, -162, 40,138,218,111, 52, 26, 33, 18,137, 96, 52, 26,225,235,235,123,194,217,217,217,230,237, 24,130,117,218,100,171,213,250, 40, - 48, 48, 48, 53, 62, 62, 30, 33, 33, 33,136,138,138,194,201,147, 39,195,101, 50,153,158,162, 40,120,122,122,162, 92,185,114, 80, -171,213,142, 0,220,236, 9, 99, 9,253,221,202,103,206,158,102,143, 30, 61, 44,144, 72,101, 34, 55, 55, 55, 40,157, 92,196,218, -179,231, 4, 97,225,175,245,167,206,223,215,216, 98, 39, 33, 33, 33,225,233,179, 39,216,182,101, 39, 40,138,198,191,219,118,227, -193,131, 64, 92,190,124, 25, 7, 15, 28,194,207, 19, 38,227,247, 25,115,112,252,216,105,188,122, 25, 2,154,166,221,122, 54, 25, -195, 7, 52, 31,111,206,202,118,218, 10,210,167, 20,133,240, 10,158, 77,231, 54,109,218,180, 81,177, 98,197,240,252,249,115,180, -111,223, 30,158,158,158,195,252, 75,117,145,219,155,182,167,238,111, 49,157,186,191,229, 1,207,243,205,170, 85,171,198, 88,173, - 86,248,250,250,194,108, 54, 15,111, 88,174, 71,221, 2, 5, 10,172,159, 48, 97,194, 24, 71, 71,199,185,182,216,227,121, 30,122, - 51,112, 60,188, 20,246, 62, 41,132,255,110,232,193,178, 44,104,154,134,147,147, 19, 92, 92, 92,160, 82,169,192,178, 44,169, 61, -136,199,139,240, 13,230,203,143,121,181, 30, 39,156,203,208,219,101,139,184, 34,195,131, 68, 96,229,222, 67,105, 58,211,165,240, - 52, 77,219, 45,176, 22, 47,134,239,210,165,255, 47, 76, 2, 3, 65,111,216,224,233,183,102,141,247,162,174, 93,123,116,172, 82, -197, 15,187,119,239, 1, 77,179,255,217,236, 24, 98, 89,250,222,189,123,174,111,218,221,255,119, 86, 68, 71, 71,139,238,223,191, -239,146,209, 65,217, 25,216, 90,210,166, 77, 27,211,190,125,251, 98, 94,191,126,109,216,189,123,247,203, 27, 55,110, 68,120,120, -120, 36,251,250,250,162, 98,197,138, 40, 82,164, 8, 42, 85,170,164, 84,169, 84, 37,237,121,247,177, 39,207,232, 41,243,139, 63, -142, 29, 59, 41,120,254,226,149, 72,175,215,243, 7, 15, 30, 17,252,119,224, 32, 45,181, 6,247,177,117, 19, 76,158,231,255, 92, -180,104, 17,186,118,235, 4, 23,103, 87,212,211,212,194,127,251,246, 67, 38,147,161, 72,145, 34,232,230,157,128,157,206,187,208, -198, 41, 28, 98,177, 24,163, 70,141,154,113,226,196, 9,240, 60, 47,204,194,115, 85,181, 96,193,194,221,121,158, 71,120,104,136, -208,106,181,140,234,213,171, 23,245,240,225, 67, 76,156, 56, 17, 38,147, 9,189,123,247,118, 98, 24,198, 30,175, 96,221, 82,206, -154,243,165, 93,234,223,171, 82,224,187,229,237,218,181,235,218,190,125,123,196,198,198,162, 87,175, 94, 24, 57,114,100,183,242, -229,203, 47,158, 48, 97,130,196,205,205, 13, 38,147, 41,201, 70,145,137,195,199, 78, 67,196,112,232,161,113,198,179, 39,129, 88, -179,102, 13,214,173, 91,135,127,254,249, 7,171, 86,173,194,238,221,187, 97,181,126, 29,251,138,102,214, 48,216,242,219,220,182, - 73, 32,124,233,229,233,115,123,174, 72, 71, 37,255,240, 73,231, 96, 73,165,210,164,208,208,208,148, 39, 79,158, 40,234,215,175, -143,199,143, 31,227,245,235,215,136,136,136,144, 26, 12, 6,171, 76, 38,179,248,250,250, 66, 40, 20,226,248,241,227, 0, 96,211, - 76,226,153, 51,177,156,101, 49,128,162,192,207,159, 47,211, 58, 58, 58, 62,246,241,241, 86,183,110, 93,219,193,223,191, 30, 10, - 21, 42,132,211,167,207,224,192,129,253, 87,190,255, 62,226,140,173,225, 45, 92,184,176, 56, 42, 42,170, 59,195, 48,103,211,175, - 81, 20, 5,165, 82, 73, 89, 44,150,182,118,206,195, 89,243,242,229,203,228, 33, 67,134,244,146, 72, 36,222, 5, 11, 22, 12,169, - 89,179,102,152,175,175,175, 69,169, 84, 2, 0,194,195,195, 97, 54,155, 41,177, 88,236,109,111,220, 62,125, 77,141, 92,241,243, - 16,170, 73,147, 38,104,216,176, 33, 2, 3, 3,113,227,198, 13,220,127, 41, 89, 5, 96,175, 45, 54,182,157, 90, 52,173,123,163, - 81,210, 59,183,239,142,107,209,162, 57, 14, 29, 58, 12,153, 76, 6, 7, 7, 7, 84,173, 90, 21,151,110, 82,120, 32,169,139, 18, -238, 37,208,164, 73, 28, 74,149, 42,133,224,224, 96,187,243, 1,195, 48,180,131,131, 3,230,207,159,111,209,233,116, 75,247,236, -217, 51,186, 99,199,142, 80,169, 84,173, 97,195,150, 28,106,149,134,166,105,106,251,174, 29,219,188,149, 14, 10,116,236,220,189, - 92,155, 54,109,238,158, 59,119,142, 93,182,108, 89,100,179,102,205, 60, 59,116,232,128,202,149, 43, 35, 58, 58, 26,243,230,205, -139,215,235,245,179,108, 9,155,155,155, 27, 22, 46, 90,132,197,233,147,218,101, 50,172, 89,178,230,189, 57, 87, 6,131, 1,103, -207,158,253,170, 27,134,143, 85,210,246,138, 38,114,104, 60,225,107, 43, 23,246,228,123, 91,197, 85, 94,108, 42, 76,200,199, 2, - 43,175, 18,246,216,237, 13,198,198, 21,122, 77,110,214,172, 89,255,230,205,155,151,251,237,183,223, 48,108,232, 79, 85,207, 95, -184,232, 41, 20, 48, 92,167,206, 93, 30,112, 28, 23,114,232,208, 33, 78,175,215, 31, 55, 24, 12,155,179,178, 57,127, 62, 74,184, -185,121, 14, 12, 11, 11,131, 46, 46,154,242, 45, 88, 88,179,105,211,102, 39, 7, 7, 5, 7, 0, 79,159, 62,197,130, 5, 11,112, -225,194,185,237,141, 27, 75,150,101,101,175,114,229,202,209,143, 31, 63,126, 29, 19, 19, 83, 96,252,248,241,184,118,237,218,119, - 27, 55,110,108,241,238, 61, 94, 94, 94,219,218,182,109, 43, 21,137, 68, 72, 76, 76, 68, 66, 66,194,141,172,236, 6,235,180, 60, -128,237, 0,182,171, 85, 26,229,179,103,207, 42,148, 42, 85,170, 41,199,113,178, 87,175, 94,225,233,211,167, 72, 78, 78, 70,108, -108, 44,103, 52, 26,163,237,141, 91,138,162, 10, 44, 93,186, 84,103,181, 90,113,232,208, 33, 28, 59,118, 12, 44,203,226,212,253, - 45, 30,246,216, 81, 42,149,179, 12, 6,195,184,234,213,107, 32, 48,240, 33,124,125,125, 81,164, 72, 17,120,123,123, 35, 40, 40, - 8, 74,165, 18, 66,161, 16, 39, 78,156, 64,104,104, 40,138, 23, 47, 14, 27,222,253, 70,105, 23,205, 54,138,162,186, 83, 20,216, -118,237,218,135,197,198,198,242, 15, 30, 60, 56,239,229,229,181,243,252,249,243, 3,219,181,107,167,168, 81,163,134, 79,147,138, -189,203,158,184,187, 41,171, 69, 8,142, 28,199,123, 55,111,222,130,146,202,149,160,104, 6,119,238,220,145,172, 92,185,242,186, -171,171,235, 15,135, 14, 29,106,118,243,230,205,113, 85,170, 84, 81, 92,189,122, 53, 54, 46, 46,110,224,153,192,109, 33,182,188, -191,213,106,197,173,139,103,241,224,234,243,183,147,218, 47, 92,184, 0,103,103,231,183,243,178, 4, 2,193,219,149,144, 4, 34, -178, 8, 95, 47,217, 93,221,247,185,197, 21, 89,149,248, 13,122,176, 0,224,228,189,205,207, 0,252,220,168,124,207,234,123,247, -238,253,217,195,195,195,147,231,121,188,122,241,132, 46,169, 46, 83,218,205,221, 99, 23,207,243,235,207, 4,110,123,157, 29,251, - 28,199,225,224,193,131, 72, 72,208,225,246,237,219, 9,177,177,209,167,196, 98,234,104,255,254,145,247,109,249,125,217,178,101, -185,123,247,238,205, 28, 58,116,232,248,150, 45, 91, 22,235,212,169, 19,150, 44, 89, 66,191,122,245, 10, 44,203,162,126,253,250, - 96, 24, 70,106, 48, 24,112,229,202, 21,220,190,125,251,186, 72, 36, 90,106, 79, 24,131,117,218, 36, 0, 23,234,148,232,200,152, - 76,166,186,149, 43, 87, 86,153, 76, 38,232,116, 58, 94,171,213,222, 75, 72, 72,184,106,239,123,243, 60, 31,218,175, 95, 63, 52, -110,220, 24,149, 42, 85, 66,151, 46, 93,240,219,111,191,161, 73,197,222, 81, 39,238,110,178, 71,100, 25,173, 86, 43,180, 90, 45, -122,247,238, 13,179,217, 12,139,197,130,212,212, 84, 84,175, 94, 29, 0,240,228,201, 19,176, 44,203,221,186,117,107,218,221,187, -119,103, 8, 4,130, 44,231,181, 61,138,211,246, 80,171, 52, 83, 74,148, 40,185,116,220,184,113,238,251,246,237,131,213,106, 61, -178,245,228, 66, 75,195,114, 61,142, 63,126,252,184, 67,141, 26, 53,112,244,232,209,150,200, 98,149,103,176, 78,171, 43,229,172, - 57,218,185,107,143, 22, 66,161, 16, 34,161,192, 84,181,106,213, 84,158,231, 77, 91, 79, 46,180, 2, 56,212,168,124,207,243,135, - 14, 29, 42, 9,224,201,233, 7, 91, 19,109,121,241,148,148, 20,176, 44,139,242,165,138, 98, 94, 17, 31, 68, 71,171,193,178, 44, -120,158,135, 84, 42,125,251,111,171,213, 10,142,227,222,219,199, 45,183, 69, 68, 94,136,146,220,168,180, 63, 69,131,246,173, 55, -232,132,252, 21,159, 57, 57,218, 41, 59,226, 42, 55, 58, 38, 68, 92,125,163, 2, 43,157, 83,247,183, 92, 83,171, 52,139, 60, 60, - 60,218,165, 95, 99, 89, 86, 31, 22, 22,246,123,250,114,125, 91, 24, 59, 22, 79,102,206,140,252,139, 97,152, 1, 20, 5, 78, 34, - 17,111,220,187,119,251, 58,192, 18,213,164, 73,236, 11,111,111,251, 87,122,117,239,222,253, 89,120,120,248,160, 3, 7, 14, 52, - 56,125,250,244,128,206,157, 59,187,105, 52, 26,164,139,172,135, 15, 31,226,210,165, 75, 47, 1,172,234,223,191,255,141,236,198, -193,197, 39,187,181,106,149,230,241,141, 27, 55, 26, 1,128,197, 98, 9,141,141,141,189, 17,172,211, 26,178,225,193,242, 29, 59, -118,172,110,236,216,177,239,138, 46,216, 41,174,176,122,239,116, 99,247, 70,163,198,158, 57,115,102,254,233,211,167, 63,122, 15, -195, 48,188,197, 98,249,126,251,233,197,155, 0,204,180,195,252,115,181, 90,237,194,113, 28,206,159, 63,159,226,227,227,115, 33, - 45,156, 71,180, 90,109,135,110,221,186, 65, 36, 18,149,181, 77, 80,162,227,161, 67,135,186, 49, 12, 83,160, 85,171, 86,237, 41, -138,130,155,155, 91,161,119,242, 87, 18, 0,187,210, 38, 62, 62,158,239,217,179,167,205,187,135,202,100, 50, 29,169, 66, 8, 4, -130,189, 66, 41, 47, 5, 16, 17, 87,249, 92, 96,125, 42,183,126,176, 78,123,174,140,179,102, 15, 69, 81, 29,104, 10, 38,142,199, - 88,123,196, 85, 58,147, 39,227,167,197,139, 49,155, 97, 96, 26, 54,204, 20, 99,239, 46, 7, 31,195,219,219,155,239,219,183,239, -233,192,192,192,243,235,214,173,107,127,226,196,137,254,141, 27, 55,166,183,110,221,106, 54,153, 76,127,182,104,209,226,152,183, -183,183, 77,226, 45,179,184,228,121, 62, 2,192,230,156,134,247,216,237, 13, 9, 0, 40,181, 74,115, 25, 64, 77, 0,199,130,117, -218,230,217,177,181,237,212,162, 5, 0, 22,228, 65,122,243, 13,202,118,223, 48,108,216,176,230, 81, 81, 81,127,159, 9,220,102, - 1,128, 51,129,219,110,215, 47,211,109,243,195,135, 15,253, 77, 38,211, 63, 54,218, 50, 0, 88,167, 86,105,232,152,152,152,230, - 44,203,138,228,114,185, 74,173,210,208,217,201, 67, 0,112,229,202, 21, 17,169, 18, 8, 4, 66, 94,138, 44, 91, 5,144, 45,243, - 34,137,168,202,223, 80, 31, 91, 9,151, 23, 2, 43,179, 12,160, 86,105, 10, 1, 72, 12,214,105, 19,236, 17, 41,211,167, 83, 57, -242,192, 77,155,246,191, 7, 32, 79,159, 62,253,163, 54,247,237,219,167,208,233,116,149, 61, 60, 60,110,182,108,217, 82,159,177, -205,105,214, 47,181, 18,200, 9,159,114,104,227,195,176, 54, 44,215,163, 87,209,162, 69, 7, 62,123,246,108,247,153,192,109, 75, -242, 83, 88, 9, 4,194,215, 39,152,178, 91, 71,230,134, 16,250, 92, 39, 41,216, 91,111,142, 27, 55, 46,183, 30,205, 3,200,147, -115,201,254,248,227,143,175, 95, 96,229,183, 6,156, 84, 26, 36,125, 8, 4, 2, 33, 47,234,202, 47,149, 79, 40,176, 62, 20, 84, -239,254,157,171, 98, 43,175, 5, 22, 77,138, 11,129, 64, 32, 16, 8,132, 47, 0,234, 75, 10,236, 39,155,228,190,109,201,153, 28, - 14,231,249, 91, 73,222,202, 59,212, 42, 77,142,210,135,231,121,146, 62, 4, 2,129, 64,120,175,105,200, 64, 28,101,228,165,226, - 63,248, 29,245, 17,123,212, 71,108,103,116,111,102,207,206,179,161,199, 79, 46,176,190,212,185, 73,223, 76, 41, 32, 2,137, 64, -248,226,201,207,195, 87, 95,235, 52,130, 47,229,189, 62, 67,222,224,179, 16, 85, 31,195, 94,225, 99,235, 80, 98,118,194,242,229, - 8, 44, 2,129, 64, 32, 16, 8,132, 79, 40,240,108, 17,102,159, 94, 96,125, 76,237, 14,215,104, 70,242,192, 47, 0, 56, 10, 24, -255,167, 86,187,241,115,170,249,149, 63, 83, 57,154, 67, 54,120, 54,255, 63,203,249,167, 79,159,158, 35,155,211,166, 77,123,207, - 38, 69, 81,223,252,208, 91, 70, 61,167, 14,126,154, 54, 28, 48,150, 99, 65,209, 12,126,219,119, 75,123,130,244, 14,243,190,183, -109,107, 88,243, 58,238,179,218,197, 58,253,123,199,227, 35,224,209,229,246,123,247, 68,237,168,252, 63,215, 8, 4, 2,225, 83, -139, 40,187, 5, 86, 70,149,176, 88, 44,248,253, 63,237, 75, 25,247,122, 23, 90,116, 30, 57, 3,192,198,156, 86,170,157,203,105, -124, 57, 49, 90,167, 69,199,193,221, 55,180,175,115, 82,201,255,189, 19, 45, 41, 33,189,150,231, 64, 91, 45,220, 60,161, 20,123, -250,183,193,243,156, 68,210,198, 21,127,184,166,112,134,214, 34, 1, 83,213,100,102, 47,137,101,242, 67,253,251,143, 73,200,141, - 4,112, 86,162,175,163, 66,178,156,162, 41,154, 97,232,228,120, 93,234,232,184, 36,108,178, 55, 78,151, 77,237,167,140, 12, 14, -189, 44, 19,179, 37, 68, 2, 78, 96,182,208, 22,189,137,185, 7, 39, 99,157,153,127,105,205,249, 81,168,136,197,130,169, 55,119, - 15,168, 98,182,176, 40,253,221, 95,211,212, 42,205,201,180, 35,133,190, 56,178,187, 71, 77,118,210,197, 94, 49,151, 91,203,186, -109,249,237,199,118,189,206,232, 29,179,186, 55,189, 30,250,152,144, 34,226, 42,231, 2,250, 83,230,157, 47,161, 19,146,221, 13, - 65,237, 45,223,246,236,111,245,177,251,103,143, 90,247,155,201,100,250,153,227, 56, 1, 77,211,172, 84, 42, 93, 56, 97, 65,159, -241, 57,121,247,217,163,214, 21, 54,155,205, 5, 45, 22, 11, 37, 20, 10,121,137, 68, 18, 58, 97, 65,159,231, 57,140,210,119,231, - 84,125, 40,120, 62,252, 46,163,223, 81,185,244,236,207, 34,184,236,242,174, 8, 24, 74,132,136,131,160, 95,252, 3, 0,170,236, - 62,244,251,242, 26,105,178, 24,205, 57, 14, 29, 10, 23,117,173, 53,234,199, 78,110, 17,209,137, 88,183,245,208,152,142, 85, 52, - 87,120, 96,175, 68,133, 35, 91, 79,106,245,246,218, 22, 74,197,155,174, 94,125,232,196,199, 28,197,182,205,171,230,190,138, 48, -206,221,121,226,245,253,152, 68,227,232, 33,157,112,218, 86, 59,171, 86,205, 46,192, 89,205,109, 11,249,184,118, 27, 57,172,117, -141,239,154,212,163, 11, 21, 46,130,167,207,158, 14, 58,120, 84,203,109,222,241,231,185,176, 40,221,118,169, 92,178,255,135, 31, - 38, 68,101, 39, 30, 10,122,137, 14, 86,171, 90,171,217,250,141,219, 33,145, 74,241,250,233,117,167,222,125, 7,174, 9, 10,122, - 17, 29,151,140, 99, 54,135,117, 96, 79,231, 68, 99, 84, 88,251,174, 99,133, 13, 90, 12,166,100,114, 7, 60,123,114, 15,255,109, -253,165,210,179,224,235,113,106,149, 70,149,149, 39, 44,171,138,164,123,163, 81,243, 40,138,250,209,201,201, 81,169,211, 37,196, -211, 52, 61,111,203,137, 5,115,109,173, 36,154, 85,214, 72,228,128,211,123,249, 73, 32, 16,167,255,219,108,129, 67,113, 31,248, -116,168,172,177, 2,128,210,138,196,245,247,237,223,209, 62, 63, 87,220,185,213, 64,229,196, 94, 70, 13,112,110,132,241, 99,121, -192, 30, 1,153,211,223, 19,222,143, 51,138,162, 16,172,211,230,122, 90,126,141,219, 20,148,116,242, 71,147, 38, 77,214,234,116, -186, 69, 91, 79, 46,188,159, 91,118,189,188,188,202,240, 60,255,234, 92,208,142,212,220,176, 23,208,124,188,135,159,159,223,228, -133, 11, 23, 82, 42,149, 10,201,201,201,204,132, 9, 19,198,245,107, 61,105,217, 63, 7,126, 15,201,142,205, 14,117,135,136,252, -253,253, 11, 45, 90,180, 8, 78, 78, 78, 72, 73, 73,161,198,143, 31, 95, 96,100,143, 57, 97,139,183, 78, 52,101, 55,172,105, 91, - 32, 80,217,244, 48, 81,118,254,219,150,191, 63,185,208,178, 75, 96, 89,173,108,120,252,195, 77, 5,173, 41, 73,160,128,151,217, -121, 96,187,170,154,174, 18,153,224,151,161, 1, 77,188,219,181,109,231,232, 81,184,134, 16,180,240, 77, 35,254,195, 88,101,208, -237,211, 5,119,239,251,175,233,238,131, 23,195, 59, 84,209,204,123,240,140,223,106,143,125,142,101,129,184,227, 64,252, 89, 52, -170,238, 1, 15, 23, 21,134,117, 43, 91,126,233,246,192, 19, 43,118, 60,153, 50,164, 11,102,101,101, 99,249,210,233, 43, 38, 13, -109,255, 99,203,150,173, 81,180, 68, 57, 68, 71,134,224,202,229, 75,209, 11, 86,237,122,208,188, 97,245,138, 1,189, 2, 92, 70, -142,156, 80,255,113,208,157,250,135, 14,236, 94, 57,119,217,244,217, 67,135, 78,155, 98,107, 24, 85, 42,120, 49, 28,102,150, 42, - 85,174,217,142,221, 7, 65, 39,156, 7, 98,175,163,136,170, 48,102, 77,232, 74, 15, 25,191,232,175,184,100, 83, 33, 91,237,133, - 37,196, 94,108,215,109,156,160, 75,159,223, 24,163,209,200,223,186,174,141, 22, 11,105,186,235,247,243,196,127, 45,232, 46,237, -212, 36,230, 12,128,122,217,205, 36, 61, 26,143, 94, 88,223,191,198,168,169,227,122,195,193,173, 28,226,159,252,235,252,243,156, -255,230,116,109, 48, 34,225,223, 51, 75, 86,103,245,251,142, 85, 53, 93,219, 55,174,190,166, 88, 33, 95, 5,207,115, 72,255, 36, - 37, 27, 48,120,214,117,232, 18, 13,104,213,216,175, 66,145,130, 78,175, 41,158, 7,207,115,120,242, 60,220,210,177,154,166,233, -253, 39,252, 89,210,100,102, 95,112,100,212, 80,218,122, 24, 45,225,203, 37,125,143,195,220, 58, 59,207, 86,145,158,209, 51,213, - 42, 13,221,185,115,103,106,230, 95, 67,217,252, 24, 95, 20, 69,181,116,115,115,107,213,163,241,232, 70,185, 40,178,228, 52, 77, -151,242, 47,213, 37, 40, 55, 68, 22,203,178,147,149, 74, 37, 69, 81,212, 91, 17,237,232,232, 8,179,217, 60, 21, 64,255,236,216, - 20,139,197, 5, 21, 10,197,123,215,156,156,156, 16, 19, 19, 83, 24, 64, 48, 41, 73,159, 72, 96, 81, 52, 29,229,172,242, 44,104, -177,188, 2,128,240,236, 60,144,230, 48,225,218,141,123,229, 25,196, 81,148,200,249,253,192, 8, 37, 40, 87,189,165,176,136,218, -207,173, 77,203,203,206,189, 7, 77, 30, 11,192, 62,129,101,177,246,170,210,228,167,141, 86,142, 23, 42,229,212,235,226, 5, 92, -139,142,235, 83, 65,242,243, 15,149,144,152, 98,154,190, 98, 71,200,233, 33, 93,112, 37, 51, 27,229,139,171,250, 15, 31, 50, 0, -156,188, 44, 46,156,221,135,159, 70,255, 26, 24, 19,151,240,187, 46,137,185,183,251,160,182,122,225, 2,110, 83, 87, 46,252,181, -112,137,114,245,209,166, 69, 28,117,240,196,197, 31, 1,100, 41,176, 92,148,232,237,160,144, 76, 83, 58,186, 20,154, 60,121, 50, - 90,182,108, 1, 58,225, 28,248,152, 99, 96,205,201, 64,210, 83,120, 56,186, 67, 36,164,237, 58,234, 69, 38, 97,139,249, 55,233, - 71,153, 76, 70, 94,159, 26,207,198,134,156, 77, 73,136, 10,212, 23, 46, 94,197,185,122,205, 6, 84,210,209,237, 85,109,181,213, -189,209,168,233, 52, 77,143,112,114, 84, 56,234, 18,146,117, 28,199, 45, 98, 24,166,255,180,145,173,177, 97,118, 11,180,111,223, - 30,123,247,238,197, 47,125,251,160,219,248, 87, 51, 0,100, 41,176,132, 2,193,160,249,179,231, 40,104, 26, 0,103, 5,248,244, -143, 5,161,225,209, 72, 77, 77,133,167,171, 2,142, 10, 33,192, 91, 0,222,138,212,212, 20, 97,141, 86, 19, 7, 2,248, 34, 5, - 86, 94,108,214,155, 27,226, 42, 47, 60, 68, 68,160,229,127, 81,158,149,200,202,171, 52,236,209,120,116, 13,133, 66, 49,134,227, -184,198, 53,106,212,112,122,249,242, 37,250,181,158,148,200, 48,204,233,212,212,212,133, 91, 78, 44,184,152, 95, 58, 43, 66,161, -208,188,124,249,242, 2,131, 7, 15, 62,149, 91, 34,139,162, 40,142, 97,152,135, 0,202,124, 40,178,108,141,243, 30,141, 71,191, - 2, 80, 48, 77, 52,155, 19, 18, 18,176,114,229,202,183,223,155,205,102,112, 28,215,187, 71,227,209,253,104,154,142,145,203,229, -222,171,247, 78,183,102, 81,207,215,100, 24, 70,156,102,147,255,208,166,209,104, 4, 69, 81, 30,189,154,142,245, 4, 96,185,126, -253,250,101,254, 99,187,146, 19,114, 79, 96,229, 78, 47, 1, 66,129, 83,105,202,116,170, 44, 71,187,212,164, 24,207, 22, 20,173, - 44, 3,240, 60, 34, 95, 92,198,227,171, 91,249,232,103, 87,121,207,242, 93, 41,138,130,208, 94,251,253, 59,225, 8,192,185,165, -245,225,240,215,238,104,175, 31,126, 61,187,125,251,236,198,117,127,254,161, 50,125,228,242,235, 49, 0,223, 57, 51, 27, 14, 50, - 17, 67, 69,236, 64,188,181, 36, 52,254,109,112,239,126,239,178,215,207,237,218,186,105,219, 54,110, 96,159,174,116,169,170, 29, -144, 24,126, 11,143, 78, 79, 71,252,203,179, 80, 57, 8,164, 89,133,203, 89,137,239,107,215,169,251,247,202,149,171,225,229, 93, - 16,180,241, 57,144,112, 28,214,184,235, 48,234,227, 96,212, 39,194, 98,161,160,139,213, 1,224,237, 26, 26, 21,137,120,129, 92, - 46,227,111,157, 95, 27,157, 24,117, 79,207,197, 63,100,221,229,188,156, 74,190,137,162, 5,202, 66,192,112, 54,157,177,215,189, -209,168,233,117,235,214,152, 58,117, 92, 31,168,220,213,136,125,186, 95, 53,109,238,230,223,162,162,163,161,244,213,160, 83,167, - 78, 48,155,205,232,220,185, 51, 20, 10, 26, 74,177,193,213, 22,187, 38,179,117,197,152, 9, 99,253, 11,249,184,211, 60,207,131, -227,222,120,176,170, 85, 84, 67, 83,183, 26, 14, 31,187,140,189,255, 61, 75,187,206,131,231, 88, 60,121, 25, 21, 79,241, 88,255, - 37, 9,170,188,104,176, 62, 28, 22,204, 77,193,243,185,133, 81, 78, 68, 40,153,228,254,249,132,187, 45,162, 77,173,210,208,117, -234,212, 89,174, 82,169,122, 5, 4, 4, 72,253,253,253, 25,137, 68,130,249,243,231, 35, 42, 42,202,169, 73,147, 38,237, 54,111, -222,220,180,127,155,201,187, 61, 61, 61,251,101,199,171, 85,210,201,159, 74,203, 71,185,214,240, 23, 46, 92, 24, 43, 87,174,116, -203, 77,145,117,234,254, 22, 67,163,242, 61, 63, 42,178,108,196,103,226,196,137, 48,153, 76, 8, 9, 9, 17,189,120,241, 2,122, -189, 30,229,203,151,199,227,199,143, 17, 31, 31,143, 90,181,106,137, 28, 29, 29,113,244,232, 81,231,180,118,221,154,133,119, 83, - 52,110,220, 56, 88,173, 86,188,124,249,146,122,241,226, 5, 12, 6, 3,202,151, 47,143,160,160, 32, 36, 36, 36,160,102,205,154, -148,147,147, 19,142, 30, 61, 42, 64,230,115,166, 8,185, 41,176,168,220, 24,193,228, 57,112,177,151,120, 46,246, 18,111, 17, 21, -128,246,242, 83, 42, 57,246, 5, 15, 0,180, 64, 12,139, 57, 57, 87, 18,115, 96, 71, 68,172,216, 99, 29,181,231,244,171,235,163, -123,149, 67, 17, 47,101, 21, 32,209,150, 0, 34, 96,228, 66, 94, 36, 92, 98,153,248, 83, 71, 81,173, 70, 1,168,214,160, 55, 29, - 25,180, 31,103, 55, 5, 96,213,142,203,150, 2,174, 98, 97,203, 42,182, 69,134,163, 66, 58,117,213,170,213,240,118, 50,129,127, -181, 4, 86, 67, 36, 56, 83, 28,204,250, 4, 36, 36,234, 16, 26, 22,131,248,100, 22,119, 94, 8,248,176, 88,227,110,123,222,209, - 98,165,173,145,175,111, 67, 96,121, 45,248,174,137, 87, 17,196, 95,133, 65,218, 14,207, 31,220, 77, 8,139,121, 40,226, 56,198, -100, 91,186, 82,195, 39,143,234,138, 13,191, 55, 65,183,174,157,241,239,191,255, 98,116,183,142,248,105,202, 89,152, 30,254,138, - 93,187,118,161, 77,155, 54,216,177, 99, 7,106,212,172, 5,163, 69,160,179,197,238,222, 91,218,157, 61,202,106, 14,157, 16, 65, -249,255,174, 76, 20, 16, 80,252, 53, 77,173,178,184,122,243, 33,118, 28,189,161,102, 56, 36,189,253, 94,142,248, 61,183,180,230, -111,165,193,250,212, 66,240, 83,133, 49, 43, 17,101,175,200,122,219,168, 55, 93, 2, 15, 82,127,231,219,188, 90,187,118,237,169, -197,139, 23, 15, 88,186,116,169,236,209,163, 71,208,235,245,184,112,225, 2,230,207,159,143,246,237,219,195,199,199,135,222,179, -103,143, 98,228,200,145,157, 31, 61,122, 20, 13, 96,188,141,225,165, 0,136,210,218, 46, 26, 0, 95,210,201,159, 29, 62,124, 56, -183,116,233, 82, 42,253, 26, 0, 54, 88,151,189,250, 35,191,137, 44,138,162,160,215,235,177,121,243,102, 80, 20,133, 62,125,250, -224,191,255,254,195,166, 77,155, 80,173, 90, 53, 12, 25, 50, 4,235,215,219,215, 23, 21, 8, 4, 48, 26,141,216,180,233,205,122, -170,190,125,251, 98,239,222,189,111,109, 14, 30, 60, 24,235,214,173, 35, 5, 36,135,216,188, 37,193,104,127,141, 10,224, 92, 45, - 41, 97,176,176, 0, 79,193,247,199, 6, 26,167,108, 61,149, 53,190,247, 39,151,242,138, 79, 23, 87,105,242, 26, 22, 99, 82,238, -121,205, 88,120,123,185, 59,128,135, 0,169, 70,171,205,147,246, 40, 26,214,187,207,147, 10,181, 25,184, 98,238,159,115,126, 2, -123,187, 31, 86, 47,157,130,222,147,143, 78,185,118, 79, 95,214,158, 48,112, 64, 1,103, 71, 25,248,168,253, 48, 39, 61, 67,138, - 46, 20,241, 49,161, 72, 73,142, 71,106,114, 18, 18,146, 82, 16, 22, 25,135,163,151,195, 57, 51,155,245,176,219,187, 24, 76,212, -139, 35,187,103, 81,190, 5, 74,202, 30,221,121,157,220,231,247,162,136,188,127, 44, 69,229,224, 32, 61,127,249,170, 32, 81, 79, -219,212,213,119,114,114,116,114,245,169,140,158, 61,186,193, 98,177,160, 91,183,110,240,242,112, 70,235, 90,114, 28, 57,114, 4, -189,123,247,134,155,155, 27,154, 53,107,134,205,251,110,193,204, 75,109,158,119,182, 53, 80,171,223,115, 91, 27,153,254,225,129, -198,101, 74,122, 1,172, 30,229,212, 94,160, 41, 52,120,247,251, 61, 23,190, 76,113,149,159,197, 80, 94, 76, 78,206, 40,108,143, - 19,206,217,252,188,220,158, 35, 68,200, 7, 13, 11, 77,247, 15, 8, 8,144, 57, 56, 56, 64, 42,149, 98,243,230,205, 24, 52,104, - 16, 36, 18, 9, 40,138,130, 92, 46,135, 92, 46, 71,223,190,125,101, 20, 69,245,181,197,166, 90,165,169, 60,100,200, 16, 39, 0, - 18, 0, 50, 0,114, 0,242, 7, 15, 30, 40, 61, 61, 61,157,106,215,174,173, 44, 91,182,172,114,211,166, 77, 37,133, 66, 97,197, -220,240,100,185,185,185,157,234,209,120,116,249,220,136,147, 83,247,183, 24, 24,134,121,152, 54, 39, 75,110,179, 47,130,231, 41, -131,193, 0,171,213,138, 42, 85,170, 96,207,158, 61, 24, 57,114, 36, 74,150, 44,137, 51,103,206,224,224,193,131,168, 83,167, 14, -140, 70,163, 93,205,162,209,104,132,213,106, 69,213,170, 85,177,119,239, 94,140, 26, 53, 10, 37, 74,148,192,153, 51,103,112,224, -192, 1,212,171, 87,207, 94,155,132,236, 8,172, 97,254,154,118, 10,165, 36,168,119,139,146, 69,132, 53, 86, 65,218,228, 24, 22, -206,153, 82,182,160,187,123,240,112,127, 77, 91,187,157, 87,214,228, 44,189, 71,102, 67,238, 8,172,245, 7,224,227,166,146,205, -105, 90, 71,141,251,207,147, 17, 25,155,186,215,158,223,203,229,133,227, 69, 18,241,178, 84,163, 5, 66,161, 16, 9,201, 28, 68, - 18,159, 5,172, 64,152, 96, 95,133,195, 69,222,185,122, 0, 38, 99, 42, 18, 99,195,241,242,229,115, 60,127, 21, 14, 93, 98, 34, - 20, 18, 10, 5,188, 84, 40, 89,172, 16,218,212,113,166,165, 66,244,182,199,182, 50,198, 84,249,193,189,107,236,213,179,107, 4, -142,114,129, 72,229,172,132,202,193, 81,124,230,242, 77, 65, 88,100,138,126,231,113,189,198, 22, 59, 9, 9, 9, 9,241, 79,119, - 97,235,214,173,160, 40, 10,219,183,111,199,131, 7, 15,112,248, 74, 34,182, 29, 10,196,176,159, 87,224,215,223, 23,225,216,241, - 83, 8,124,197,195, 73, 33, 40,216,187,201,112, 62,160,249, 56,179,245,225,207, 54,135,183, 93, 53,141, 95,139,250,101,127,107, - 82,183, 12,192,234,209,177,121, 69,212,174, 88,104, 81,199,106,154, 98,196, 35,240,190, 56,201,206,188,171,143, 9, 22, 91, 39, -181,219, 58,111, 43,253,147, 19, 28,143,143,200,150, 29, 34,178, 62,127, 94,205, 74, 20,235,245,250,126,211,167, 79, 55,188,122, -245, 10,101,203,150, 69,108,108, 44,154, 55,111,142, 86,173, 90, 65,161, 80,192,207,207, 15, 81, 81, 81,152, 58,117,106,170,209, -104,236,103,227, 99,195,215,172, 89, 83,226,236,217,179, 14,105, 2, 75, 17, 19, 19,163,140,141,141,117,240,245,245,117, 12, 8, - 8,112,157, 55,111, 94,161,225,195,135, 43, 44, 22, 75, 88,118,222, 43, 57, 57, 25,207,158, 61,195,241,227,199, 49,104,208,160, -100,179,217, 44,112,114,114,154,154,147,120, 86,171, 52, 2,255, 82, 93,228, 13,202,118,119,181, 90,173,229,120,158,167,133, 66, - 97, 81,123,108, 24,141, 70,208, 52,141,202,149, 43,227,234,213,171,152, 53,107, 22,238,221,187, 7, 79, 79, 79,132,132,132,160, -110,221,186,160,105,251,182,112, 52, 26,141, 16, 8, 4,168, 92,185, 50, 46, 95,190,140,217,179,103,227,254,253,251,240,242,242, - 66,104,104, 40,234,213,171, 71, 10, 73, 14,201,116,136,112,152, 70,227, 14,208, 75,107, 87, 46,216,165,121,221, 98,176,166,134, -130,227,121,208, 0,124,221,149, 88,178,114,131,251,238, 29, 59,247, 13,211,104,254, 5, 48,124,169, 86, 27,109,155, 7, 43, 37, -115,111, 15,207,195,108, 76,204,209,139,173,221, 7, 15,147, 25,189,202,150,244, 28,183,240,231, 54,110,206, 42, 9,230,175,191, -194,209, 2,108,177,217,209,198, 2, 79,159, 62, 45,232,232, 8,142,166,210,165, 31,143,228,228,100,177,197, 98,118,231,236, 24, -196, 76, 73, 52,205,252,101,202,252,165, 51, 71, 53,160, 68, 86, 11, 94, 60,143, 6, 67,177,112,148, 41,225,224, 93, 29, 42,121, - 97,120, 36, 69,128, 22,220,166, 10,159, 9,239, 30, 17,195,205,177,213,246,152,147, 90,253,152,118, 45,255,216,123, 58, 98,146, -149, 46, 9, 41, 31,201,255,181, 63, 84,112,241,238,107,208, 28,221, 39, 88,167,181,105,179, 82,158,199,159, 83, 23,159,152, 58, -170,199, 72, 56, 43,205,240,247,247,199,214, 93, 71,161,148, 1, 21, 10, 3,114,185, 12,133, 11, 21, 2, 69,211, 80,221,126,128, -177,125,171, 77,168,217,122, 58, 26, 54,235,104,215, 92, 57,149, 66,186,106,210,144, 22, 2,139, 49, 9,115, 86, 30,193,228, 33, -141, 48,125,120, 3,105,139, 1, 27,254, 4,240,221,183, 42,172,114,195, 94,122,195,247,177,161, 55, 91,108,230,100, 50,180,189, - 30, 50, 50,135,234,235,226,221,244,223,118,106,209,177, 62, 45, 38, 12, 9, 8, 8, 88, 30, 16, 16, 32,234,211,167,143,224,210, -165, 75,176, 88, 44,168, 81,163, 6,214,172, 89, 99,221,182,109,155,213, 98,177,140,221,114, 98,193,126, 91,236, 7,235,180, 81, -106,149, 70,216,164, 73,147,130,117,235,214, 53,183,104,209, 2,245,235,215, 7,203,178, 84, 96, 96, 32,115,229,202, 21,250,210, -165, 75,180,213,106,125, 25,172,211,102,107, 17,214,140, 25, 51,146,157,156,156, 28,198,140, 25,131,185,115,231,134,174,220, 61, -173, 76, 78,227,197,219,219,187, 24, 0, 42, 60, 60,252,177,183,183,119,129, 51,129,219,236,205,248,148,217,108,134, 92, 46, 71, -112,112, 48, 26, 53,106,132, 67,135, 14,193,211,211, 19,158,158,158,104,220,184, 49,238,222,189, 11,165, 82, 9,202,142,249, 59, - 70,163, 17, 18,137, 4, 65, 65, 65,104,208,160, 1,142, 28, 57, 2, 47, 47, 47,120,122,122,162, 73,147, 38,184,125,251, 54,156, -156,156, 72,198,206, 11,129, 53, 76,163, 25, 42, 17, 98, 81,139, 26,114, 65, 17,117, 1, 24,163,174,227,254,139, 20, 44,108, 94, - 57, 84, 36,150, 83,125,186, 53,247,169,221,192, 3,254,141, 52, 40, 92, 72,213,117,245,202, 53,157,134,249,107, 6, 31,187,199, -255,157,185,120, 66,138, 62,225, 5, 39, 46, 60,144,226,194,119,243,188, 57,238,189,239, 25,145, 28, 98,133, 59, 21, 17,171, 51, -115, 60, 82,108,121,137,191,119,163, 1, 69,211,219, 88,142,151,176, 44,255,192,215,219, 89,222,162, 65,225,178,237,155,250, 49, -149, 74,251,192,108, 54,226,151, 69,251,173,135,206, 62,233, 55,184, 11, 2,109,141,156, 50, 69, 84,194, 91, 65,177, 19,165,140, - 96, 1,149,182,117, 6,207, 3, 50,153, 73,105, 53, 91,127, 46,234, 37, 2, 96,177,201, 86, 76, 50, 86,223,127, 28, 34,232,255, -243,191, 99,138,249, 40,124, 26,250, 9,233,130,174, 98, 56,186,169, 33,113, 40, 0,150, 3,244,186, 87,160,121, 43, 40,112,222, -246, 38,228,173, 39,142, 35, 39, 76, 24, 67,181,238,215, 31,101,158, 61,195,165, 75,151, 16,118,254, 47,132, 71, 68,172, 2, 96, -147,215,110,219,169, 69,211,186, 55, 26, 37,237,125,251,225,184,254,205, 25,236, 60,124, 7, 74, 25,224,236, 0, 84,173, 90, 21, - 55,111,222, 68,104, 88, 24, 74,148, 40,129,142,141,139,160, 76,169,226,208, 5,173,135, 12, 17, 54,135,179,109, 21, 77,201, 30, -223, 85,170,166, 82, 80,248,107,251,121,236, 56,114,111, 87, 81, 95,135, 78,189, 90,149, 70,157,202, 62,205,219, 85,210,120,237, -187,163,141,248,218, 10,154, 61,195,101,185, 33,132,236,241, 90,125, 14,113,245, 41,226,146,240,121,227,127,195,145,185,235,123, - 53, 29,123,125,227,198,141,227,105,154,214, 24,141, 70, 79, 0,252,137, 19, 39,194,172, 86,235, 25,163,209,184,120,243,241,249, -129,246, 60, 59, 88,167, 13, 85,171, 52,113, 87,175, 94,117,189,123,247,174,106,210,164, 73, 14, 0, 32, 22,139, 83, 82, 83, 83, -227, 1,196, 6,235,178,183,127,158,193, 96,144,221,187,119,239,138,209,104,116, 25, 57,114,164, 95,179,102,205, 74,119,107, 56, -178,214,246,211,139, 47,103, 55,174, 24,134, 17, 88,173, 86,134, 97, 24, 17, 0,154,166,233,148, 22, 85,250, 58, 30,185,185,206, - 46, 15,130,217,108,134,131,131, 3,158, 60,121,130,129, 3, 7,162, 72,145, 34,120,241,226, 5, 52, 26, 13, 26, 53,106,132,213, -171, 87,195,213,213,213,174,176, 89,173, 86, 40, 20, 10, 60,121,242, 4, 3, 6, 12, 64,137, 18, 37,240,228,201, 19, 52,104,208, - 0, 77,154, 52,193,138, 21, 43,224,230,230, 70, 50,124, 30,121,176,126,219,184,122,150,192, 24,121, 9, 39, 78, 30,135,246,158, -153, 11,137,197,159, 0, 38,195,152,138, 69,171,119,207, 58,125,229,201,176, 31,250,245,166, 26, 53,109, 15,255, 58,213,153, 86, -173,187,254, 2, 32, 83,129, 69, 3, 83, 27, 52,109, 53,227,151,225,221,212, 77, 26,244, 81, 10, 83,174, 83,116,244, 21,158, 22, - 72, 32,119, 41, 74, 25, 89,145,245,232,149, 23,241,231,239, 37, 62,167,129,105,182,101, 98,122,211,245,187, 17,110, 72,186,139, -231, 15, 15,212, 42, 90,184, 60,192,153, 97, 50,166, 64,123,253, 62,254,222,126, 70,119, 47, 40,188,195,144, 46,176,169,102,120, -244, 82,119,242,113, 72, 98,227, 69, 99,107,163, 67,163, 34,253,102,252,125,179,103,250,214,100, 60,207,163, 97, 69,249,147, 46, - 26, 15,145,152, 54,193,194,139,113,255, 89,252,129, 74,245,179,182, 27,155,128,229,177, 9,198,229,137,113,198,162,183,130,240, - 91,151,134, 30,157,107, 87,183,210,201, 81,215, 17,254, 34, 8,177, 73, 60, 94,198, 74,192,101, 99, 11, 12,145, 72, 84,224,223, -127,255,213, 89,173, 86,156, 63,127, 30,215,174, 93, 3,199,113,208, 62,250,215,174,185,192, 74,165,114, 22,107,136, 26, 87,183, -122, 25, 4, 61,188,131,194, 62, 78, 40, 82,164, 8,188,189,189, 17, 20, 20, 4,165, 82, 9,161, 80,136,221, 39, 95, 32, 52,116, - 53,138, 23, 47, 14, 43,228,182, 87, 56, 64,207,102,117,138,130,179,166, 98,207,177, 7, 47,149,102, 4,236, 60, 26,216,188, 87, -203, 66,138, 22,117,124,232,115, 55, 66,187, 1, 88,244, 45, 10, 43, 91,132, 80,118, 55, 23,253, 90, 4, 11, 17, 87,185, 27,151, -246,122, 74,237,141,255, 52, 1,213, 39, 55,195,157, 38,160, 94,167,125,114,147,173,177,177,177,191, 1,104,119,244,232,209,191, - 59,118,236,136, 29, 59,118, 12, 4,144,109,129,101,181, 90,147, 93, 92, 92,158,166,164,164,184,248,250,250,122,152, 76,166, 8, -150,101, 11,192,182,149, 86,111, 61, 88,122,189, 30, 82,169, 20, 60,207, 99,227,198,141,168, 84,169, 18, 90,181,106,133, 71,143, - 30, 97,245,234,213,144,203,229,248,112, 47,171,172, 72, 78, 78,134, 66,161,128,213,106,197,166, 77,155, 80,185,114,101, 52,111, -222, 28, 65, 65, 65, 88,177, 98, 5, 28, 28, 28,236,182, 73,176, 93, 96,153, 77,145,151,145,250,252, 32,182,157,133,133,229, 81, -119,169, 86,123,237,157,239, 71,140,240,215,108,159,249,219,220, 11,155, 55,253, 69, 91, 18, 95,192, 22,119,206,238, 91,218, 19, -157, 53,154, 75, 83,102,175,235,191,120,205,238, 1, 19, 6, 54,243,173, 85,177,161, 66, 85,216,139, 63,127,253,113,194,161,139, - 65, 97,102, 35,247, 15,173,196,154,157, 90,173, 77, 43, 45,120, 0, 72,186, 15,164, 60,194,177,179,119,224,227,149,128,160, 39, - 33,252,254,147,215, 47, 37, 36,233,215, 42,157,177,107, 72,103,219,188, 97, 0,144,144,138,129, 13,250,239,255,171,231,119, 37, - 26,143,239, 83, 9,199,150,183,146,188,138, 72,134,217, 98, 70,219,234, 52, 56,139, 80,196, 83, 28,206, 61,164,177,246,112,200, - 94, 41, 47, 29, 97, 79,164,135, 39,227, 57,128, 94, 39,174,197, 32, 73,127,183, 99,135,198, 5, 4, 20, 92, 16, 25,155,136,109, -199, 95, 36,132, 69, 33,192,222,132, 52,155,205,161,173, 91,183, 70, 64, 64, 0,234,214,173,139,219,183,111,227,175,191,254, 66, -253, 50,221,162,206, 62,220,110,143,200, 50, 26,173, 2, 28,215,222, 71,223, 94,237, 97, 54,155, 97,177, 88,144,154,154,138,234, -213,171,131, 7,133,160, 39,161, 72,230,188,248,219, 49,190,171, 14,221,139, 26,204, 11,139,217,124, 94,162,155, 74, 22, 80,165, -180, 51,110,221,127,129,208,200,164, 77,123,238,107, 13,237,171,104,118, 4, 62,137,254,161, 81,117,111,200, 37,130,128,175, 69, - 96, 17,113,149,187, 2,128,136,171,207, 39, 74,191,133,184, 95,181,231,215,225, 0,208,161,238,144,237,187,119,239, 94,220,170, - 85, 43,185, 74,165,170,149, 19,155,218, 71,255, 62, 4, 0,181, 74, 19,237,237,237, 93, 49, 38, 38, 38,220,215,215,215,190,253, - 39, 41, 42,242,216,177, 99,158,111,219, 59,158,199,213,171, 87,177,114,229, 74,208, 52, 13,134, 97,222, 14, 13, 50, 12, 19,143, - 44,182,104, 72,179,105, 62,121,242,164,232, 93,111,214,141, 27, 55,176,114,229, 74, 8, 4,111,130,151,254,255, 52,123,100,139, -134,108, 64,101,180,119, 88,179,138,212, 96,188,241, 32, 49, 20, 48,241, 79,173,246,159,143,221, 55, 76,163, 25,139, 55, 75,108, - 57,240, 24,115,236, 30,191,197,214,130,218,186,134,198, 85,104,197,176,130,222,170, 30, 41, 41, 6, 62, 62,201,184,205, 34,192, -210, 3, 87,181,177,182, 52, 16,233,135, 61,255,189, 27, 13, 64,211,219,192, 65,104,229,185, 21, 52,133, 35, 50, 17,158,244,110, -141,152,204,194,146,213, 97,207,203,150,205,104,226, 40,103,254, 24,210,185,108,249,161, 93,202, 33, 57, 57, 1,119,239,222,195, -157,151, 60,150,239, 9,191,174, 55,242, 99, 6, 13,157,242,222, 70,121,246, 30,246,236,229,130,102, 5,221,168, 85, 98, 33, 47, -182,114,120, 28, 22,139, 95, 94, 69,225,210, 59,133,201,106, 75,229,215,172,114, 31, 39,179,217,252,222,182, 9, 60,207,227,236, -195,237,148,189, 13,109,207,198,163,199, 50,148,233, 15, 17,175, 3, 5,246,173,140,229, 33, 0, 11, 17,120,198,129, 55,179,130, -239,183,158, 92,180,209,150,116, 74,183,173, 86,105,168,129, 29,189,205,171,167, 54, 16, 76, 89,122, 9,255,157,124, 81,122,215, -109,109, 80,135,170,154, 6, 61, 91, 20, 63,253,115,191,202,232,241,243, 41,235,182,163,241,162,244, 51, 9,191,228, 9,205,185, -189, 58, 46, 39,103, 16,102,199,158,173,231, 10,102,119,104, 49,171,189,172, 62,215,230,152, 4,226,105,236,222,104, 84, 43,185, - 92, 62, 89,175,215, 47,216,122,114,225,206,220,176,169, 41,221,213, 13,128, 59,203,178,113, 23, 30,239,138,204,105, 57, 85,171, - 52,212,167, 60,187,149,148,183, 92, 18, 88,121,177, 11,117,102,153,165,117, 13,141, 43, 0,188, 43,172,236, 17, 88,217, 37, 43, -129, 5, 0,103,207,158,165, 31, 60, 56,215,171,144,135,108,197,248,239, 43, 75,167,175,190,145, 28,171, 51, 13, 24, 50,108,234, - 71, 11,157,189, 2, 43, 75,239,156,141, 2,235,157, 66,119, 25, 64, 77, 0,199,130,117,218,230,159,202,147, 97,235,252,156,142, - 85, 53,139, 43,148,116, 29,116,255,113,252, 95,187,110,156, 25,158, 94, 81,148, 43,142,229, 85, 74,185, 5,220,120, 20, 51,103, -207, 13,237,204, 47,185, 80,231,182,167, 41,187,105,147, 83,155, 31, 19, 88, 31, 94,207,142,157,143,253, 54, 55,133, 27,129,240, - 41,203,247,151,146, 15,243,178,142, 39,124,156, 79,190,147,251,199, 18, 41, 56,152,143,205,175, 17, 84,191,126,125,174,126,253, -250, 27, 55,111,222,188,109,232,188, 75, 85,196, 98,175,219, 67,134,245,183,121, 47, 45, 91, 4, 82,110,198, 41,207,243,181,242, -115,134,219,125, 67, 59,178, 71, 99,205,184, 93, 55,180,111,135,147,211,122, 97, 67,210, 62,223,100,143, 61, 47,122,252,153,117, -148,178, 51,244,150,151,135, 49,147,225, 64, 2,129,240,181,241,201, 61, 88, 4,210,187, 33,241,151,191, 40,233,228,159,211,142, -150,149,148, 32,194,183, 90,214,137, 7,139,144, 17, 2,146,184, 4, 66,174,136,148, 47, 57,248, 68, 32, 17, 8,223, 96,231,138, -240,149, 8, 44, 34,144,136, 64, 32, 16, 8, 4, 2,225,155, 22, 88,164,177, 37, 16, 8,132, 47,143,252,236, 77,249, 90,219,149, -111,101,136,144, 96, 63, 52,137, 2, 2,129, 64, 32, 16, 8,132,220, 69, 96,143,218,205,104,217,246,183,208, 75, 33,228,126,207, -233,107,202, 79, 95, 74,239, 48,163,195,160, 63, 71,207, 60,171,124,145,254,189,227,241, 17,255,179, 95, 86, 86,123,104, 17, 8, - 4, 66,190, 21, 88,159,170, 82,205,170,145, 37,130,205,182, 56,205,106,207,163, 47, 33, 30,237,105,252,243, 99,216,179, 35,190, -178,147, 46, 57,217,112, 52, 39,241,155,221,189,179,108,217, 42,226, 99,247,166,231,135,143, 9, 41, 34,174, 62, 77, 25,202,205, -173, 51,242,123,217,206,206, 94,108,217, 41,223,246,182,113,182,220,159, 23,139,200,200,144,226, 23, 40,176,178,202, 80,100, 47, -156,220,141, 79, 91, 27,241,236,108,234,104,207, 97,194,182, 10,137,175, 49,253, 63,244,200,228,180,129,202,137,189,140, 26,224, -220, 8, 99, 78,247,201,202,203,125,182,190,197,250,128,162, 40, 4,235,180,185,158,150, 95, 99,189,156,215,245, 78,110,217,204, -172,179,146,219, 27, 18,127,201, 29,222,252, 2,253, 57, 51,114,110,222, 75,248,244,105,150, 29,209,148, 87,121,133,136,233,236, -139, 22, 18,207, 95, 39, 60,207,103, 43,191,100,183,179,148,254,219,172,190,255,218,202, 24,169,203, 8, 25, 33, 32, 81, 64, 32, - 21, 65,238,147, 23,195,178,185, 33,174,242, 34,189, 73,158,201,255,101,250,115, 29, 59,148,149,192,255,156, 30,146,172, 70, 82, -114, 59,108, 31,218,204,237, 14,170, 61,241,154,215,157, 99,194, 27,200, 42, 66, 2, 41, 76,185, 36,168,222,253,228,230, 17, 50, -217,153,115,245,169,196, 85, 78,223, 45,187, 68,237,168, 76, 50,221,103, 44,247,182,120,185,108,205,131, 57,241,112,231,101, 30, -206,205, 50, 76,234,216,111, 19,226,193, 34,124,146,134, 52,187,147,185,191,196, 10, 41, 63,135,249, 99, 7, 54,127,206,180,183, - 55,141,223, 54, 86, 77,151,192,131, 20,173,111,174, 83,101,207, 60,189,220,240, 64,229,150, 39,235,221,124, 78,230, 54, 17,129, -101,115,198, 38, 25,133,144, 29,111, 5, 89,181,242,233,197, 80, 94,196,111,110, 52,110,246,136, 44, 82,231, 16, 49,248, 57,158, -155, 23, 34,139, 64, 4, 86,150,153,129, 84,120,164,210, 3, 0,235,195,159, 33, 40, 51, 59, 71, 21,229,215,144,151,114,163,226, -204,201,144, 66,122, 28,102,182,253, 73, 78,203,115,110, 53, 14, 31,219,223,138,136,172, 47, 35,175,146,248,207,255,194,144,144, -207, 5,150,189, 19,225, 72,161,251, 60,124, 45,251, 96,145, 74, 52,231,246,210,203,224,199,210, 60,175,182,235,200,110,163, 75, -246,178,250,250,234,161,236,228, 97, 91,243,141, 61,245, 88,110,181, 69,121,185,101, 3,169,147,191,126,232,220,172,224, 73,134, -249,186, 42,200,207, 33, 68,190,214, 60,148,219,141,136,173, 27, 32,218, 51,233,254, 83,138,171,252,158, 79, 9,185,147,151,115, - 59, 45,243,194,230,167,174,143, 72, 59,249,237, 64, 38,185,147,202,144,144,143, 26, 35,123,119,117,206,141, 10,253, 75,202, 35, - 36, 63,231,110, 92,218,219,216,231,133, 32, 34,121,128,240,181, 66,219,155,177,223,253,228,117,225, 32, 5,233,235,239, 45,125, -205,105, 76,196, 85,238,198, 31,169, 15, 62, 95, 25,203, 73,157,255, 37,197, 83,110,191,227,183, 16,111,132,140, 17,228,164,144, -230,100,249,125,102,149, 63,201,144,159,175,114,205,238, 60,135,146, 54, 76,112, 39, 43,197,178, 47,174,242, 66, 92,231, 86,222, -200,110, 90,217,114, 96, 51,169, 11,242, 71, 39, 43,175, 61, 93,249,169,110,204,139, 57,171,153, 45, 60,201,110, 57,205, 73, 61, -153, 23,157, 53, 66, 14, 4, 86, 94, 68,110,110,156,173, 70,200,184,176,126,202,194,151,157, 74, 38,179, 10,238, 91,247, 24,228, -117,124,228, 36,111,228,214, 78,220,137, 77,151, 32,145, 76,248, 37,162,238, 11,123,151,236, 78,230,207,238,111,108, 61,187,247, -107, 16,189, 95, 27, 20,207,243, 36, 22, 8,121,114, 26,123,102, 21,146,173,207,251, 82, 42,234,252, 90,121,229,100,114,123, 94, -199,125,102, 13,149, 45,241, 73, 68, 25, 33, 63,148,117,146, 15, 9, 25, 65, 38,185, 19, 62, 75, 35, 79, 42,165,252, 35,252, 62, -231, 6,142, 68, 60, 17, 8, 4, 34,176, 8, 4,194, 55, 43,194,242,163, 64, 35, 16, 8, 4, 34,176, 8,249, 30,181, 74,147,163, -188,192,243,188,149,196, 34,129, 64, 32, 16, 8,153, 8, 44, 50, 25, 46,127,146,151,158,130, 47, 77, 32,145, 60, 74, 32, 16, 8, -132, 47, 78, 96, 17, 8, 4, 2,129, 64,248,178, 58,123,100,184,158, 8,172,247, 24,221,107,158,136, 97, 24,250,143, 13, 99,140, - 36, 57,190,156,130,252, 53,145, 86, 41, 81, 57, 76,155,124,177, 28, 87,173,210, 80,190,190,190, 94, 28,199, 21,246,242,242,242, -142,138,138, 10, 57,117,127,203,181,207, 81,241,102,181, 58, 49,179,252,108,235,170, 84,181, 74, 67,189,147,118,124,176, 78,203, -147,198, 39,123,105,148, 31,150,252,147, 52,250,124, 92,191,126,157, 47, 80,160, 0,252,252,252, 30, 69, 68, 68, 44, 5,176,238, - 69,210,117, 99, 97,135,170, 36,114,114, 91, 96,125,170,205, 30,105,154,110, 34,145, 72, 28,198,245, 89, 16,202,113,220,163, 5, -155,198,197,101,187,113,105, 63,141,246,208,185,148, 96,132,194, 66, 60,207,187,130, 7, 64, 49,177,156,197, 28, 18,229, 28,251, - 56,120,239,116,238,255,223, 79,131,199, 9, 90,155,109,183,169,160,145, 50, 34,248, 80, 60, 40,142, 71, 56,128,212,125,183,180, -118,133,239,202,124,141,148, 51,131, 7, 96,156,178,205, 87,196,113, 92, 97, 0,133, 0,112, 60,207,191,146, 74,165,175, 0, 88, -166,117,127,254,246,190,239,231,193,174,112, 30, 94,162, 17, 49, 0, 15,192, 50,236, 87,224,177, 78,155, 43,233, 20,208,124,188, -135, 68, 34,241, 51,153, 76, 74,177, 88,156,196,178,108, 32,128,144,127, 14,252,110,183,173,154, 69,251,138,140, 52,235, 41, 22, -203,156, 77, 38,125,188,132, 99, 34, 1,152,175, 60, 95,151,173,176,253,216, 94, 67,201,197,194,202, 34, 33,235,203, 48,156,140, -229,104,131,217,196,132,113,140,229, 22, 0,110,241, 86,251,227,192,223,223, 95, 98,177, 88,106,137,197, 98,103,179,217, 44,228, -121, 30, 98,177,216, 98, 50,153,116, 74,165,242,242,177, 99,199, 12, 54, 52, 22,159, 84,180, 53, 44,215,195,181,124,249,242,117, -107,213,170, 37,173, 86,173, 26, 28, 29, 29,177,102,205,154, 98, 77, 42,246,190,243,234,213, 43,115, 62, 21,182,217,174,103,212, - 42, 13,221,166, 77,155, 70, 0,138,164, 95, 27,215,103,193,255,220,199, 48,140,113,239,222,189,155,121,158,231, 72,149, 79, 32, -124,156,227,199,143,163, 95,191,126,184,113,227, 70,233,227,199,143,175,152, 52,105,210, 79, 69,148,213, 26,242, 60, 31, 77, 98, - 39,123,124,116, 31,172,244,205, 4,139,215,237,211,138,226, 33,225,193,131,231,120,240, 0,120,158, 71,218,127,233,255, 6,207, -243,224, 88,206,120,246,204, 79,135,108,121,232,216,128,249, 37, 45, 22,139, 35,195, 48,143,105,154,110,190,110,221, 58,250,233, -211,167,216,180,105, 19, 66, 66, 66,162, 41,138,122,180,127,255,254,240, 96, 59,196,129,191,102,177, 51, 45,144, 52,110,223,166, -165, 67,171,166,158, 76, 33, 47,119,240,188, 20,143,158,153,113, 76,123,131, 59,116,228, 88, 50,107, 52,158, 60,127, 97,100, 28, - 0,156,154,163,193,224, 57,153,139,151,239,203,107,152, 20, 49,188, 56, 14, 5, 10,250,184,184,142,252,177,163, 56, 86,167,199, -218, 45, 7, 76,145, 49,137,113, 60,143, 80, 74,134,112, 0,214, 61, 23, 50, 15,235,233, 57, 26, 63, 30, 80,131, 2,127,235,177, - 60,249,124,160,175, 98,208,160, 65,116,219,182,109, 17, 31, 31,143, 93,187,118, 97,199,142, 29,236,119,213,194, 83, 75, 23, 54, - 42, 41, 10, 60,207, 35, 16,192,253,172,194,249,246, 25,127,104,202,243, 28,202, 0, 64, 84, 60,130,183,252,133,123, 0,184, 67, - 57, 20, 89,189,154,142, 45, 42,149, 74,171, 78,155, 54,141,169, 80,161, 2,130,130,130, 48,105,210, 36,214,100, 50, 93, 2, 16, -186,241,232,188, 44,109, 84, 41,245,131,196,202,242,222,133, 10, 21, 41,208,166,125, 55,207,186,254,254,194, 66,190, 94,244,171, -208, 8,238,194,185,115,150,253,123,183, 71,190,122,245,226,181,128,161,194, 1, 24,111, 6,173,181, 89, 92, 57,201, 5,205, 59, -116,158, 40,233,212,101,130, 64, 36,146,210, 49, 49,225,198,245,107,199,112, 87, 47,237,230, 76, 28,119, 36, 43,145,245,161, 7, -171,102,205,154, 37,133, 12, 83,121, 68,239,222, 84,141,186,117,225,224,235, 11, 65,100, 36, 18,173, 86,156,127,240, 0,203,150, - 45,227, 45, 22,203,253,171, 87,175, 62,204, 76, 12,149,116,242,167,234,212,169,243,157,197, 98, 81,216,220,227, 17, 8,140,223, -127,255,253,254,129, 3, 7,242,246, 8, 44,181, 74, 67, 85,170, 84,169,221,172, 89,179, 36, 12,195, 32, 48, 48, 16, 23, 47, 94, -196,213,171, 87,159,134,134,134, 94,255, 28,251,221,217,235, 29,161, 40, 10,233,101, 62, 43, 15,150, 90,165,161, 91,183,110,221, - 88,173, 86,251,204,154, 53, 75,248,228,201, 19,148, 42, 85, 10, 44,203,130,227,184,247,254, 31, 16, 16,192,139,197,226,181, 59, -118,236, 96, 73,149, 79, 60, 88,185, 25,103,249,181,211, 98, 43,133, 58,252,189, 2,192,224,244,191, 7, 86,137, 70, 82, 82, 18, -250,247,239,143,132,132, 4,212,172, 89,115, 29,203,178, 63,144,146,146,203, 30,172, 55,234, 11,146,107, 71,255, 18, 74, 68, 12, -204, 22, 22, 38, 11, 11,163,201, 10,131,201,138, 84,163, 5,169, 6, 43,146,245,102,132,199,166,224,215,223,102,217,252, 80,157, - 78, 87,121,192,128, 1,244,142, 29, 59,138, 91,173, 86, 62, 49, 49, 17,114,185, 28,211,167, 79, 71,116,116,180,251,182,109,219, -220,121,158, 79, 28, 27, 48,255,214,252,141, 99, 35,179,242,178,213,209, 44,112,242,244,240,108,189, 96,198, 64,177, 95, 41, 53, - 40,112, 8,137, 10, 3,160, 64,177, 2, 12,190,239, 88,133,174, 91, 85,236,184, 96,249,201, 86,254,254, 11, 15,156, 59, 55, 58, -126,240, 28, 30,127,141,165, 80,127,242,199,109,183,171,170, 41, 40,149, 11,202, 14,237,213, 84,218,182,109, 27,161,123,145, 26, - 52, 69,139, 0,224,255,216,187,238,176, 40,174,183,123,102,102,251,210,123, 17, 4, 27, 40, 54, 4,123,193,130, 81, 99,239,138, - 26, 77,236, 37, 22,236, 73,140, 70,163,198,168,216,187, 49, 26, 21,187,198,174,136, 5,187,136, 88, 16, 21, 4,164, 40,189,238, - 46,108,153,157,153,239, 15,129,160, 17,118, 81, 19,253,229,155,243, 60,251,192,238,206,190,115,231,222, 59,247,158, 57,239,123, -223,139,129,195, 3,133, 49, 15,175,200,254, 60,126,194, 97,255,201,171,106, 70,207,198,244,246,241, 75, 56,118,239,221,147,248, -205,101,126,114, 74, 64,121,140, 30, 52, 6, 44,203, 16, 91,247,255,102,182,106, 71, 24, 76,204,237, 1, 0,238,238,238,240,241, -241, 65,224,228, 17,212,159, 27,235,154,141, 30, 56, 30, 44,203, 16, 91,246,109,245,162,104,196,110,157, 1,109,121,229, 44,193, -141, 21,126, 50,142,133,215, 55,253,190, 38, 24,134,193,206,163,123,106, 59,182,106,228,121,235,246,131, 84, 15, 75,191, 7, 0, - 20, 49,149, 36, 90, 95,119,157,107, 71,211,180,147, 84, 42,173,181,107,215, 46,202,205,205, 13, 0,208,170, 85, 43, 44, 92,184, -144,154, 63,127,126, 61, 0, 47, 13,217,241,174, 62,188, 65,223,128, 81, 30,221,123,244, 16,213,170,238, 70,102,100,229,114, 17, -145,145, 69, 91, 54,174,205,107,217,166,131,165,191,127, 71,217,144,193, 3,171,198,198, 39,186,156, 56,117,154, 62, 26,188,237, -153,119,205,175, 31,222,127,110, 88,209,146,137,133,222,125,251,207, 17, 15, 29,190, 80,194, 48, 12,155,145,145,156,195, 50,122, -124, 51,106, 21,149,146, 18, 67, 37, 37, 62,245, 1,112,215,216,107,110,218,180,169,135,147,131,131,247,198,197,139, 33,202,203, - 67, 30,199,161, 48, 61, 29,130,197,139, 33,144, 74,225,255,227,143,104,211,166, 13, 49,105,210,164,250, 77,154, 52, 65,120,120, -248,147,138,236,209, 52,109,114,109,195, 6, 66, 80,165, 10, 56,157, 14, 58, 27, 27,176,220,235,135, 19,209,211,167,128, 86, 11, - 78,167,131,198,219, 27, 52,195,160,103,207,158,146,123,247,238, 17,120,173, 66, 26, 13, 7, 7, 7, 51, 31, 31, 31,137,153,153, - 25,230,206,157,203,197,199,199, 63, 99, 89,246, 69,216,211, 3, 5,255, 43,131, 81, 9, 9, 52, 52,129,121, 88,250, 17, 93,187, -118,109, 95,179,102, 77,167, 37, 75,150, 8,133, 66, 33, 34, 35, 35,145,145,145, 1, 27, 27, 27,200,100, 50, 8,133, 66, 80, 20, - 5,161, 80,200,143,242, 60,120,148,143,241, 13, 27, 53, 41,125,179, 43,100, 45, 68,114, 43,188, 92,176, 0,171, 87,175,134,167, -167,103, 83,190,138,254, 33,130,197,113, 28,132, 2, 18, 59, 79, 62,132,158,209, 64,165,214, 35, 51,159, 70,174, 66, 15,149, 90, - 7, 85, 17, 13,101,145, 14, 67, 58,213, 6, 73, 84,188,111,116, 59,175,193,126, 4, 65, 88, 2,120, 90,165, 74, 21,116,236,216, - 17,254,254,254,136,143,143, 39, 66, 67, 67, 97,111,111, 15,150,101, 97,101,101,133,239,190,251, 14,153,153,153,230, 83,167, 78, -109, 57,182,247,252,163, 74,229, 21, 46, 56,244,221,228,192, 99,204,122,194, 73, 36,249, 98,249,162,193, 98,129, 48, 14,207,146, - 20,176,183,108, 8, 61, 99,137,124,165, 22, 81,177,151, 16,245,244, 20,170, 59,187, 98,244,144,154,226, 85, 91, 50, 58,123,248, -239,221,207, 69,180,169,208, 93, 64,178,168,115,251,206, 35, 11, 1,151, 13, 66,100,253,198,119,148, 64,140, 58, 62,157, 72,183, -154, 13,197, 3, 7, 38,136,122, 13, 30, 85, 91,108,129,196, 0,127, 63,182,188,114,190,253,164, 78,146,127,175, 47,138,162,222, - 95,138,212,129, 2, 5, 66, 44,150,128,101, 89,144, 36,176, 58,104, 5,145,252, 42,207,121,217,178,101, 78,183,111,223, 14,247, -176,244, 75, 48, 68,178, 60, 44,253,136,102,205,154,121, 10, 4, 2, 79, 91, 91, 91,234,139, 47,190,160, 58,119,238, 76,150,144, -171, 18,184,184,184,144, 26,141,198,220,152,178,153, 90,217,187, 15, 28, 54, 90,226,108, 45, 68, 88,216, 21,250,151,159, 23,100, - 21, 40,242,158, 21,101,103, 43,175,132,158, 49, 53,183,176,170, 61, 99,246,124,219,166, 77, 26, 9,218,117,236, 46,190,116,254, -172, 27,128,135,198,216, 22, 9, 25,167,110, 61, 39,147, 12, 67,235,105, 90,205,228,102, 93, 85, 43,242, 99,117, 38, 38,238,194, -158, 61,134,137,182,108,158,227,100,180, 10,218,166,141, 68, 36, 20, 54,220,176,120, 49,244, 17, 17, 16,183,110,141,234,213,170, - 33, 55, 55, 23,249, 74, 37,152,228,100, 20, 44, 88, 0,193,188,121, 88,183,110, 29, 6, 13, 26, 84,191, 67,135, 14,137, 23, 47, - 94, 44,170,200, 46,101,111,143, 87,238,238,224,180, 90,188, 56,119, 14,132, 68, 2,138,162, 80,165,125,123, 16, 52, 13, 0,200, -189,117, 11,110, 30, 30,239,236, 23,198, 64,175,215, 23, 37, 37, 37,113, 2,129,128,168, 87,175, 30, 17, 23, 23,167,252,212,228, -234,125,213, 8, 35,126, 71,136, 68, 34,247, 37, 75,150, 16, 37, 4,138, 36,201, 82, 66, 69, 81, 84,233,255,239, 91,159, 60,254, -249,126,192,199,148,126, 22,216,244, 32, 50,124, 60,199,104,145,117,115, 45,102,142, 31, 4,133, 66,129,113,227,230,225,229,203, -151,120,246,236, 89, 4, 95, 69,255, 32,193,210,234, 24, 48,140, 22, 19, 90, 93, 4, 69,114,152,117,200, 7, 42, 53, 91, 74,174, - 84,106, 29,138, 52, 52, 12,185, 32,196, 98,177,227,252, 21, 27,136, 43, 23,206, 53, 10, 61,117, 20,201,201,201,208,235,245,176, -177,177, 65,223,190,125,241,242,229, 75,220,190,125, 27, 13, 26, 52, 0, 73,146,112,112,112,128, 80, 40, 20, 1, 32, 11, 10,192, -148,119,131,218,199, 48, 30, 95,141,246, 49,183,183, 18,224,228,245, 51,168, 83,181, 27, 4,164, 6, 5, 42, 45,242, 85, 90, 60, -126,118, 14, 28,107,138, 71, 79,147,209,180,174, 28,173,155, 88,202, 85,151,114,106,111,154, 67, 68,143, 95, 1,196,230,151, 71, -130, 64, 10,205,107, 67, 27,234,197,145,214, 77, 9,129,227,151, 32,204,234, 0, 0, 50, 95,220,197,243,187,193, 72,121,122,145, -107,208,101, 9,193,113, 32, 10, 42,152,202, 90,204, 14, 43, 12, 89,234, 23,187,113,207,166, 90, 20, 69,193,196,121, 0,174,221, -140,132,139,139, 11,170, 86,173, 10,133, 66,129,235,215,175,227,225,195,135,176,224,124,176,105,239,102,112, 28, 7, 2,136,102, - 4,208,190,118, 17, 86,220,144, 45,190, 11, 83, 94, 92,230,151,188,105,239, 38, 87, 0,136,140,161, 52, 59, 38,206, 20, 78,154, - 52,137,218,188,121, 51, 49,124,248,240,198, 15, 31, 62,204,246,176,244,171, 80,201,242,246,246,118,180,179,179,171,187,100,201, - 18,129,151,151,215,223,190,191,125,251,182,121, 84, 84,148,249,205,155, 55,229, 4, 65, 24,117,243,153,152, 89, 83, 17,241,133, -136,138,201, 98,155,250,180, 18,158, 56, 19,226,120, 37,236,154,237,177,163, 7,232, 46, 61, 7,138,154, 55,246, 22,100,230,169, -113, 56,244, 49,151,156,173, 35,164,102,214, 70,203, 14, 2,138,147, 73,165, 82, 54, 37,233, 66,182, 70, 21, 65,131,142,230, 44, -204, 88, 49,199,166,112,213,220,219, 81, 36,193, 72,141,181,165,209,104,154,141, 27, 55,142, 16,218,219, 67,216,181, 43,132,153, -153, 72, 24, 54, 12,200,207, 7,189,116, 41, 80, 60,153, 19, 67,134, 64,210,170, 21,126,238,214, 13,115,254,252,179, 57,128,139, - 21,222, 71, 58,221, 27, 36,154, 40, 38, 0, 37, 96,197, 98,144, 31, 64,174, 1,224,198,243, 35,116, 59,175,193, 49,225,225,225, -158,131, 7, 15, 70, 98, 98, 98,227,246,117, 3, 52,151, 30, 7,191,250, 47, 14, 92, 12,195,224,217,179,103,136,142,142, 6, 69, - 81, 48, 55, 55,135,137,137, 9,132, 66, 97,233,139, 36, 73, 94,193,250, 7,137,240,135,218,252, 88,123, 90,242,120,127, 36, 29, - 29, 61,129, 32,136, 69, 85,171, 86,189,178, 99,237,210, 90,237,218,181, 3, 73,146,184,120,241, 34,126,157, 49, 3, 11, 88,182, -215, 90,130, 88, 58,153,227,230,242,181,245,209, 9, 22,160,209,233, 81,168,254, 43, 69, 82,161,154,134,178,144,129, 74, 77, 67, -165,214,129,227,128, 34,141,225, 20, 74, 18,137, 4, 18,185, 41,234, 54,239,128, 14, 95,246,192,111,251,142,161, 48,251, 21,250, -246,233, 13,150,101, 97, 99, 99,131,175,190,250, 10,251,246,237,131,133,133, 5,100, 50, 25,140,137, 27, 49,179,102,170, 53,111, -232, 65,196,189,140,130,151, 91, 79,216, 91, 53, 69,174, 66,141,124,165, 22, 5,133, 58,212,172, 53,253, 53,217, 82, 22,226,225, -179,189,112,118,112, 39, 40, 97,156,203,248, 95, 16,109, 84,240, 56,199,130,205,190,197,233,178,111,129,144,187, 32,244, 70, 2, - 81,144, 25, 95, 90, 48, 90,171, 48,170,162,131,175, 85,121,160, 41, 20,213,186,118,237, 6, 46, 95,141, 0, 77,211, 72, 72, 72, - 64, 76, 76, 12,206,158, 61, 11,177, 88, 12,137, 68, 2,165,172, 19,234,248, 78,193,212,169,129, 44,128,168,216,248,116,163,131, -220, 59,204, 14,187,113,109,153,223, 19,144, 96,155,213,102, 10,182, 31,187, 43,253,230,155,111, 90,236,222,189,219,238,135, 31, -126, 32,251,247,239, 95, 27,192,157,138,108, 88, 88, 88,212, 30, 53,106,212,223,200,149, 78,167, 35, 83, 83, 83, 69, 49, 49, 49, -102,207,159, 63,183,186,115,231,142,200,196,196,228,113,101, 58,219,246,213, 63,169,183,232,117, 76,247, 1,223, 72, 59,125,225, - 47,108,217,178,133,240, 73, 66, 22,118, 31,187,170, 15, 59,179, 95, 77, 9,197, 84,253, 14, 95,203, 42, 99,147,227,168,194,244, -180,167, 2,142, 77, 64,100,248, 18,167, 86,173,218,228,222,188,121,213,218,175, 77,159,188,248,228, 91, 20, 73, 80,106, 99,109, -201,100, 50,171,214,173, 91,163,160,160, 0,213,171, 85,195,139, 25, 51,128,252,124, 64,169,124,227, 56,101,227,198, 40,248,237, - 55,212,216,182, 13, 18,137,196,210,144, 93,173,131, 3, 18, 67, 66, 0, 0,174,254,254,165,170, 85,246,141, 27,165,106,150,105, -223,190, 16, 44, 93, 10, 65, 37, 98,165,218,121, 13,182,148,203,229, 62, 58,157, 78,153,148,148, 20,110, 99, 99,243,120,253,250, -245,142, 11, 22, 44, 48,159, 53,107, 22, 49,115,230,204,102,237,235, 6,156,189,244, 56,184,232, 63, 54,110,113, 4, 65,112,117, -234,212, 33,178,179,179, 33, 20, 10, 75,201, 85,237,218,181,241,242,229,203, 82,114, 85,162,104,241,248,188,200,213,187,126,195, -147,172, 79, 3,146, 36,127, 57,118,236, 88, 45,169, 84,138, 95,126,249, 5,102,102,102, 8, 93,178, 4, 39, 40, 10, 66,145,200, -236,160, 78, 55, 30, 0, 79,176,222,167,110, 13, 41, 88, 69, 26, 26, 25, 5,122,204, 56,224,139,209, 59,188,145,148,169, 71,234, -243,155, 80,199, 29,128, 42,238, 4,244,154, 2, 20,105,105,227, 20, 2, 45,141, 27,145,143,241,231,165, 59,176,174, 86, 15, 29, -250,126,133,115,215,239,225,240,225,195, 80, 40, 20, 80,169, 84, 80, 40, 20,165,255, 27, 67,176,132, 98,173,149,155,163, 7,234, - 84,237, 7, 91,139, 38,200, 85,104,144,163,208, 32, 87,161,193,233,211, 35,112,241,220, 48,220, 10,253, 10, 81, 87, 71, 34,179, -192, 20, 50,219, 14, 0, 56,171,202,172,204, 43,173,143,194, 20,148, 37, 87,175, 9,150,210,168,223,166,165, 9, 80,168, 17, 64, -106, 98, 7, 67,117,174,161,197, 40,212,144, 40,212,144,168,108, 57, 91,207, 14,203,107, 61, 51,172,160,245,204, 48,196,228,133, -169, 25,134, 9, 15, 14, 14, 70,173, 90,181, 96, 97, 97, 97,101, 97, 97, 81, 49, 25,208,106, 45,106,214,172, 89,250, 62, 49, 49, - 81, 18, 18, 18, 98, 19, 17, 17, 97,230,230,230,166,177,179,179, 83,219,216,216, 20,233,245,250,108,130, 32, 10, 8,162,114, 11, -229,114,178,147,207,110, 93,245,253,253,165,139,127, 86,159,127,160,194,111,191,109,215, 28,220, 54, 63, 50, 39, 51,238,204,251, -116, 96,141,142, 76,221,185,125, 10, 97,105,225, 41,239,252,229,100,229,157,187,183,173,187,118,241,214,154, 90, 88, 72, 79,159, - 62, 37,213,234, 4,169, 90,157,113,217, 72,104,154, 22,217,218,218, 66,175,215, 35,247,242,229, 82,114, 69, 40, 20,175,159, 54, - 0, 20,170, 84, 80,250,248, 64,153,157, 13, 38, 61, 29, 90,173,214,160,113,142,227, 64, 16,196,223, 38,250, 18, 87, 22, 69, 81, - 32, 76, 77,193, 17, 4,140,173,207,214, 30,253, 37,142,142,142,109, 79,157, 58,101, 27, 16, 16, 80,205,217,217,217,250,198,243, - 35,180, 66,161,184,184,116,233,210, 34,189, 94,143,137, 19, 39,138, 88,150,245,250,175, 13, 90,101, 83, 49,216,217,217,193,206, -206, 14,230,230,230,168, 95,191,126,201,132,193,147,171,255, 39,196,236,223,198,127,145, 4,122,122,122,250, 86,169, 82, 5,139, - 22, 45, 66,242,154, 53,184,181,104, 17, 6, 49, 12,142,233,116, 56,168,211, 21, 0,216,196,247,248,127, 66,193, 2,184, 66,141, - 30,121, 10, 29,242, 85, 52, 10, 10, 10,160, 77, 56,130, 95,166, 15, 71,221,122,227, 16,151,156,140, 69,139,214, 34, 51,221, 22, -156,129,152, 92,142,227,160,214,106, 65,170,158,130, 20,153, 66,171,115,194, 55,189, 59,162,160, 80,139,187,103,247, 65,161, 80, - 64, 38,147, 33, 63, 63, 31, 10,133, 2, 38, 38,198, 45,188, 82,230,203, 89, 61,205, 33, 37,251, 5,158, 38, 68,130, 36,237, 65, - 10,171,162, 64,165, 5, 73, 58,128, 46,122, 10, 90,167, 3,199,176, 80, 23,190, 68,161,150,248,168, 21,168,215,170, 62,122,163, - 20, 21,125, 84,193,129, 18,139,197, 37,147,188,193,139,103, 24,230,249,161, 67,135, 60,231,205,155, 71, 21,147, 43,123,133, 66, - 33,118,118,118, 86,181,104,209, 34,191, 75,151, 46,217,181,107,215, 86,189,122,245, 74, 22, 30, 30, 94, 3, 64,165,210,106, 40, - 83, 99,117, 0,226,244,180,182, 62, 65, 18, 96,245, 90, 78,157,245,226, 57, 0,214,206,185,242, 92, 32,104,223,133,251,223, 13, -247,119, 56,114,232,103,170, 95,223, 54,148,157, 93, 75, 66,110,162,149,158, 60,123,135,142,127,145,173, 46, 40,162, 43, 21, 67, - 64,101,102, 66,184,104, 17,178,190,254, 26, 88,182,172,244,115,113,135, 14, 40,204,205,133, 94,163, 1, 93,171, 22, 84,187,118, - 33,231,173,184,180,138,250, 62, 69, 81, 32, 73,178,148, 64,113, 50, 25, 72,138,122,253, 34, 73,176,114, 57, 56,130, 0,107,196, - 67, 69,128,127, 32,105, 98, 98,210,122,253,250,245, 18,185, 92,142,176,176, 48, 90,167,211,229,119,168, 55,132, 34, 73, 82,156, -155,155,155,114,229,202, 21,143,110,221,186,129, 32, 8,211,255,234,224,197,178, 44,100, 50, 25, 34, 34, 34, 48,104,208,160, 18, -146, 12, 91, 91, 91, 84,175, 94, 29, 93,186,116, 65,231,206,157,249, 81,158, 7, 79,174, 42,192,179,103,207,238, 36, 38, 38,214, - 89,176, 96, 1,182, 87,169, 2, 51, 51, 51, 76,251,241,199,155, 44,203,118,224,243, 96,253,147, 4,139,227, 80,168,214,161, 64, -165, 70,218,243, 27,112, 51, 73,199,218,189, 91, 16,151,122, 11,215, 31,156,135,134,145, 34, 96,204, 16,236,219,122, 0,156,158, - 52, 56,201,232, 11, 83,241,245,224,174, 8,185,116, 19,233, 57,249, 8, 92,177,243, 53, 73,209,235,161, 84, 42, 97, 98, 98, 2, -165, 82, 89,250, 98, 89,195,105,107,244, 58,113, 86,116,156,222, 68, 85, 20,142,219, 17,187,161,213,232,224, 81,123, 14,104,216, -193,204,113, 36, 10,139,142, 66,167,190, 4, 0,144, 88,181, 69,122,122, 22, 0, 34,247, 99, 85,160,177, 10, 86, 9, 8,130,128, - 80, 40, 4, 77,191, 91,245,163, 40,234,189, 8,214,187,242, 95,121, 88,250,153,155,155,155, 55,239,215,175, 31, 30, 62,124,136, -188,188,188, 52,131,146, 38, 73, 62, 63,119,238, 92,205,228,228,100,214,220,220,188,170, 78,167,179, 21, 8, 4,156,173,173,109, -169,171,205,202,202, 74,211,169, 83, 39,205,221,187,119, 29, 43, 55, 33,234, 8, 0, 38, 0,104, 16,212,107, 38,241,154,111, 80, - 0,196, 44, 75,191, 23,251,205,203, 39,239, 31, 57,158,228,151,167,136,167, 85,202, 66,246,202,245, 34,238,204,217,135,148, 68, - 44,140, 0, 40,110,219,233,243, 70,217, 17, 10,133,186,252,172, 44,145, 80, 42, 5, 19, 30, 14,182, 74,149,210,190,171, 80, 40, -160,214,104,160, 6, 80,216,173, 27,160, 86,227, 85,124, 60,196, 98,177, 65,255,184, 40, 42, 10, 85,218,183, 7,167,211, 33,231, -230,205, 82,183,160, 73,255,254,128, 72, 4,152,152,128,251,253,119,112, 14, 14, 96, 86,173, 50, 66, 13, 77,171,183,114,229, 74, - 27, 95, 95, 95, 4, 5, 5, 65, 46,151, 11, 26, 52,104,208, 91, 38,147, 9,108,109,109,225,234,234,138, 30, 61,122, 32, 49, 49, - 17, 28,199, 41,255,171,131, 23,195, 48, 21, 6,178,243, 1,238, 60,120, 24,245,160, 50,167, 87,175, 94, 77, 22, 47, 94,236, 53, -101,202, 20, 80, 20, 5,103,103,231, 22,223,127,255,125, 4,159, 7,235,159, 36, 88,172,158, 8,222,190, 12,182,156, 6,163,198, -116,131, 79,227,122,184, 31,115, 18,133,234,124,128, 16,129,209,235,160,212, 42,209,123,248, 96, 44, 95,118,216, 0,179, 0,234, -214,114, 66, 65,209, 11,120,122,184, 32,241, 78, 58,146,116, 52, 44,205,228,208,106,181, 80, 40, 20,144,203,229,136,139,139,131, -167,167,231, 27, 10,150,183,119, 5,157, 67,175, 73,185,120, 45,210,117,120,255,246,212,153,144,109,208,105, 25,168,245, 86, 40, - 40, 84,163,160, 72, 0,218,164, 51,144, 29, 6,142,148,192,213,197, 11,207, 99, 30,235, 25, 90,151, 98, 88,117, 0,173, 47, 74, -131,176,254, 42, 66, 31,183,138,227,138,146,223,156, 52,101, 86,176,116,106, 64,100,103,103,179, 0, 24,111,239,138, 37,188,196, -196, 68,214,213,213, 85, 21, 17, 17, 97,210,182,109, 91,196,197,197, 33, 49, 49, 17, 44,157, 7, 1,169, 6, 69,201,224,236,236, - 12,153, 76,134,235,215,175, 3,128,209, 43,192, 46, 45,243,171, 39, 2,188,192,129,187,245, 8, 89, 4,160, 50,119,235, 97,215, -173, 91, 55,211,177, 99,199,194,218,218, 26, 83,166, 76,225, 0, 36, 24,178,181,243,204, 47,106, 15, 75,191, 99, 69, 69, 69,174, - 28,199,145,121,121,121,226,154, 53,107,154, 53,111,222, 92,207, 48, 12,146,146,146,144,152,152,136,196,196, 68,232,245,122,113, -101, 58,155,125, 21, 15, 34, 45, 37,190, 6, 73,232, 99,254,154,252, 72,200,108, 92, 4, 44, 39,240,176,118,170,245, 94, 51,226, -165,171, 90,233,254,253, 75,137,129, 3, 7,137,243,243,243,113,236,216, 49, 20,105,151,179,225,247,158,154, 2,200,168,132,114, -152, 27,126,243,166, 67,251, 54,109,160,223,183, 15,186, 62,125,192,178, 44, 10,149, 74,232,181, 90,168, 1,104,171, 87,135,174, -106, 85,152,145, 36,110,220,187, 7,141, 70,147,103,208,112,113,144, 59, 87,188,210,173, 36,200,157, 51, 49, 1, 33,145, 0, 38, - 38, 32,138,213, 45, 99, 92,132, 53,107,214,116, 43, 81,108,166, 77,155,134,137, 19, 39, 18, 52, 77, 11,116, 58, 29,116, 58, 29, -212,106, 53, 46, 94,188,136,245,235,215,171, 72,146,140,254, 47, 15, 96, 20, 69,193,207,207, 15, 89, 89, 89,176,181,181,133, 68, - 34, 65,126,126,254, 27,196,235,183,223,126,227, 71,122, 30, 60,222,129,170,125,182,109,116,237,189,117, 60,199,208,152,190, 38, - 20,146, 69,171, 48,180, 95,103,140, 26, 53, 10,127,254,249,167, 87,179,102,205,126, 1,192,231,193,250, 39, 8,150, 84, 42, 33, -126, 93,182, 16, 41, 25, 79,145,157,151,130, 27, 15,254, 34, 81, 36,193,130, 32, 57,144, 36, 64,137,132, 32,200,138, 99, 29, 88, -134, 5, 33, 80, 67, 71,107,224, 81,179, 42, 46, 94,123, 4, 78,108, 9,141,142, 70, 81, 81, 17,148, 74, 37,228,114, 57,210,211, -211,113,230,204, 25,174,118,237,218, 4,195, 48,176,181,181,229,126,222, 90,126, 28, 82,134, 7, 21,115,254, 66,104,125,223, 70, -117, 45, 58,251, 47,192,209, 99, 63, 34, 39, 47, 15, 10,141, 0,249, 74, 45,148, 69, 28, 36,162,218,168, 94,189, 49,180,154, 66, -196, 70, 69, 20,102,137,172,159, 26,172, 25, 18,143, 90, 53,175,217, 96,241,188,169,102,173,219, 45, 17,146,217,231,193,166, 30, -227, 4, 98, 19,216,186,183, 34, 8,137, 61,119, 33, 44, 92,123,250, 74,108, 33, 1, 68, 61,189, 7,238,200,189,242,203, 25,147, - 23,198,181,243, 26, 28,214,171, 87,175,134, 45, 91,182,116, 94,178,100, 9,100,218, 51, 72,126,176, 9,245, 44, 9, 72, 29,250, - 32, 54, 67,134, 19, 39, 78, 32, 47, 47, 47,153,101,217, 7,198, 52,224,141, 21,126, 50, 14,240,154, 48,100, 60,193,178, 12, 65, -146, 59,236,251,142,250,195,190,170,187, 39, 4, 2, 1, 30, 63,126,140,192,192, 64,250,249,243,231, 55, 0, 20, 24,147, 11, 43, - 38, 47,140, 5,144, 8, 32,113,196,151,115,164,153,153,153,195, 82, 83, 83,185,240,240,112, 36, 38, 38, 34, 41, 41, 9,247,239, -223, 55,154, 4,102,167, 39,165,102,190, 74,168,214, 57, 96,186,180, 78,227,246,181,175, 28,219, 86,181, 68,186, 34, 0,216, 87, -245,238, 84,167,121, 47,153,200,196,134, 98,116, 42, 54, 39, 45, 46,181,146,253, 56,103,231,206, 93,196,179,103, 49,200,201,201, -193,186,117,235, 94,183, 96, 37,221,151, 18,137,228,118,208,159,127,246,244, 13, 14, 38, 68,237,219, 67, 63,119, 46,180,135, 14, - 65,175,213, 34,111,239, 94,208, 26, 13,216,148, 20,200, 87,172, 0,229,234,138,171, 12, 3,153, 76,118,203, 32, 89,215,233,192, -146, 36, 56,185, 28, 68, 49,201, 34, 73, 18, 48, 53, 5,196, 98, 16,166,166, 32, 41,202,232,248,171,184,184,184,212,211,167, 79, -215,232,218,181, 43,182,110,221,138,219,183,111,191,174,132,156, 28, 54, 61, 61, 93,157,149,149, 85,200,178,108, 6,128,167,151, -163,247,253,103,147,107,178, 44,251,198,106,193,172,172, 44,184,184,184,240,233, 25,120,240, 48, 30,127,229,193,106,220, 18, 79, - 47,172,197,169,135,122, 62, 15,214,191, 65,176,138,212, 58, 54, 46,229, 30, 40, 82, 0, 19,153, 21,164, 98, 83,232, 25, 26,122, - 70, 7,181,142,133, 76,205, 65, 84, 68, 32,175, 80, 7, 67,187, 80,168, 84,170,172, 37, 75,182,217,117,233,217, 26, 18,113, 62, -186,250,123,227,222,131, 24, 40, 20,122, 60,123,246, 12, 71,142, 28, 65,175, 94,189,192,178, 44,244,122,253,217, 71,143, 30,213, - 32, 8, 66,253,243,214, 73, 21, 26,142,217, 58,137,107,233,183, 50,100,253,230,237, 61, 70, 12, 31, 46,233,211,103, 61,238, 69, - 69, 33, 91,103, 15,142,227,224,108,107, 2,151,186,179,160, 81,171,112,237,226, 73, 45,171, 87, 95,136,185, 58,222,160,239,241, -104, 68, 88,198,136,122,126, 23,167,204, 94, 92,205,209,126,107,205, 31,167, 15,151, 55,110, 52, 73, 80,179, 69, 28,119,227,214, - 45,122,239,137, 3, 69, 42,149, 38,193, 76,136,120,144,160,119,220, 54, 76, 92, 46, 71,239, 83, 0,184,218,182,206, 32,187, 94, -221, 91, 54,154,220, 55,199,114,124,192, 56,176, 44,131,205,193,219,112,228,176, 67, 86,145,150,186, 79,146,100,206,229,232,125, - 70, 53,160,174, 56,255, 85,137, 76,200,113, 12, 34,238,222,198,190, 3,127,226,198,141, 27,234, 87,175, 94, 37, 3,136, 1, 80, - 24,243, 30, 25,221,119,158,249, 69, 61,172,211,204, 35,251,247,239,239, 16, 31, 31, 79, 49, 12,131,132,132, 4,100,102,102, 50, - 66,161,240,190, 49, 54,244,116,225,131, 29,203,198,162, 97,243, 46, 85, 90,126,249,149,120,216,140,245,102,153,169, 9, 12,203, -113,112,170,221, 70,236,232, 37,145,114,156,158, 75,137,190,162,125,124,235,120, 50, 69, 48, 15, 42, 89, 76,219,222,189,123,171, - 71,143, 30, 45, 77, 77, 77, 69,163, 70,141,176,122,245,106,197,195,135, 15,109, 1,228, 25,107,228,234,213,171,154,166, 77,155, - 62,152, 52,105,146,247,218,181,107, 33, 95,184, 16,138,168, 40,168, 31, 61, 2,173, 80,128, 96, 89,152,221,187, 7,194,198, 6, - 65, 28, 7, 37,195, 60, 10, 55,144, 3, 11, 0, 52, 77,154,160,224,246,109,144, 36, 9,147, 65,131, 74,221,130,216,190, 29,132, - 72,244, 58, 16,123,245,106,176,157, 58,129, 52, 34, 6,139, 32,136,200, 25, 51,102,216,120,120,120, 88, 12, 28, 56, 16, 59,119, -238,212,166,166,166,158, 75, 77, 77, 45,138,249, 72, 91, 35,125, 74,148,236, 36, 97, 12,202, 6,180, 75, 36, 18, 20, 22, 22,242, -228,234, 95,106,163, 79,217,238, 60, 62, 26, 54, 61,136, 12, 31, 15, 0,249,143,246, 99, 74, 64,203,143,150, 7,107,230,204,153, -127,123,214,196, 7,238,249, 90,130,229,203,151,255,239, 19, 44,150, 67, 81,215,128,109, 21, 60,154,255,245, 47,195,160,194,205, -154,211,210,210, 46, 17,119,137,106,143,239, 62,108, 80,183,113, 3,113,151,158,173,209,174,173, 23, 8,130,192,181, 51,151, 80, - 88, 88,152,188,126,253,122, 23,115,115,115,173,143,143,143, 98,240,148,118,247,140,189,136, 27, 97,211,243,219,248,173, 62,181, -118,221, 70,127,159,198,205, 77,221,171, 85,163, 90,184,154, 67, 75, 51, 72,207,200,198,243, 39, 15,152,152,232,251, 42, 86,167, - 13,189,118, 61,208,232,248,171,157, 81, 97, 12,128,231, 61,155,251, 37,143,159,181,162,102,205,106, 78,110,234, 34, 45,145,146, -145,147, 68,178,136, 5,160, 49,134, 88,189,141, 43, 79,246,103, 94, 90,230,119, 13,160,122,148, 78,154,224,184,233,189,210,174, - 1,208,182,253,193,120,155,237,190, 11, 83, 94,250,213, 47,105,211,222, 77, 85, 1, 32, 49, 21,153, 43,247,174,141,101, 24,168, - 0,228,125,140, 9,119,247,249,229, 57, 95,117,158, 21,118,231,206, 29, 47,189, 94,111, 3,160,128,162,168, 39, 44,203,102,236, - 9, 89, 97,240,247,145,177,187,212, 0,110, 53,172, 62,210, 54, 58,226, 98,221,166, 29,250,217, 54,237, 48, 88,172,213,104, 65, - 9,101,100,122,124,132,238,193,181,195, 25,122,141,246, 49, 1, 34, 43, 50,126, 87,101,139,248,114,236,216,177,238, 99,199,142, - 45,155,243, 74, 7, 32,185,178,134,238,220,185, 19,211,172, 89, 51,110,232,208,161,222,125,251,244, 33, 90, 78,155, 6,199, 27, - 55, 64, 90, 90, 34,247,254,125,164,101,101, 97,151, 72,196, 41,244,250, 40, 67, 89,220, 75, 9,166, 94, 15, 55, 55,183,215,193, -238,191,252, 2,142,101, 95,223, 58,118,118, 32,138, 87,185,177, 95,126, 9,142, 97,140, 10,114,191, 24,181,151,241,175, 63,244, -218,232,209,163, 59,159, 58,117, 74,216,175, 95, 63,241,186,117,235,100, 49,121, 97,255,211,233, 24, 42, 59,105,151,196, 96,149, -205,218,206,147,171,127,158,212, 24,106,167,127,194,230,231,128,255, 98, 42,137,164,163,163, 39, 0,152, 64, 16,196,224,249,243, -231, 7, 79,152, 48, 1, 44,203,226,242,229,203,248,117,198, 12,252,196,178, 95,173, 37,136,194,201, 28, 55,225, 95, 44,214, 71, - 35, 98,159, 26, 21,238, 69,248, 79,116, 38, 15, 75, 63,194,201,201,169, 26,128, 82,162,181,122,225, 86, 16,192,193,250,245,235, - 11,105,154,230, 86, 7,207,209,190,151,237,226,205,158, 73, 74, 84,149,227, 56,107, 0, 4, 65,146,239,220,236,249,125,208,189, -169,159,184, 56,238, 94,123,250,238,135, 19,151, 75,203,252, 26,113, 28, 60, 8, 2, 28, 71, 20,239, 59,184, 4,120,159, 20, 18, -151,150,249, 89,130, 4, 11,160, 96,220,226,247,179,241,111,193,187,230,136, 42, 82,185,101,163, 54,221,191,150, 93, 63,185,179, -168,176, 48, 55, 18,192,203,162,236, 23,248, 16, 66,232, 97,233, 87, 7, 64, 3, 0, 79, 0, 60, 52,214,214,219,123, 17, 2,149, -223,236,185,188,189, 8, 91,180,104,209, 67,175,215,203,202,168, 79,111,171, 81,111,255, 76,219,165, 75,151, 63,231,207,159,111, -112, 47,194, 14,245,134,216, 57, 56, 56, 52,206,205,205, 85,146, 36,121,253,244,221,223, 88, 3,215,248, 73, 8,147, 49,231,126, -123,172, 49,180, 23,225, 15, 99,214, 7,104,181, 90,163,150, 26,243,155, 61, 27, 87,239,134,218,233,125,230,131,202,218,252,156, - 21,172,255, 21, 18,248, 62,144,137, 68,103, 19,146,147, 59, 7, 7, 7,227,232,234,213,232,156,154,138,225, 20, 5, 25,128,189, - 58, 29, 38,115, 92,165, 9,207, 7, 40, 88, 6,143,251, 95, 81,176,202, 37, 88,255, 52,202, 16,173,186, 4, 65,168, 46, 61, 14, -190,248, 79,116,180,157,179, 8,140,248,245,243, 37, 28,183, 87,248, 73, 89, 29, 56, 0,154,207,185,156, 31,191,253,215, 19,114, -139, 8,139,194,124, 7, 5, 0, 38, 38,239,151, 79, 61, 40,125,208, 19, 83,121, 4,235, 99,219,252,183, 7,222,143, 57, 33,189, - 93,134,138,198, 25,222, 85,244,233, 72, 67,101,218,233,125,251, 95,121, 54,121,130,245,105,238,243,251,247,239,115,142,142,142, - 72, 75, 75,195,213, 70,141,222, 30, 12, 55,189,143,130, 85, 76,176,222, 30,195,136,183,136,212,219,159,151,119,252, 27,199,242, - 4,139, 7,143,255,231,224, 9,214,213,255,169,242,242,224,241,255,149, 96, 1, 64,122,122, 58,231,224,224,240,209, 92,115, 51, -103,206,228,222, 65,168,202,179,207,189, 69,166, 42, 42, 7,183,124,249,242,255, 9, 23,162,128,191,109,120,240,248,199, 6,100, -142,175, 5, 30, 60,120,252, 47,224, 99,146, 43, 35,193,253, 67,199,242, 4,139, 7, 15, 30, 60,120,240,248, 95, 3,175,174,126, - 52,114, 69, 24, 73,160, 42,115, 44, 79,176,120,124,126,240,176,244,251,208,229, 87,236,127, 33, 69, 0, 15, 30, 60,120,240,248, - 40, 32, 42, 32, 67,198,126, 71, 24, 56,150, 39, 88, 60,254, 7, 30, 39, 62,194, 10, 43, 62,118,143, 7, 15, 30, 60,120, 0,165, - 43,253, 8, 3, 4,204,216,239,254, 39,211, 54,124,114,130, 21, 56,244, 87, 75,138,162, 68,203,119, 77,207,224,187,228, 39,124, -212, 32,136,255,183, 10, 86,177,228,255, 65,215, 31,155,127,245,179, 72, 1,224, 97,233, 71, 85,169, 82,165, 19,203,178,195, 28, - 29, 29,187,102,100,100,236,191, 24,181,119,204,103, 88,223,239, 69,200,223,254,141,135,165, 31, 89,191,126,125, 41,195, 48,132, - 68, 34, 97, 69, 34, 17, 39, 22,139,223,126,218,213,111, 57,246,147,254, 29,174,157, 15,238,243,149,121,208,152,216,127,209, 97, -142,227,250,234,245,122, 80, 20,117,113,211,145,249,254,229,213,141,177, 54, 3,252, 3,197, 0,136,224,208, 32,141,161,250,230, -241,191,135,178,237,254,117,215,185, 73, 90,173,214,181,162,227, 69, 34, 81,150, 88, 44,118,218,114,236, 39,253, 63,117,223,242, -248, 31, 34, 88, 36, 73,222,146, 72, 36, 53,103, 14, 95,121,148,101,217,229, 43,119,207, 12,127,239,201,165,247,124,129,125,158, -245, 87,148, 80,216,131,227,184,134,175, 61,183,212, 3,150,214,157,202,176,202,222, 25, 83,166,211,213,178,240,171, 84, 74,132, - 30,245,253,156, 40, 17,186, 19, 28, 40,150,195,105, 0, 73,127, 70,134, 85,162,115,250, 17,127,252, 0, 39, 86, 7,102,196,175, -200,112,113,169, 98,201,178,108, 0,128,193, 0,244, 28,199,237,149, 74,165, 7,226,227, 19, 20,101,143, 3,192, 25, 91,206,183, -207, 81,153,223, 26,130,183,183,119,123, 11, 11,139, 21,106,181,218, 83, 34,145,196,170,213,234, 37,119,238,220, 57,248, 62,182, -154, 85,251,218, 92, 67, 50,237,133, 98,137, 55,173,213,220,151,176,212, 37, 0, 5,183, 19,126,127,175,178,141,237, 61, 95,160, - 46,204,154, 47, 16, 8, 59, 81, 20,108, 88,150,205,161,105, 46,212,213,205,115, 62, 0,221,207, 91, 39, 85,218,102,155, 54,109, -236,105,154,222, 45, 22,139, 27,235,116, 58,211,226, 60, 88, 42,173, 86, 27,105,102,102, 54,236,252,249,243,175,140, 24,144, 4, - 31, 56,184, 86,106,144,108, 95, 55,160,121,189,122,245,142, 52,111,222,220,177,113,227,198, 48, 55, 55,199,246,237,219, 71,119, -108, 48,108,118, 82, 82, 82,222,231, 54,248,124, 8,209, 2,128, 62,173, 38,136,186,119,239,126,128, 36,201,158,229,145,157,226, - 49, 70, 49,182,247,124,187,203,151, 47,255,173, 62,171,181,176,190, 67, 81,148,203,187, 30,147, 57, 0, 12,195,164, 36,220,204, -249, 40,219,133,176, 44,219,109,219,182,109, 16, 8, 4, 24, 58,116,104,135, 97,157,102,202,118,159, 95,110, 84,114,216, 0,255, - 64, 91, 0,179, 0, 8, 1, 44, 11, 14, 13, 74, 11,240, 15, 60, 41, 18,137,186, 21,127,127, 61, 56, 52,168,245, 91,191, 33,130, - 67,131,184,202, 16,214, 50,191, 37,165, 82,233,106,134, 97, 70,138,197,226,151, 74,165,242,171,224,208,160, 59,159,106,178, 45, - 41,231,128,182,147,157, 5, 2,193,215, 0,190, 2, 64,113, 28,183, 15,192,206,125, 23, 87,197,253,215,137,129, 94,175,119,186, - 57,103, 14, 32,145,128,105,219, 22, 44, 65,128,248,249,103,176,233,233,208, 45, 91, 6, 61,128,238,221,187, 91, 21,207,235,250, -127,162, 13,120,146, 85, 73,225,162,162, 52, 13, 93,186,110,103, 9, 2, 4, 88,128, 5, 7,142,227,192,113,120,253, 23,197,127, - 75, 62, 99, 89,238,202,165,137, 70, 61, 17,206,248,106,197,100,154,166,235, 80, 20,181,158, 36,201,136,223,127,255, 93, 28, 23, - 23,135,221,187,119, 35, 57, 57, 57,140, 32,136,229, 39, 78,156, 56, 19,147, 23,198, 25, 26,160, 75,202,218,198,111,117, 93, 82, - 32, 57,212,187,199,151,238,221,190,112, 16, 87,117,180, 3,199, 73,241, 52, 94,135,243, 97, 17,186,211,103,207, 39, 50, 26,205, -128,107,215,167, 62,252,235,166, 35, 42, 36, 89, 35,234,249, 73, 85, 98,116, 98, 89,244,113,117,182,110, 49,117,108, 95,219,156, -188, 34,252,182,231,100,118,122,118, 65, 56,199,225, 40, 33,195, 89, 0,170,163,215,195, 42, 36, 62,155,231, 98, 21,199, 97, 50, - 8,112,145,177,242,152,107,209, 85,170,143, 27, 55, 78,212,179,103, 79,228,230,230,226,240,225,195, 56,120,240,160,186,107,211, -180,228,218,174,234, 90, 4, 1,150, 35,176,120,252, 18, 44, 48,134, 40,189,125,142,212,108,225,190, 93,231, 45,231, 3,136, 15, -125,116,200, 24,229,163,220,182,107,218,180,233, 8,137, 68,178,254,135, 31,126,144, 54,108,216, 0,207,158, 61,195, 15, 63,204, - 83, 43,149,202, 33,145,145,145,199,141, 81,176,124, 60,191,177,211, 51, 92,199,170, 85,221,122,117,239, 53,184,157,159, 95, 27, - 51,215, 42,142,194,228,151,105,116, 88,216, 85,197,201, 63,247, 93, 78, 74, 74,252, 83, 64, 17, 23, 0,100,222,123,182,195,104, -114,165,211,230,157, 31, 56,112,136, 75,191,254,131,229,166,166,166,162,164,196,184,204,157, 59,182,234,239,132,223, 41,112,116, -174,229,111,136,100,189,173, 96, 53,107,214,108,178,128,162, 86, 78, 27, 54,140,108,210,170, 21,204, 92, 92, 64,165,165, 33, 95, -175,199,245,199,143,177,126,253,122,150,166,233,121,119,238,220,249,165, 34, 5,171,150, 69, 27, 65,139, 22, 45,116,122,189,222, -104,121, 91, 32, 16, 96,222,188,121,146, 46, 93,186, 48,149, 33, 88, 30,150,126,130,134, 13, 27,190, 92,178,100,137, 61, 69, 81, -136,142,142,198,141, 27, 55,112,231,206,157,173, 47, 95,190, 28,199,113,229,167,136,175,136,224, 12,238, 48,173, 27,128, 25, 86, - 86,150, 77,114,115,243,194, 1,172,216,119,113,213, 41, 99, 38,175,202, 36,177,124,251, 55,134,148,156, 62,173, 38,136,220,221, -221,247,215,168, 81,227,139,101,203,150,201,159, 63,127, 14, 47, 47,175,146,173,182,192, 48, 12, 24,134, 1,199,113, 24, 54,108, - 24, 83, 80, 80, 96,114,249,242,229,183, 85, 30,178,102,107,187,212,235,135,163,236,101, 50, 25, 88,150, 5,195, 48,165,127, 85, - 42, 21,186,140,104,158,113,231,226, 35, 39, 75,145, 67,165, 20,172,137,253, 23, 85, 5,224, 94,246,115,157, 78, 23,178, 99,199, - 14,161, 64, 32,192,128, 1, 3, 32,145, 72,186,137, 68,162,194,226,175,115, 54, 28,154, 23, 85,222,117,251,250,250, 46, 28, 49, - 98,196, 60, 43, 43, 43,172, 90,181, 42,134,227,184,166, 0, 50, 46, 94,188, 40, 22, 10,133,240,247,247,135, 78,167,171, 2,224, - 75, 0,253, 45, 44, 44,218,230,231,231, 95, 5, 48, 48, 34, 34, 34,167,178,109, 63,164,227,244, 17, 53,107,214, 92,191, 98,197, - 10,121, 68, 68, 4, 86,174, 92,249, 98,219,241, 69,213,222, 87,105,123,123,172,177,112,107,107,150,159,104,171,140,201,155,196, - 24, 67,134,124,125,125, 27, 1, 88, 88,173, 90,181,206,195,135, 15,167, 90,181,106, 5,165, 82,137,243,231,207,227,232,209,163, -200,200,200,184, 1, 96, 94,112,104,208,229,143, 69,176, 8,130, 72, 4, 80,181,248,109, 82, 76, 94,152,219,191, 77,216,202,214, -231,176, 78, 51,233,235, 63,255, 44, 80,116,237, 10, 93,108, 44, 32, 22, 67,228,230, 6,232,116,208,189,120, 1,136,197,232,213, -171, 23, 35,147,201, 76,182, 28,251, 73,243, 79, 62, 20,241,248, 8, 10, 22, 65,128,184,123,118, 43, 36, 34, 1,116, 52, 3, 45, -205, 64,163,213, 67,173,213,163, 80, 67,163, 80,173,135,178, 72,135,180,108, 21,126, 92,180,196,232, 73, 36, 47, 47,111,249,232, -209,163, 69, 7, 15, 30, 28, 67,211, 52, 87, 80, 80, 0,185, 92,142,159,126,250, 9,153,153,153,126,251,246,237,243,227, 56, 46, -122,198, 87, 43, 2, 87,252, 49, 35,196,144,189,150,126, 43, 61, 28,236, 29,194, 86, 46, 26, 99,213,200,211, 3, 4, 88, 36,103, -188, 2, 96,130,234, 46, 20, 70,244,245, 17,181,242, 21,215, 90,185, 33,244,114,155, 54, 65,126, 87,175, 6, 70, 1,192,214, 25, - 64,219, 31,222,109,179,151,175,223, 64,137, 92, 48,119,210,176, 47,156,123,246,232, 97,110,231,222, 76, 72,144,194,215, 79, 81, -195, 3,205,158, 61,188,226,114,252,248, 9,255,131, 39,175,190,162,245,236,218,222, 62,126, 59,142,149,179,217,243,230,185,168, - 74, 81,212,228,209,131,198, 16, 44,203, 18, 91, 15,252, 86,123,213,239, 97, 48, 49,179, 7, 0,184,187,187,195,199,199, 7,129, -147, 71, 72,143,109,168,235, 49,102,208,120,176, 44, 75,109,217,183,229,187,173, 51,176, 14, 64,118,121,229, 44,123, 14, 14,152, - 50,126,220, 26,176,172,158,216,178,109,230,144, 54, 45, 91, 12, 9,191, 23,253,172,157,215,224, 41, 0, 66,140,221,223,176,164, -249,125,124,124,218, 8, 4,130, 47,197, 98,241,196,223,127,223, 33,117,117,125, 61,214, 52,111,222, 2, 11, 22,204,151, 46, 92, -184,104, 1,128,227,134, 12, 53,168, 62,124, 65,191,128, 81, 19,122,244,232, 97, 94,171,122, 85, 81, 70, 86,158,254,238,189,200, - 87, 91, 54,174,141,106,214,186, 67,189,142, 29, 59, 58, 15, 13, 24,208, 47, 54, 62,169,199,201,147,167, 10, 14,238,221,182,179, -126,245, 17,179, 30,197,239, 52, 88, 72,141, 58,103,254,192,254, 1,206, 19, 39, 77,115,163,105,109,209,227, 71,215,174, 18, 36, -168, 81, 99,134,203,179,178, 94, 74,159,199,197, 44, 6, 48,211,216,139,110,218,180,233, 84, 71, 7,135,149,155, 22, 47,134, 40, - 47, 15,121, 28,135,180,180, 52, 8, 22, 47,134, 64, 42,133,255,143, 63,162, 77,155, 54,228,164, 73,147, 22, 55,105,210,132, 12, - 15, 15, 95, 82,145, 61,157, 78, 71,220,252,237, 55, 80,118,118,224,116, 58,232,108,109,193,178, 44, 56,142,131,232,201, 19, 64, -167, 3,167,211, 65,227,227, 3,154,166,209,165, 75, 23,132,135,135, 11,187,116,233, 82,169, 77,154, 29, 28, 28,106,249,248,248, -216,155,153,153, 97,238,220,185,108,124,124,252, 10,150,101,255, 8,123,122, 32,250,125, 7,135,193, 29,166,117,107,222,188,217, -193, 89,179,103,145,142, 14, 78,226, 23, 47,226, 27, 47, 95,190,242,224,224, 14,211, 6,148, 37, 89, 31,123, 0, 55, 52, 73,123, - 88,250,145, 93,187,118,221, 93,189,122,245, 14,203,150, 45,147,139, 68, 34, 60,124,248, 16,105,105,105,176,179,179,131, 84, 42, -133, 80, 40,132, 64, 32,128, 80, 40, 52,120, 78,153, 76,134,212,212, 84,232,116,186, 18,165, 0, 74,165, 18,142,142,142, 0,128, -251,217, 33,100,107,135,129,172,144, 20, 27,117, 13, 19,251, 47,250,206,206,206,110,161,163,163, 35, 85,246,115,181, 90,141, 57, -115,230, 64,169, 84,194,197,197, 5,206,206,206,167, 72,146, 4,199,113,200,206,206,198,196,254,139, 22, 93,184,112,225,199,114, -204, 90, 58, 57, 57,161, 79,159, 62,208,104, 52, 30, 27, 55,110, 60, 8,128, 84,169, 84, 16,137, 68, 0, 0, 39, 39,167,164, 54, -109,218, 80,173, 91,183, 70,141, 26, 53,176,117,235,214, 14, 71,142, 28,233, 0,160,210, 74,179,137,137,201,176, 62,125,250,200, -109,108,108,208,170, 85, 43, 44, 89,178,164, 74,128,127,160, 73,112,104,144,234, 67, 60, 12, 86, 41,236, 84,167,250, 93,166,184, -187,215,168,146,102,247, 50,189,105,147,121, 27,242, 57,249,242,152,187, 6,119,239, 56,116,248,240,225,106, 46, 46, 46,175,247, -238, 4, 96,110,110,142,145, 35, 71,226,171,175,190,194,153, 51,103, 90, 46, 94,188,248,240,216,222,243,237, 63,162,123,172,106, -201,115, 9, 65, 16, 85, 63,135, 9,155,110,217, 18,186,164,164,191, 17,171,146,247, 34, 95, 95,158,213,124,238, 4,171,148,165, -178,219, 33,164, 72,236, 60,245, 8,122,189, 26, 42, 53,141,204, 60, 61,114,149,122,168,212, 58,168,138,104, 40,139,116, 24,218, -185, 54, 8, 3,225, 12,237,188, 6,159, 34, 8,194, 27,192,138, 42, 85,170, 16, 29, 59,118,132,191,191, 63, 17, 23, 23, 71,132, -134,134,194,206,206, 14, 44,203,194,202,202, 10,223,125,247, 29, 50, 51, 51,189,166, 78,157,186,127,108,239,249,118, 74,229, 21, -125,112,232,187,201,139,199,152,245,148,147, 72,114,124,249,162,193, 86, 2, 97, 28,158, 37, 41, 96,111,217, 16,122,198, 18,249, - 74, 45,162, 98, 47, 33,234,233, 41, 84,119,118,197,232, 33, 53, 45, 87,109,201, 56,233,225,191,183, 38, 23,209,134,174,168,188, - 36,139,217,225,119, 30,213,167,184, 28,130, 16, 89,189,241, 29, 37, 16,195,203,167,147,208,189,102, 67,155,129, 3, 19,172,122, - 13, 30, 53, 67,108,129,221, 1,254,126,116,121,229,124,131,185,188,118, 91,252,253,156, 20,245,193, 13,170,213, 20,130, 97,104, - 16, 4,129, 1, 3, 7,160,107, 15,120, 30, 61,122,244,252,173, 91,183,230,181,175, 27,240,243,165,199,193,134, 76,144, 77,154, - 52,153, 46, 18,137,166, 89, 91, 91, 73,253,253, 59, 74, 59,119,238, 36, 44, 33, 87, 37,112,119,119, 71, 97, 97, 97, 13, 99,202, -100,110,101, 31, 48,104,216,104, 27,103,107, 33,174,132,133, 41,151,254,188,224,150, 82,145,183,190, 40, 59,245,217,197,144,243, -214,230, 54,230,211,166,207, 92,208,173,121, 19,111,105,219, 47,122,216,132,134,156,237, 85,236, 14, 49, 8, 33, 69,117,232,213, -183,143, 68,163, 41, 82,234,116, 42, 85,226,139,171,169,233, 25, 81, 5,174,206,117,172,253,191,240,182, 79, 78, 78,109,103,108, -221,181,105,211,198, 94, 36, 20, 46,223,184,120, 49,244, 17, 17, 16,183,110,141,234,213,170, 33, 55, 55, 23,121, 74, 37,152,228, -100,228,207,159, 15,225,143, 63, 98,221,186,117, 24, 56,112,224,194, 14, 29, 58,236,190,120,241, 98, 74, 69,118, 41, 59, 59,188, -116,114, 2, 0, 36, 92,186, 4,146, 36, 65, 81, 20, 92, 90,255,229,209,201,185,119, 15,213,170, 85,251, 16,247, 65, 74, 82, 82, -146, 94, 32, 16, 8,234,213,171, 71,198,197,197,197, 25, 75,174,250,180,154, 32,146, 74,165,139,172,172,172, 70, 0, 64,110,110, -238, 78,181, 90, 61, 79, 44, 22,207,152, 53,123, 22,121,253,250,117,177,171, 91, 21,236,222, 25, 44, 27, 57,106,132, 34,114, 66, -228, 12, 0, 6, 9,214,251, 62,237, 86,244, 59, 15, 75, 63, 2, 0, 41, 20, 10,251, 45, 89,178,132, 44, 33, 23,101, 55,125, 46, - 33, 86, 2,129, 0, 2,129, 97, 47, 45,195, 48,208,233,116,208,233,116, 96, 89, 22,153,153,153, 80, 40, 20,176,180,180,124, 61, -169,177, 58, 60,206,187, 74,120, 89,182,230, 68,164,196,152, 75,248,102,249,242,229,148, 83,113,155,151, 69, 74, 74, 10,242,243, -243, 97,106,106, 10, 43, 43,171, 82,181, 45, 43, 43, 11, 83,166, 76,249, 6, 64,121, 4,107,113, 80, 80, 80, 31, 79, 79, 79,167, -111,190,249, 6, 2,129,224,139,172,172, 44,236,219,183, 15, 38, 38, 38,216,180,105, 19,220,221,221, 41,134, 97,160, 86,171,113, -245,234, 85,220,186,117,171, 16,192,243,247,105, 3,165, 82,121,224,236,217,179, 62,254,254,254,230, 36, 73,162, 83,167, 78,250, -243,231,207,103,143,238, 57,239,101, 97, 97,225,192,136,136, 8,163,247,138,109,213,106,190,137, 94, 3, 55, 75,130, 93,236,213, -168,121,143,186, 13,124, 97,109,105, 5, 43, 75,115,135,180, 87,137,139,118,237,216,212,198,163,241, 47,221, 13,144, 44,103, 87, - 87, 87, 60,120,240, 0, 86, 86, 86,176,181,181, 69,126,126, 62,110,221,186,133, 59,119,238,192,203,203, 11, 36, 73,190,151,123, -236,109,165,138,227, 56,183,207, 85,189,225,184,143,191,152, 46,192, 63,176, 26,128,225, 0, 2,138,149,252,125, 0,118, 6,135, - 6,197,241, 20,233, 31, 84,176, 88,112,208,210, 44, 24, 70,131, 9,173, 46,129, 34, 89,204, 58,228, 3,149,154, 45, 37, 87, 42, -181, 14, 42, 53, 13, 67,171, 40, 37, 18, 73,231,117,127,156,167, 46, 94, 56, 27,116,240,183,229, 72, 78, 78,134, 94,175,135,173, -173, 45,188,188,188,240,234,213, 43,220,186,117, 11, 13, 27, 54, 4, 73,146,112,112,112,128, 80, 40,180, 4, 32, 40, 40, 40,255, -134,177,143, 97, 70,124, 53,218,167,134,189,149, 0, 39,175,159, 65,157,170,221, 32, 32, 53, 40, 80,105,145,175,210,226,241,179, -115,224, 88, 83, 60,122,154,140,166,117,229,104,221,196,210, 69,117, 41,103, 12,128, 13, 99, 86, 0,177,249,229,170,119, 66,129, -121,109, 66, 27, 90,151, 37,173,155, 16, 2,199, 47, 65,152,213, 33, 0, 32, 51, 41,130,123,126,103, 47, 82,158, 93,228, 26,116, - 94, 66,112, 28,168,130,130,242, 25,230,184,165, 72,218, 56,155,217,176,105,239,166, 73, 4, 73,193,212,121, 0,174,221,136,132, -139,139, 11,170, 86,173, 10,133, 66,129,235,215,175,227,225,195,135,176,132, 15, 54, 5,111, 6,199, 2, 4,137, 37, 99, 86, 32, -231,181, 84, 92,113, 67,142, 91,138,164,205,115,177,102,199,174,239, 38,131, 3,238, 61, 55, 77,142,189,190,201,174,119,239,222, -210,225,195,135, 67,173, 86, 47,140,140,140, 12,107, 91,103,208,181, 43, 79,246,151,107,167, 81,163, 70,157,237,237,237,230, 45, - 94,188, 88, 94,167,142,215,223,190, 15, 11, 11,195,173, 91,183,112,253,250, 53,176, 44,251,204,168,167, 97, 51,107, 81, 68,124, - 33, 17, 21,147,165,107,234,211,202,244,212,153, 16,255,203, 97, 87,155, 31, 63,114, 32,191, 75,175, 65,214,205, 26,123, 75, 51, -243, 52,196,145,208,199,250,164,108, 90, 32, 51,179,145, 26, 61, 56,146,132,141,169,137, 76, 16, 25,113,224, 82, 70,218,189,236, -156,172, 71, 74,169,144, 16, 40,149, 17, 69,110,174, 29,193,129,176, 50,214,150, 70,163,217, 53,126,252,120, 82,104,111, 15, 97, -215,174, 16,102,102, 34,126,216, 48, 16,249,249,208, 47, 93, 10, 20,171, 33,228,144, 33,144,182,110,141,197,221,187, 19,115,254, -252,115, 15, 0,191, 10, 7,197, 98,101, 4, 0, 40,138, 42, 37, 88,165,247,153, 88,252,198,251,247,193,141,231, 71,148,237,188, - 6,175, 9, 15, 15,159, 62,120,240, 96, 36, 38, 38,110,110, 95, 55, 32,237,210,227, 96,131, 68, 72, 42,149, 46, 90,240,211,252, -111,191,232,216, 73, 90,164, 46,228,254, 60,254,231,196,245,107, 55,192,194,194,188,137,163,131,147,216,213,173, 10,212,234, 34, - 12, 30, 58, 0, 18,169,196,204,202,202,178,201,167, 30,184, 88,150,229,158, 63,127,142,168,168, 40,144, 36, 9,115,115,115,152, -152,152,188, 86, 6, 69,162, 82,114,101, 44,193,226, 56,174,148, 92,101,102,102,226,121,226, 51, 28,190,184, 11, 58,189,206,118, -108,191, 25,175, 68, 34,241, 3,181, 78,245,253,163,171,241,145,229,184, 11,203, 98,199,236,217,179, 23,219,219,219,191,241,161, -139,139, 11,198,142, 29,139,147, 39, 79, 34, 54, 54,182, 76,136, 5,135,236,236,108, 22, 64,185,126,241,224,208,160,244, 0,255, -192, 94, 51,102,204,184,246,199, 31,127,136,135, 14, 29, 90,234, 6, 45,113,103, 94,186,116, 9,215,174, 93, 67,120,120,120,158, - 90,173, 62, 6, 96,109,112,104,208,195,247,152,112, 93,197, 98,241,194,111,191,253,214, 20, 0, 10, 11, 11, 49,102,204, 24,233, -192,129, 3, 17, 17, 17, 81,125,251,246,237, 7, 1, 84, 55,232, 89,104,246,157, 41,195, 82, 63,218,219, 59,140,245,242,170,111, -154, 95,168, 7, 37, 54, 67,236,179,167,200,207, 78,133,119,227,102,104,215,182, 29, 8,112, 29,183,111, 89, 55, 23,192, 2, 3, -109, 14,134, 97, 74,219,232,183,223,126, 43,253,174,168,168, 8, 28,199, 65,171,213, 18, 67,191,152, 81,109, 79,200,138,132,143, -160, 84, 37,149,121,159,244,169,250,122,128,127,160, 9,128,126, 20, 69, 81,130, 67,135, 32, 26, 61, 26,186,231,207,223,233, 34, -212,245,234,101, 84, 96,117,177,205,254, 0, 70,216,218,218,182,110,217,178, 37,161,213,106, 49,120,240, 96,156, 59,119,238,251, -115,231,206,125, 31,224, 31,120, 3,192, 78, 0, 7,131, 67,131, 20, 60, 93,250,200, 4,139,227, 56,104,116,122, 20,170,255,226, - 55,133,106, 26,202, 66, 6, 42, 53, 13,149, 90, 7,142, 3,212, 26,189,193, 44, 21, 98,177, 24, 12, 41, 67,211,246,125,208,179, - 87, 95,156,191,114, 5,113,247, 67,209,171,103, 55,176, 44, 11,107,107,107, 12, 31, 62, 28,251,246,237,131,133,133, 5,100, 50, -153, 65,182, 30,155,127, 21,102,214, 76,255,230, 13, 61,168,184,151, 81,240,114,235, 9,123,171,166,200, 85,168,145,175,212,162, -160, 80,135,154,181,166,191, 38, 91,202, 66, 60,124,182, 23,206, 14,238, 36, 37,140,235, 2, 16, 27,140, 10, 0,231, 24,176,217, -183, 56, 93,246, 45, 16,114, 23, 46,244, 70, 2, 10,178,226,255,146,108,181,134,251, 93,108,126, 24,183,231,218,144, 89,154, 66, -209,164,107,215,111,224,114, 88, 4,104,154, 70, 66, 66, 2, 98, 98, 98,112,246,236, 89,136,197, 98, 72, 36, 18, 20, 72,191, 64, -237,166, 83, 48,117,106,160, 46, 54, 62,125, 1,140, 12, 84,143,205, 15,227,198, 45,245,155,246,199, 15, 88,206,234,192,108, 63, -162,204,112,116,124,110, 19, 20, 20,180,127,230,204,153,237, 7, 13, 26, 68, 68, 70, 70, 78, 6,112,173, 34, 59,102,102,102, 51, - 70,143, 30,243, 55,114, 69,235,116, 72, 78, 73, 70, 68, 68, 4,238,220,185,141,200,200,251,140,179,179,243,134,202,116,182,237, -171,127, 74,219,162,215,233,186, 15,248,198,161,243, 23,254, 38,173, 90,182, 52,125,146,144,201,237,254,243,170,250,234,217, 67, -207, 41,161, 72, 92,191,253, 8,207, 74, 78,181,153, 73, 73, 79,172,244,116, 42,211,179,165,253, 56,161, 66, 9, 88,246,198,217, -187,143,247,191,122, 25, 47, 37, 72, 46,219, 88, 75, 50,153,172,113,171, 86,173, 80, 80, 80,128,234,213,170, 33, 97,198, 12, 16, -249,249,128, 82,249,198,113,170,198,141, 81,176,125, 59,106,108,223, 14,137, 68,210,208,160,172,111,103,135, 23,151, 47,131, 36, - 73, 84,245,251,139,139,101,221,189, 91, 74,182, 76,123,244, 0,181,122,117,165,174,188,157,215, 96,111,185, 92,190, 70,167,211, - 61, 79, 74, 74, 26,109, 99, 99,243,211,250,245,235, 59, 47, 88,176,192,107,214,172, 89,228,204,153, 51,119,183,175, 27, 80,239, -210,227,224,151, 21,217,177,178,178, 26,241, 69,199, 78,210, 73,147, 38, 33, 96,232, 0,162,177,175,143,220,212,212,100, 86, 94, - 94, 62,158,197, 60,193,238,157,193, 24, 60,116, 0,158, 61,137,129,173,157, 53, 91, 28,139,245, 73, 16,147, 23,198,121, 88,250, -177, 0, 56, 15, 15, 15,228,230,230,130,162, 40,152,152,152, 64, 36, 18,193,203,203, 11,233,233,233,111, 16,172,119,108,168,253, -134,154, 92, 18,119, 85, 50,113,135,220, 56,137, 44, 85, 42,182, 47, 15, 70, 21, 71, 87, 18,128,221,203,180,228, 47,190,158, 62, -160, 89,147, 14,117,151, 61, 9,123,245, 75, 69,238,194, 13,135,230, 45,153,216,127,209,159,233,233,233,118,101,133, 28,157, 78, -183,136,166,105, 36, 38, 38, 34, 58, 58,122, 49,128,208, 50,223, 39,111, 56, 52,175, 66, 82, 16, 28, 26,116, 55,192, 63, 48, 96, -192,128, 1,235,171, 87,175,238, 8, 0,222,222,222, 24, 50,100, 8,214,172, 89,131,144,144,144,195, 0,182, 2,184, 2,128, 12, - 14, 13,210, 86,182,126, 3,252, 3, 93,196, 98,241,237,245,235,215,219,122,122,122,146, 73, 73, 73,184,125,251, 54,154, 53,107, - 6,129, 64,128, 26, 53,106, 64,171,213, 58, 27, 67,174, 72, 82,122, 97,210,228,105, 77,155,183,104, 13, 29, 77, 67,169, 42,196, -221,187,247,176,123,199,218,252, 34,101,206, 87, 9,207,163, 39,152,201,101,157,191,248,162, 19,142,255,121,104,162,135,127,224, - 98, 46, 34,130,174,136, 8,151, 7,181,250,245,222,235, 52, 77,175, 38, 73,114, 96,128,127, 96,167,178, 65,249,239,169, 22,185, -125,234, 9,186,111,235,137,211,101, 50,217, 79, 45, 90,180,144,223,186,117, 11, 92,145,193, 53, 17,148, 74,165,154, 2, 96,153, - 49, 54, 93, 93, 93,161, 84, 42,145,147,147,131,204,204, 76,212,168, 81, 3,129,129,129,152, 50,101, 10,110,220,184,209,242,212, -169, 83, 45,175, 93,187,182, 38,192, 63,240,199,224,208,160,149, 60,101,170, 28,200,138, 59, 24, 80,164,161,145, 81,160,199,140, - 3, 62, 24,189,163, 33,146, 50,244, 72,125,126, 3,234,184, 3, 80,197,157,128, 94, 83,128, 66, 13,109, 84, 22,176,180, 92, 13, - 78,220,120,129, 63,111, 38,163,102,253,166, 24, 63,125, 38, 94,100, 3,135,143, 28,129, 66,161,128, 74,165, 66, 65, 65, 65,233, -255,198,200,161, 66,177,182,129,155,163, 7,234, 84,237, 7, 91,139, 38,200, 85,104,144,163,208, 32, 87,161,193,233,211, 35,112, -241,220, 48,220, 10,253, 10, 81, 87, 71, 34,179,192, 20, 50,219, 14, 0,184,250,239,179,186,142, 43, 76,121,131, 92,189, 38, 88, - 74,163,126,155,150, 38,224, 10, 53, 2, 72,229,118,134,221,124,122, 9, 10, 53, 36,231,236,236, 84,169, 85,128,177,249, 97, 92, -179, 25, 97,175, 90,124, 23,150, 30,155, 31,198,133, 61, 61,144,197,113, 92,224,205,155, 55, 97, 97, 97, 1, 91, 91,219,230,182, -182,182, 21,147, 1,154,174, 87,189,250, 95,174,170,228,228, 36, 28, 59,118, 12,215,174, 95, 71,245,234, 53,224,238,238, 14, 87, - 87, 87, 72,165, 82,150, 32,136, 39,149,173,195,156,236,228, 22, 91, 87,125,255,221,146,197, 63,103,156,127,168,194,111,191,253, -150,121,112,211,130,175, 94, 68,166, 54, 22, 8, 68,153,149,181,167,211, 49, 23,126,219,182,141,181,119,172,225,116,231,121,230, -225,128,197, 53, 84,167,111, 95,220,111,109, 99, 99,118,238,194, 51, 91, 90,167,191, 66,235,140,243, 24,208, 52,109,110,107,107, - 11,189, 94,143,220,203,151, 75,201, 21,161, 80,188,190, 25,138,159,230, 11,124,124,160,200,206, 6,147,158, 14,173, 86,107, 98, -132,218,242, 55,213,170, 68,205, 42,121,193,212,180, 82,153,244, 90,123,244,183,119,116,116, 60,115,234,212,169,214, 1, 1, 1, -223, 56, 59, 59, 55,189,241,252,136, 82,161, 80,180, 91,186,116,105,138, 94,175,199,196,137, 19, 45, 88,150,253,222, 24,123,106, -141,154, 11, 24, 58, 0,193,123, 14, 66, 85,164, 66,219,182,109, 49,113,226, 68, 92, 12,189,132, 81, 99,190,134,133,185, 5,170, - 87,119,199,161, 3, 71, 73, 0, 43, 62,181,167,132, 32, 8, 16, 4, 1, 91, 91, 91,216,217,217, 65, 34,145,160, 94,189,122,165, - 19, 49,203,190,142, 63,127,151, 43,254, 13, 67,197,199,231,231,231, 35, 63, 63, 31,177, 47,158, 32, 75,149,138,144,224,155,112, -118,112,129, 90,173,134, 90,173,134,179,131, 11, 66,247,221, 49,115,178,115,157,227,214,196,178,177,161, 2,110, 56, 52,239,201, -134, 67,243,174,108, 56, 52,239, 10,128, 48, 0, 61, 59,118,236, 8,154,166,209,250,181,107,184, 59,128,107, 37,199, 24, 34, 87, -101, 72,214, 81,133, 66, 81,245,254,253,251,158,247,239,223,255, 41, 57, 57, 25, 52, 77,151, 92,239,159, 0,238, 2, 56, 99,103, -103,167, 10,240, 15,220, 99, 4,161, 18, 12,253, 98,198,248,209, 61,231,221, 26,210,113,250, 52,177, 88,124,123,221,186,117,246, - 30, 30, 30,100,124,124, 60,138,138,138, 16, 31, 31,207, 46, 95,190, 92,117,225,194, 5, 4, 5, 5, 21, 10,133,194,221, 21, 19, -255, 64, 25, 73,202,206, 77, 13,156,211,180, 69,203, 54, 8,189,112, 30,155,119,236, 69, 72,232, 21, 88, 89,219,160, 93,199,238, - 22, 34,177,172, 45, 93,152,181,236,126,100, 56, 72,146, 68,173, 90,181,109,108,115, 76,173, 43,178,171,215,235, 43, 36, 88, 44, -203,162, 67,135, 14, 99, 78,156, 56, 97, 46, 16, 8,206, 15,233, 56,221,195,200,254,148, 84,210,159, 62,165, 82, 85,206, 53, 47, -180,181,181,149, 63,126,252, 24, 28,199, 65, 55,116, 40,116,201,201, 16,121,120, 64,228,228, 4, 93, 76, 12,116,169,169, 16,120, -120,224,166,175, 47,156, 29, 29, 33, 18,137, 22, 7,248, 7,138,140,177, 25, 21, 21,133,251,247,239, 35, 62, 62, 30,202, 50, 15, -146, 20, 69,161, 85,171, 86,232,208,161, 3,218,181,107, 39, 19,139,197,203, 42,178,201,227,189, 8, 22,135, 66,141, 30,121, 10, - 26,137, 25, 52,226, 83, 10,144,247,120, 15,126,153,210, 26, 71,247,254,138, 45,171, 39,192, 94, 27,138,236,140,151, 6, 93,132, - 28,199,225,101,118, 17,232,151,251,145,245,226, 2, 18, 82, 18,208,220,100, 62,188, 27, 86,199,243,184, 23, 80, 40, 20, 40, 44, - 44,132, 66,161,128, 66,161,120,163,177, 43,130, 50, 95,174,211,211, 28, 18, 83, 95, 32, 60,234, 20,226,146, 30, 33,167,224, 53, -201, 34, 73, 7,208, 69, 90,208, 26, 45, 88, 61, 3,117,225, 75, 20,106, 63,110,190, 50,189, 86,245,209, 27,165,176,176,240,227, -205, 68, 28,103, 95,226, 58, 97, 24, 70, 93,209, 83, 96,241,228,180,233,208,161,195,154, 18,114,181,119,111, 48,194,194,174, 32, - 54, 54, 22, 0,208,167, 79, 31, 76,159, 62, 29, 95,126,217,133, 20,137, 68, 35, 43, 91, 30,101,106,108,190, 54,231,197,239,122, - 90, 75, 16, 4, 1, 86,175,229,212,185, 9,103,128,123, 44, 7,174,210,121,137,110,135, 63, 94,244, 56,250,121,250,161,253,251, -133,114,185, 68,238,238,238, 78, 89,219,216,152, 95,187,150,108,155,156,172,200, 19,138,109,190, 19,138,109,140,182, 71,101,102, - 66,176,104, 17,178, 1,232,150, 45, 3,189,101, 11,116,251,246, 65,220,165, 11,244,222,222,208,251,250, 66,191,104, 17, 20,187, -118, 33,199,211,211,216, 54,248,139, 72,149,144, 46,185,188,244, 51,146, 36,193,153,152, 24, 77,176, 2,252, 3,133, 38, 38, 38, - 71,215,175, 95,239, 32,151,203, 17, 22, 22, 86,160,211,233,162, 58,212, 27, 34, 37, 73,210, 42, 55, 55,247,232,149, 43, 87,224, -233,233, 9,130, 32,106, 26,178,151,155,155,187,243,207,227,199,138,108,109,237, 49,106,204,215,184, 16, 18,138,232,232, 39, 8, - 15, 15,199,243,231,113,216,178,105, 59,182,110,222,142,187,225,247, 17, 23, 23, 15,130, 32,242,135,117,154, 89,248, 85,231, 89, -233,159, 74,197, 42,169, 87,169, 84,138,136,136, 8,120,121,253,165,184, 58, 59, 59,163, 89,179,102,152, 59,119, 46, 46, 94,188, -104,212,253,230,228,228,132,186,117,235, 34,230,213, 35,108, 95, 30, 12,134, 97,160, 80, 40, 74, 99,179, 82, 82, 82,144,157,157, -141,159,167,175, 50,149,203, 76, 22, 86,178,200, 95,215,170, 85,203,183,121,243,230, 72, 76, 76,132,183,183, 55, 60, 60, 60,234, - 3, 24,251, 62,215, 31, 28, 26, 68, 3,112,180,182,182,158, 59,116,232, 80,232,245,122,180,111,223, 30,182,182,182, 59, 9,130, -136, 28, 53,106,148,127, 80, 80,144,160,122,245,234, 67, 2,252, 3,171, 27,240, 44, 44, 27, 48, 96,192,170, 93,187,118, 53,155, - 52,105,210,146,254,253,251,219,186,185,185,145, 79,158, 60,129, 82,169,196,233,211,167,153,139, 23, 47,166, 71, 69, 69,253,124, -224,192,129,227,137,137,137, 19, 53, 26,205,248, 10,201,186, 92,254,221,168, 49,227, 91,248, 54,110,138, 67, 7,131,241,231,159, - 71, 80, 88,168,198,229,208, 51,184,115,231, 38,204,172, 28, 33, 55,181, 28, 65,201,109,102, 53,109,214, 18, 12,195,224,201,227, - 71,217, 89,214,202, 28, 3, 99,211, 59, 93,190, 20, 69,225,222,189,123,232,208,161, 3,102,207,158, 13,177, 88,140, 11, 23, 46, -152, 11,133,194, 71, 99,123,207,151, 24,113,127,186,113, 28, 71, 20,191, 74, 85, 43,130, 32, 18, 9,130,224,138, 95,137,159,162, -175,203,229,114,234,248,241,227,248,250,235,175, 97,110,110,142, 45, 91,182,160,168,140,138,165,213,106,113,232,208, 33,204,243, -245,197,181, 30, 61,208,184,105, 83, 16, 4, 65, 85, 52,183,151,181,153,158,158,142,172,172,172, 55,212, 65,141, 70,131, 29, 59, -118, 96,242,228,201, 56,123,246, 44, 76, 77, 77, 13,218,228,241,110, 8, 12, 61,221, 21,170,117, 40, 80, 22, 33,237,249, 13,184, -153,164, 99,237,222, 45,136, 75,189,137,235, 15,207, 67,167,151, 33, 96,116, 0,130,183, 30, 4, 71,147, 6, 39, 25, 43, 68, 97, -236,224, 47,112,238,210,117,220,123, 33,194,143,186,145,176,182, 22, 66,167,211, 65,169, 84,194,196,196,164,148, 92, 41,149,202, -210,167,208, 10, 9,142, 78, 28, 17, 29,167,119, 85, 21,133,227,118,196,110,104, 53, 58,120,212,158, 3, 26,118, 48,115, 28,137, -194,162,163,208,169, 47, 1, 0, 36, 86,109,145,158,158, 5,128,120,244,177, 42,208, 88, 5,171,204, 77, 11,161, 80, 8,154,126, -183, 18, 78, 81,212, 27, 55,144, 49,120, 87,254,171,186,117,189, 68,121,121,121, 93,108,109,109,183,183,106,213, 10, 73, 73, 73, -200,207,207, 55, 24,143, 83, 84, 84,180, 57, 36, 36,100, 66, 74, 74, 50,205,113,156,233,139, 23, 47, 32, 16, 8, 80, 54,200,221, -218,202, 26, 93,187,118,163, 30, 62,124,212,181, 50,229,100, 89,157, 16,128, 43,128,124, 16, 20, 91,234,163, 1,196, 0, 44, 25, - 90, 39,169,108,253,199,228,133,177, 67, 58, 78,152, 31,113,175,240,168,141,157, 82,193,208, 42,213,209,227, 9,238, 87,194,104, -115,130, 21,245, 5,114,244,187, 47,173, 55,202,150, 80, 40, 44,200,207,202,178, 16, 73,165,208,134,135,131,233,221,187,180,239, - 42, 21, 10, 20,105, 52, 80, 3, 40,234,214, 13,208,104,240, 42, 33, 1, 98,177,216, 32,195, 22, 70, 71,163, 74,171, 86, 0,128, -236,136,136, 82, 53,203,164, 87, 47, 64, 46,127, 77,174,246,236, 1,108,109,129,197,139,141, 80, 67,211, 22,173, 92,185,178,133, -175,175, 47,130,130,130, 32,151,203,229, 13, 26, 52, 72,147,201,100, 38,182,182,182,112,117,117, 69,143, 30, 61,144,152,152, 8, -142,227, 12, 6, 57,171,213,234,121,235,214,172,135,169,169,201,172,246,237,219,227,209,163, 40, 88, 90, 90, 66, 44, 22,163, 70, -141, 26,200,205,205,197,143,175,230,227, 88,237,163,144,201,100,154,225,195,135, 95, 25, 58,116, 40,213,178,101, 75,217,167, 28, -188, 88,150,133, 80, 40,132,165,165, 37, 68, 34, 81,233, 42, 64,177, 88, 12,177, 88, 12,145, 72,100, 48,182,141, 97,152,148, 47, -191,110,241,151, 34, 74,235,108,171, 56,186,146, 37, 46, 39, 0, 40, 40, 40, 64, 82, 82, 18,104,154,134,141,141, 13,116, 90, 93, - 67, 99,203, 56,177,255, 34, 18,192, 79,195,134, 13, 67,106,106, 42, 22, 44, 88,128,239,191,255, 30,253,250,245,195,146, 37, 75, -230, 79,236,191,104,219,134, 67,243,232,202, 92,119,128,127,160,167,153,153,217,137,197,139, 23,139,172,173,173, 17, 25, 25, 9, - 47, 47, 47,172, 92,185, 82,240,236,217, 51,247,218,181,107, 35, 38, 38, 6, 47, 95,190, 76, 2,144, 96,160,207,143,156, 54,109, -154, 56, 62, 62, 30,131, 6, 13,146, 60,123,246, 12,145,145,145, 0,128,171, 87,175, 50, 23, 47, 94,204,208,106,181,141,131, 67, -131, 82,141, 41,155, 71,239,249, 2, 87, 19,179,177,173, 90,183,195,237, 91,215,113,104,255,174, 35, 34,145,160,113,179, 54, 93, - 92,229, 98, 31,196,199, 70, 67,207,137, 33, 51,177,180,234,216,185, 71,151,150,173,218,224,210,197,243,200,203,203,217, 16,115, - 55,168,162,122,136,185,124,249,114,253,198,141, 27, 67,165, 82, 65,161, 80,148,182,125,116,116, 52, 60, 60, 60, 48,123,246,108, - 4, 5, 5, 33, 48, 48,144,237,212,169,147, 94,167,211,137,196, 98,241,135,116,177,207, 98, 21, 33, 65, 16,168, 93,187, 54,150, - 46, 93,138,244,180, 52,108,152, 62, 29,166, 51,103, 66,199, 48, 72, 26, 58, 20,242,250,245, 97,214,172, 25,196, 98,177, 65,197, -246,109,155,139, 22, 45, 66, 90, 90, 26, 14, 28, 56,128,184,184, 56, 52,110,220, 24,238,238,238,176,181,181,133,153,153, 89,165, -108,242,168, 36,193, 2,163, 71,240,246,101,176,227, 52, 24, 53,166, 27,124, 26,215,195,253,152,147, 40, 84,231,131,128, 16,122, - 70, 11,165,134, 67,239,225, 1,248,245, 87, 3,185,150, 8,160, 73, 29, 7,208, 92, 14,234,122, 86,197,197,179,113,200, 45,172, - 5, 79, 23, 29, 52, 26, 13, 20, 10, 5,228,114, 57,226,226,226,224,233,233, 9, 19,147,191, 60, 47,222,222, 21, 12,178,122,205, -153,139,215, 34,187, 14,239,223, 94,124, 38,100, 27,116, 90, 6,106,189, 21, 10, 10,213, 40, 40, 18,128, 54,233, 12,100,135,129, - 35, 37,112,117,241,194,243,152,199,106,134,214,157, 53,252, 84, 3,165,190, 40,141, 19,214, 95, 77,232,227,130, 56,174, 40,249, -141,239, 69, 50, 43, 88, 56, 54, 32,178,115,178,245, 0,212,222,222, 21,175, 92, 73, 76, 76,212,185,186,186, 38, 68, 68, 68, 84, -107,219,182, 45,226,226,226,144,152,152, 8,150,206,131,128, 84,131,162,100,112,118,118,134, 76, 38,195,245,235,215, 1,224,169, -177,228,106,243, 92,172,146,202,205, 38, 19, 34, 14, 99,251, 51,143, 79,221,180,200,116,114,146, 54,107,214,172,153,188, 99,199, -142, 32, 8, 2, 59,119,238,212,235,245,250,223, 12,217,123,244,232, 81,170,155,155,155,147, 70,163,233,199,113,220,247,175, 94, -189,170, 97,105,105, 73, 89, 90, 90, 18, 12,195, 32, 57, 57, 9,137,137, 73, 72, 74, 74,130, 78,167,179, 66, 37,246,137,178,175, -226, 65,165,165,196,127, 35, 16,144,107,255,186,105, 73, 0,109, 85, 50,155, 23, 45, 45, 29,220,157,222,167, 19,167,166,230,253, - 52,125,250, 15,118, 61,122,244,176, 83, 42,149, 56,117,234,148,237,157,136, 63,240,252,249,243,213, 0,140, 78, 18, 89, 84, 84, -116, 55,252,230,205,142,237,219,180, 1,189,111, 31,152,222,189,193,178, 44, 84, 10, 5, 24,173, 22,106, 0,218,234,213,161,173, - 90, 21,166, 0,110,222,187, 7,141, 70,243,192,160,225,226,137,159, 43, 38, 86,165,238, 66, 83, 83,192,196, 4,132,137, 9,136, - 74, 12, 98, 53,107,214, 28, 50,104,208, 32, 0,192,180,105,211, 48,113,226, 68, 1, 77,211, 38, 37,106,139, 90,173,198,197,139, - 23,177,126,253,250, 23, 36, 73, 26,100,108, 71,175,111,212, 1,152, 29,224, 31, 56,171,126,253, 6, 72, 78, 78,129, 68, 34,129, - 68, 34,129,179,179, 51,138,138,138,176,174,238, 90, 84,165, 40,116,232,208, 65,210,160, 65, 3, 68, 69, 69,125,242,193,139,101, - 89, 8, 4, 2,248,250,250, 34, 53, 53, 21,206,206,206,208,106,181, 40, 40, 40,128, 64, 32, 40,157, 24,182,110,221, 90,174,141, -132,155, 57, 77,243,116,233,136,204, 14, 33,245,172, 14, 99,251,205,120, 5,160,212,143,159,159,159,143,228,228,100, 36, 38,190, - 22, 48,104, 61, 13,142,171,212,182, 29,237,220,221,221,171,184,184,184, 96,235,214,173, 80,171,213,207,143, 29, 59, 86,243,171, -175,190,130,155,155,155,221,139, 23, 47, 58,193,136, 21,153,111, 43, 98,227,199,143, 55,117,114,114,194, 31,127,252,129, 67,135, - 14,165,215,171, 87,207, 97,228,200,145,240,244,244,196,211,167, 79,177,106,213,170, 92,173, 86,219,203, 80,162, 81,134, 97, 94, - 92,191,126,189, 97,126,126,254,235,241,136,101,241,252,249,115,188,120,241,130,189,115,231, 78,122, 49,185, 74, 51,182, 96, 22, -137, 48,169,217,212,195, 70, 32, 16, 32,226,238, 29,208,234,130,237,122,173,224, 65, 97,126,218,162, 70, 62, 77,224,228, 84, 5, - 41,169,233,232,212,249, 75,180,107,239,143,123,119,111, 99,199,246, 77, 23,114, 33, 95,106,192,116,159, 69,139, 22, 45,178,181, -181, 29, 56,100,200, 16,210,215,215, 23,119,239,222, 5,195, 48,240,247,247, 47, 37, 87,103,207,158,221,123,246,236,217,254, 0, - 68,166,166,166, 82, 99,242, 65, 17, 4,209, 3,128,188, 68,208,228, 56,238,196,231, 58, 97, 59, 56, 58, 98,200,188,121, 80, 40, - 20,216,181,107, 23, 76, 27, 53, 42, 77,211, 81, 66,156, 42, 11, 71, 71, 71, 76,157, 58, 21, 10,133, 2,219,182,109,131,169,169, -233, 7,219,228, 97, 4,193,146, 72, 37,248,117,217, 66,164,100, 60, 69,118, 94, 10,110, 60, 56, 92,166,210, 57, 16, 4, 7,146, - 0, 40,161, 0,175, 21,196, 10, 6, 67,134,133, 84,206,161, 40, 79,139,218, 30, 53,225,126,249, 40, 34,210, 28, 64, 18, 4,200, -162, 34, 40,149, 74,200,229,114,164,167,167,227,204,153, 51, 76,237,218,181, 41,134, 97, 96,107,107,203,254,188,181,252, 56,164, - 12, 15,106,231,249, 11,161, 51,124, 27,213,245,236,236,191, 0, 71,143,253,136,156,188, 60, 40, 52, 2,228, 43,181, 80, 22,113, -144,136,106,163,122,245,198,208,106, 10, 17, 27, 21,145,146, 37,178,222,106,176,102, 72,252,208,170, 89,205, 37,139,231, 77,173, -211,186,253, 98, 19, 50, 59, 4,108,234, 49, 78, 32, 54,129,173, 91, 43,130,144,216,179,161, 87,194,115, 79,133,197,190, 32,128, -159,158,222, 3,115,228, 94, 88,133, 74, 75, 59,175,193, 95,246,234,213,107, 69,203,150, 45,187, 45, 89,178, 4, 82,205,105, 36, - 63,216,140,122,150, 4,164, 14,125, 16,155, 33,195,137, 19, 39,144,151,151,119,136,101, 89,163,210, 20,148,228,191, 26, 62,116, - 17, 88, 86, 15,245,246, 89,245, 58, 13, 92, 6,145,196, 2, 28,199, 33, 54, 54, 22,193,193,193,249, 25, 25, 25,125, 5, 2,193, - 99, 35,210, 52, 32, 49, 49, 81,151,152,152, 24, 12, 32,184, 65,131, 6,142, 58,157,238,105,126,126,190,233,221,187,225, 72, 74, - 74, 70, 82, 82, 18, 30, 60,184, 95, 66, 2, 13,146,171,236,244,164, 11,153,175, 18,134,118, 14,152,110, 95,167,113,251,169, 87, -142,109,235, 95, 34, 93, 17, 0,106, 54,181,185, 84,171,201,240, 38, 98, 19, 27,177, 94,163,164,179, 83,159,223,172, 76, 39,190, - 28,189,207,255,167,137, 91,216,212,212, 84, 34, 47, 47, 15, 59,118,236, 40, 81, 50,252, 42, 99, 71, 34,145, 12, 15,250,243,207, -151,190,193,193,164,184,125,123, 48,115,230, 64,115,248, 48, 24,173, 22,249,123,247, 66,167,209,128, 77, 73,129,124,229, 74, 8, - 93, 92,112,149, 97, 56,153, 76, 54,212, 32, 89,215,233,192, 21,187, 1,201, 50, 36, 11,166,166,128, 92, 14,194,212, 20, 36, 69, - 25, 61,144,197,197,197,157, 57,125,250,244,152,174, 93,187, 98,235,214,173,184,125,251, 54, 0, 32, 39, 39, 71,151,158,158,158, -154,149,149,149,200,178,236,101, 0, 43, 46, 71,239,171,148, 28,202,113, 28,236,236,236, 96,111,111, 15, 39, 39, 39,216,218,218, - 34, 57, 57, 25, 82,169, 20, 20, 69,225,210,165, 75,154,228,228,100,161,135,135, 7,245,169, 7,175, 18,215,107, 73, 48,123, 78, - 78, 14,172,173,173,223, 32, 87,198,192, 82,228,128,214, 14, 3,216,232,188,107,132, 64, 32,136,124,153,150,220,217,217,193, 5, - 25, 25, 25, 72, 74,122,253, 48,145,156,156,140, 90,181,106, 33, 33, 49, 14, 98,137,248,126, 37,138, 57,180, 89,179,102, 40, 44, - 44,196,189,123,247, 24, 0,125, 30, 61,122, 20,169, 84, 42,133, 13, 27, 54,196,139, 23, 47,134,188, 7,193,170, 42,151,203, 81, - 84, 84,132,195,135, 15, 43, 0, 84,143,138,138,234, 51,123,246,236,181, 85,171, 86,181, 76, 74, 74,202,212,106,181, 29,131, 67, -131, 12, 42,245,106,181,122,208,119,223,125,119, 68,175,215, 87,171, 89,179, 38,215,179,103, 79,153,189,189, 61,110,220,184, 81, -164,211,233,150, 84,134, 92, 1, 64,126,226,149,130,231, 86,166,241, 58,157,174,122,203,214,237,112,251,214,181,197,106, 69,206, -218,203, 23,207,230, 56, 56,185, 89, 55,111,230,139,118, 98, 17,228,114, 25,110, 94,191,130,223,183,111,186, 36, 45,210,246,140, -137,250,169,194,128,252,224,208,160,120, 0, 1,195, 58,205, 92,176,106,213,170, 31, 8,130, 24, 22, 18, 18, 82,154,231,172,132, - 92, 85,171, 86,109,248,207, 91, 39, 13,173,100,125,202, 57,142,123, 84, 76, 38,234,151,249,252,115, 88, 69, 72,235,245,122,113, -149, 42, 85,144,150,150, 86,234,249, 48, 51, 51,123, 99,188, 16, 8, 4, 48, 51, 51, 43, 89, 17,203,160,130,157, 13, 42,178, 89, -150, 88,149,216, 44,206,213,102,200, 38,143,202, 18,172, 34,141, 14,113, 41,247, 64,145, 2,152,200,172, 32, 21,155, 66,207,208, -208, 51, 58,168,181, 44, 84, 26, 14,226, 34, 2,185,133, 58, 24,218, 43, 88,165, 82, 93, 91,190,102,127,219,190,125,155, 67, 36, - 84, 98,224,151, 62,168,126, 63, 4,233,249, 44, 46,198, 60,195,209,163, 71,209,179,103, 79, 48, 12, 3,189, 94,223,224,209,163, - 71,227, 8,130,120,249,243,214, 73,186, 10, 93, 68, 91, 39, 49, 45,253, 86,246, 90,191,121,251,141, 17,195,135, 91,247,233,179, - 30,247,162,162,144,173,179, 7,199,113,112,182, 53,129, 75,221, 89,208,168, 85,184,118,241,100, 46,171, 87,247,139,185, 58,222, -160, 36,127, 52, 34,236,210,136,122,126,237,166,204, 89,252,181,163,253,214,241, 63, 78, 31,238,214,184,209, 36,121,205, 22,113, -220,245,155,183, 20,251, 78, 28,120,169, 84,105,118,152, 9,177, 13, 36,148, 59,110, 27, 14, 70,191, 28,189, 47, 6, 64,247,182, -117, 6,181,233,211,163,229,234, 73,125,114,188,199, 7,140, 3,203,178,216, 28,188, 21, 71, 14, 59,220, 40,210, 82,129, 36, 73, -134, 87, 50, 41, 40,104, 90, 11,150,161,193,113, 28,174, 93,187,138, 87,105,249,136,138,138, 74, 84, 40, 20,135, 1,172, 5,144, - 82, 89,155, 0,240,240,225,195, 52,111,111,239, 78, 71,142, 28, 9, 77, 73, 73,150,233,245,122,196,199,199, 35, 59, 59,167,136, -101,217, 25,198,216,208,211,133,243,118, 44, 27,203, 53,108,222,165,123,203, 47,191,178, 30, 54, 99,125,173,204,212, 4, 13,203, -178,112,170,221,218,218,177,174,204,129, 99,104, 38,249,241,229,236, 39,183,143,157,225,132,196,188,202,148,177,157,215,224,139, -179,102,205,194,208,161, 67,145,149,149, 5, 55, 55, 55,252,241,199, 31,136,139,139,187, 2,160,153,177,118,174, 94,189,154,209, -180,105,211,153,147, 38, 77, 90,185,118,237, 90,200, 23, 46,132,226,241, 99, 20, 61,122, 4,157, 66, 1,146,101, 97, 18, 17, 1, -210,218, 26, 43, 57, 14, 74,134,249, 49,220, 64, 14, 44, 0,208,250,250, 34,255,222,189,215,110,193,190,125, 1,185, 28, 48, 49, - 1,183,107, 87, 41,225,226, 86,172, 0,215,189,187,177,242,254,212, 25, 51,102, 52,247,240,240,168, 55,112,224, 64,236,220,185, - 51, 59, 53, 53,181, 81,106,106,234, 75, 67,187, 31, 24,176, 91,116,255,254,125,153,111,153,100,133, 57, 57, 57,168, 86,173, 26, - 40,138, 66, 82, 82, 18, 52, 26, 13,251,240,225,195,182,143, 31, 63, 62, 47, 20, 10,149,255,196,160,100,236,150, 28, 28,199,189, -177, 90, 80, 32, 16,160,176,176,240,189, 92, 26, 34, 82,130,186,150,109, 56,173, 94, 61,239,235,233, 3, 90, 92, 8,190,109,102, - 98, 98, 82, 58,249,212,172, 89, 19, 2,129, 0,219,143,172, 85, 41, 85, 5, 63, 26,233, 30,148,144, 36,217,167, 81,163, 70,136, -140,140,132, 86,171,189,180,225,208,188,199, 19,251, 47, 58,247,224,193,131,238,158,158,158,160, 40,170,199,196,254,139, 76, 54, - 28,154, 87,153, 96,206,231, 47, 95,190,132,167,167, 39, 44, 44, 44, 76,243,242,242,184,224,208,160, 61, 1,254,129, 71, 99, 99, - 99,107, 0, 72, 14, 14, 13,202, 55,198, 80,112,104, 80, 12,128,186, 1,254,129,146,184,184,184,172,204,204, 76,152,152,152,160, - 70,141, 26, 38, 41, 41, 41,195, 1,108,172, 76, 61,198,228,133,113,205, 26,207, 91,117,228,240,190,245,221,186,247,197,240, 81, -223, 54,186,122,229,226, 78, 75, 27,103, 60,142,121,129, 27,183,110,192,198, 76,140, 87,169, 41, 89,153,105,105, 27,205,244,228, - 47,231,163,126, 49, 58,235,248,238,243,203, 99, 1,124, 21,224, 31, 56, 80, 40, 20,194,220,220,156,122,245,234, 21,117,254,252, -121, 0, 24,243,243,214, 73,204,199,234,135,159,195, 42, 66, 0,139, 2, 2, 2,150,204,153, 51,135,106,208,160, 1,114,114,114, -144,145,145, 1,189, 94,143,226,237,187,224,230,230, 6,153, 76,134, 23, 47, 94, 32, 50, 50,146,209,106,181,139,130, 67,131,116, -239, 99,179,248,193,244,125,108,242,168, 44,193, 98, 89,142,251, 50, 96,155, 81,143,213, 44,203, 86, 56,176,167,165,165,117, 12, - 59,117,122, 68,216,169,211, 75,252,186,117,181,237,219,183, 57, 58,249, 55, 3, 8, 2, 55, 79,135, 64,165, 82, 29, 92,191,126, -125, 63, 51, 51,179, 76, 31, 31,159,167,131,167,180,251,214,216,139,184, 17, 54, 61,166,141,223,234,182,107,215,109, 60,228,211, -184,185,155,123,181,106,146, 22,174,230,208,210, 12,210, 51,178,241,252,201, 3, 77, 76,244,253,100, 86,167, 29,112,237,122,160, -209,190,141,157, 81, 97,106, 0, 27,123, 54,247, 59, 48,126,214,138,137, 53,171, 57, 13, 83, 23,105,145,146,145,115,144,100,177, - 22, 64,134, 49,196,234,109, 92,121,178,255,234,165,101,126,125, 0,234, 69,233,228, 6,142,153,222, 43,173, 23,128,236,182, 63, - 24,111,179, 36,255,213,246, 29,179, 38, 3,224, 18,211, 68, 39, 14,133,158,249,141,101,217,120, 0, 79, 43,202,121,101, 44,238, -223,191,127,167, 81,163, 70,221,111,223,190,243, 61,195, 48,205, 88,150,141, 6,240,235,253,251,247, 47, 27,243,251,200,216, 93, -233, 0,198, 52,172, 62,178, 89,116,196,197, 57, 77, 59,244,107,209,180,195, 96,107,173, 86, 7, 74,100, 34, 72,139,187,155,255, -240,250,193, 91, 92,161,230, 23, 18,184,122, 47,182,114,123, 18, 94,142,222,215,161,109,157, 65,244,175,191,254,250, 70,127, 22, -137, 68,109, 43,123,173,119,238,220, 89,221,172, 89, 51,118,232,208,161, 43,251,245,233, 67, 54,159, 54, 13, 78, 55,110, 32,195, -210, 18,185, 15, 30, 32, 45, 59, 27,187, 68, 34, 86,161,215,207, 11, 15, 15,255,197, 40,130,169,215,195,221,221,253,181,226,178, -124,249,235,109,166, 0,192,198,166,244, 41,148,235,222, 29, 44, 99,220,220,112, 49,106,175,218,191,254,208,222,163, 71,143,190, -127,234,212, 41,211,126,253,250,217,172, 91,183,174, 74, 76, 94, 88,202,135,180, 51,199,113,157, 78,159, 62,125,254,212,169, 83, -239,140,173,162, 40,170,136, 97,152, 78,193,161, 65,215,203,184, 84, 62, 42,177,170,220, 67, 5,253, 70, 46, 41,142,227, 42, 92, -105,102, 8, 66, 82,140, 71, 87,227, 35, 27,183,247,250,165,195,192, 38,115, 23, 5, 6,153,218,218,189, 94, 85,154,144, 20,135, -223,142,172, 83,169,180,249, 75,211, 34, 53,119,141, 85, 70,172,172,172,204,164, 82,105,137,202, 88,178,170,111,207,189,123,247, -186,215,174, 93, 27,150,150,150,178,236,236,108, 79, 0, 17,149, 33, 88,175, 94,189,130, 94,175,135,189,189, 61,145,151,151, 87, - 29,192,227,224,208,160, 34, 0,239, 21, 95, 26, 28, 26,164, 25,241,229,156,132, 39, 79,158,212,115,117,117, 37, 34, 35, 35,139, -104,154,222,243, 62,182,242,226,174,110, 60,126,148,243, 81, 41,149, 95,183,105,255, 37, 58,118,238,133,148, 87,175, 16,121,247, - 6, 94,190,120, 26,156,160, 22, 78, 86,190,178,202,143,201, 91,244, 33,100,136, 3,128,130,130,130, 18, 37, 85,103,106,106,250, -190, 10, 75, 97, 25,229,170, 16,159, 17,130, 67,131,126, 13,240, 15, 60, 58,110,220,184, 31,220,220,220,134,206,152, 49,131,170, - 93,187, 54, 10, 10, 10,208,172, 89, 51,216,219,219,227,201,147, 39, 8, 9, 9, 97,178,179,179,247, 3, 88, 84, 76,154,255, 85, -155, 60,202,121,104,173, 40, 21,194,251,110,194, 90, 17, 60, 44,253, 4, 78, 78, 78, 35, 0,148, 18,173, 89,147,150,130,165,105, -105,253,250,245,205,105,154,102, 87, 7,207,201,122, 47,219,197,155, 61,147,148,168, 59,199,113, 13, 1, 16, 4, 73,190,115,179, -231,247, 65,247,166,126, 54, 44, 11, 2, 64,214,233,187, 31,182,137,114,217,189, 3, 43,187,239,224,187,108,125,232, 38,207, 21, -237, 69,104, 36, 42,220,139,176,204,121, 8,153,141,123, 55,169,137,229, 79,109,186,125,237,126,253,228,206,151, 42,101,222, 2, -117,110,194, 49, 99,109, 84, 96,123, 14,128,165,120,157, 3,102,142,177,182,222,222,139, 16,168,252,102,207,229,237, 69,216,188, -121,115,186,236, 10,157,183,221,128,239,122, 63,110,220, 56,233,240,225,195,245,134,246, 34,236, 80,111, 72, 91, 7, 7,135,205, -185,185,185,207, 73,146,236,119,250,238,111, 90, 3,215,248,175,194,208,190,130, 21,141, 53,134,246,186,251,126,244,186, 88,154, -166,221,141, 34, 78, 66, 97, 6, 65, 16, 85, 15, 30, 60,248,246,132,254,206, 62,175, 99, 53,112,107, 98,213,216, 68,102,186, 80, -171,209,122, 19, 4, 56,145, 88,252, 64,169, 42,248,241, 45,114,197, 86, 84,198,137,253, 23, 17, 0,206, 88, 90, 90,118,206,203, -203,123, 0,160,249,134, 67,243, 52, 19,251, 47, 18, 2, 56,108, 97, 97,209, 35, 63, 63,255, 10,128, 14, 27, 14,205, 99,141,185, -110, 0, 8,240, 15,172, 91,173, 90,181, 71, 63,254,248, 35,241,243,207, 63, 35, 46, 46,174, 65, 69,238, 64, 99,247,139, 12,240, - 15,172, 45, 18,137,246, 50, 12, 83,157, 36,201,221, 52, 77, 79, 13, 14, 13,210, 87,198,102,137, 61, 15, 75, 63,194,162,134,223, - 80, 83, 83,211,233,182,182, 14,117, 50,210, 95,197, 20,170,139,130,242,159,135,237,138,201, 11, 99, 43, 91,214,119,205, 69, 1, -254,129, 26,188, 94, 32,131,138,226,173,254,151,247,207,123,171,125,106, 0,248,193,213,213,117,232,184,113,227,168,152,152, 24, -156, 59,119,142,201,200,200,120,111, 18, 84, 89,155,252, 94,132,159, 57,193,122, 7,209,154, 79, 16, 68,220,165,199,193,237, 62, -150,237,191,119,130,138, 55,117,254, 84,248, 24,196,232,127, 21, 30,150,235, 41, 19,171,251,158, 42,137,249, 11, 0, 69, 49,209, - 65,159,176, 29,218,148, 59,217, 86, 98, 32,124, 39,193,250, 64,155,250,127,238,158,248,119,213,166,119,149,225,159, 28, 95,140, - 44,207, 71,111,243,119, 97, 98,255, 69, 85, 55, 28,154,151,244,214,103, 2, 0, 86, 0,114, 55, 28,154, 87,233,118, 14,240, 15, - 92, 32, 16, 8,190,210,235,245,251,131, 67,131,190,227,167,178,127,175,239,127, 42,130,245, 22, 41,154, 82, 60,102,173,253, 24, -234,146,177, 54,121,130,245, 17, 9,214,191, 61, 8,126,142,141,247,169, 39, 1,126,192,225,219,236,255, 91,223,227,219,143,159, -216,120,240,248, 47, 64,192, 87, 1, 15, 30, 60,120,242,203,131, 7, 15, 30, 31, 23,124, 6, 49, 30, 60,120,240,224,193,131, 7, - 15,158, 96,241,224,193,131, 7, 15, 30, 60,120,124,222,224, 93,132, 60,120,252, 63, 3, 31,207,195,131, 7, 15, 30,159, 1,193, -250, 24,131,241,187,226, 46, 42, 99,151,143,219,168,252, 4, 90, 81,157,149,253,238,159,158,108,203, 43, 71,128,127,160, 24, 0, - 17, 28, 26,164, 1, 0,243,144, 41, 0, 64,156,188, 28,229, 12, 14,100,247,246,245, 82, 0,112,246, 3,238,243, 13,202,131, 7, - 15, 30, 60,254, 91, 4,235,237,201,177, 71,125, 63, 39, 74,132,238, 4, 7,138,229,112, 26, 64,210,159,145, 97, 70, 19,167, 90, - 22,126,196,142,217,112, 4,128, 90,203,144,230,238,238,102, 78,211,244, 96,142,227, 2, 0,128, 32,136, 96,161, 80,184,239,197, -139,196,130,146,227,190, 89,134, 52,192,248,236,212,131, 59, 76,171, 13, 96, 8, 65, 16, 3,240,218, 5,122,136, 32,136,189,123, - 47,172,124,108, 44, 57,145,201,100,233,106,181,218, 30, 0,164, 82,105,134, 90,173,118, 68,241,222, 46,253,251,247, 39,178,178, -178, 8, 0,184,114,229, 74, 73,206, 72,174,162, 12,218, 13,157, 58, 39,169,213,106,215,183, 63, 23, 10,133,180,165,165,101,142, -141,141, 77,174,189,189,125,174, 72, 36,122,148,149,149,117, 41, 50, 50,242,118, 76, 94,216,171,202, 52,228,232,158,243, 22,136, -197,226, 89, 12,195,108,220,116,100,254,140,247,237, 16,198,144,217,174, 13,135,120,187, 56, 59,238, 97, 25,134,126,149,158, 57, -231,244,131,189,231,202,107,247, 0,255, 64, 91, 0,179, 0, 8, 1, 44, 11, 14, 13, 74, 11,240, 15, 60, 41, 18,137,186, 21,127, -127, 61, 56, 52,168, 53, 0,226, 88,200,131, 37, 28, 48,179,248,255,181,189,191,104, 24, 8, 35,247, 57,124,187, 13, 93,234,119, -182, 23,202, 44,167, 2, 84, 31,150,101, 78,211,116,222,138, 87,247,207,165,126, 42,178,110,136,200,242, 15, 17, 60,120,240,224, -241,223,130,193, 60, 88, 35,234,249, 73, 85, 98,116, 98, 89,244,113,117,182,110, 49,117,108, 95,219,156,188, 34,252,182,231,100, -118,122,118, 65, 56,199,225, 40, 33,195, 89, 0,170,163,215,195,222, 57,145,188,222,250,194,143,216, 50, 23, 75,217,215, 19, 40, - 30,197, 75, 99, 47, 61,116,113, 31, 53,106,148,184,111,223,190, 40, 40, 40,192,145, 35, 71,112,224,192, 1,173,191,247,171, 23, -245,171,171,107,225, 53, 67, 90, 62,118, 41,230,198,230,151, 79, 96, 6,180,157,236, 44, 16, 8, 6, 3, 8,240,245,245,245,158, - 48, 97, 2,106,215,174, 13,141, 70,131, 59,119,238, 32, 56, 56, 24,143, 30, 61,122, 4, 32, 24,192,190,224,208,160,228,138, 38, - 66,130, 32,184, 50,187,168, 99,204,152, 49,160,105, 26, 37,155,233,106, 52,154,168,162,162,162, 72,157, 78,119, 71, 44, 22, 95, -191,112,225,194,147, 58, 14,178,198,230,102, 38,254,187,194, 15,255,252,182,205, 58, 54,237,233,194, 91,183, 4,208,235,161, 79, - 76, 68, 81,187,118,208, 49, 12,104,154,134,168,103, 79,104, 57, 14,140, 88, 28, 87,184,124,121,111,105, 67,242, 49, 0,244,242, -234, 18, 96, 97,106, 50,111,231,237, 67,181,141,105,200, 95,103,252,161,253,241,199, 31, 69, 67,134, 12, 41, 16, 8, 4, 54, 91, -222,145, 84,181,135,103,215,246, 54, 86,166,157,119,220,220, 63,171,188,137,223,208, 68,223,181,225, 16,243, 58,181, 61,147,215, -175, 93,101, 86,144,157,134,145, 99, 38, 22,230, 42,213,131,158, 39,166,188,115, 63, 53, 95, 95,223,133, 35, 70,140,152,103,101, -101,133, 85,171, 86,197,112, 28,215, 20, 64,198,197,139, 23,197, 66,161, 16,254,254,254,208,233,116, 85,172,164,234, 1,189,106, - 61, 93, 57, 97,218, 56, 2, 0,182,174,223,202,145, 64,181, 81,155,245,137,149,237,212,238,190,157,109,156,170,120, 70, 79, 11, -156,110, 99,109, 99, 67,158,187, 17,203,157, 58,176, 49, 35, 63, 39,201,231,242,229,239, 82, 63, 55,114,245,111,147, 44,222, 69, -200,131, 7, 15, 30,159, 88,193,234,229,235, 55, 80, 34, 23,204,157, 52,236, 11,231,158, 61,122,152,219,185, 55, 19, 18,228,235, -205, 53, 7, 12, 15, 52,123,246,240,138,203,241,227, 39,252, 15,158,188,250,138,214,179,107,123,251,248,237,136,142,127, 55, 15, -218, 49, 27,142, 44,137,153,227,135,140, 39, 1, 96,115,240, 22,207,101, 91, 66, 97,102,233, 82,122,140,183,183, 55, 2,167,140, - 18, 31, 92, 85,221,115, 92,192,120, 0,192,166,189,155,102,238,152,141,181,173,230,226,157, 19,227,144,142,211, 23,184,184,184, -204, 11, 12, 12, 36,155, 54,109, 10,153, 76, 86, 86, 33,130,191,191, 63,252,253,253,145,158,158, 94,255,202,149, 43,245,247,238, -221,187,116, 72,199,233, 43,246, 94, 88, 57,203,216, 74, 10, 8, 8, 64,118,118, 54,114,114,114, 80, 80, 80,240, 74,161, 80,100, -168,213,234, 87, 50,153,236, 73,207,158, 61,159,213,182, 53,171,110,105, 99,121, 98,209,140,111, 82, 1,252, 92,158,157,244, 22, - 45, 0, 0,138,187,119, 1,177, 24, 0, 32,103, 89,142, 21,139,159, 18,169,169, 71, 26,180,107,247, 36, 54, 47, 12,221, 61, 59, -249, 89, 89, 88,238,254,229,251,137, 70, 37, 50, 28,241,229, 28, 43, 83, 83, 83, 61, 73,146,162,250,245,235, 11, 31, 61,122,148, - 49,174,207,130,223, 54, 31, 93, 80,122,141, 61, 60,190,172,239,104,111,123,248,167,153, 35,211,138, 21,165,247,130, 88, 36,152, - 49, 99,218,183, 50, 69,194, 29,100, 62,143, 68,203,154,246,242,243, 15,147,151,160,252, 13,107, 45,157,156,156,208,167, 79, 31, -104, 52, 26,143,141, 27, 55, 30, 4, 64,170, 84,170,210,141, 69,157,156,156,146,252, 90,250, 82,100,252, 66,227,159, 12, 8,130, - 42,222,128,244,111,208,235, 37, 63, 76,153, 50,197, 46, 67, 99,142,224,115, 74, 88,153, 56, 19,246,245,251,217, 23,222,216, 53, - 19,192,180,207,145, 92,149, 28,251,190, 36,171,188, 7, 27, 30, 60,120,240,224,241, 25, 18, 44,146,197,236,240, 59,143,234, 83, - 92, 14, 65,136,172,222,248,142, 18,136,225,229,211, 73,232, 94,179,161,205,192,129, 9, 86,189, 6,143,154, 33,182,192,110, 0, -180,177, 39, 39,222,177, 41, 43, 69, 81,149,186, 0,142,227,102, 29, 56,112,128, 20,139,197, 21,254,214,193,193, 1,254,254,254, -176,183,183, 39,102,207,158, 61,179,107,227,145,243,202,219, 90, 68, 42,149,102, 16, 4, 97, 15, 0, 54, 54, 54,216,188,121, 51, -180, 90, 45, 87, 84, 84,244, 64,163,209,220,211,104, 52,183, 4, 2,193,141, 29,167,150,196,244,245,240,179, 23, 73,133,231,182, -110, 92,195, 81,172,218,185,188,243, 51, 41,239,220, 38,174,128,149,201,226, 16, 23,119,152,203,205,189, 77, 0, 92,141,218, 93, - 61, 37, 34,241,133, 45, 27, 87, 65,196,106, 13, 86,198,136, 47,231, 88,137,197,226,219,107,215,174,149,200,100, 50, 12, 31, 62, - 92,150,150,150, 38, 91,186,116,233,183, 37, 68,170,143, 87,103, 87,185, 76,118,118,211,198, 85, 44, 91,148,103,251, 62, 29,165, -107,195, 33,141, 60, 60,106, 94, 90,185,102,189,169,151,151, 7, 25,117,114, 29, 30, 61,122,129,140,140, 92,112,224,164, 21,252, -116,113, 80, 80, 80, 31, 79, 79, 79,167,111,190,249, 6, 2,129,224,139,172,172, 44,236,219,183, 15, 38, 38, 38,216,180,105, 19, -220,221,221, 41,134, 97,112,239,100, 54, 54,173,217, 0,142,227,160,210,137,246, 13,239, 86,187,220, 29,236, 23, 44, 88,224, 92, -191,126,125, 65, 84, 84, 84, 58,199,113, 69,111,244, 33,161,112,168,189,189, 61, 14,156, 87,161, 64,205, 66, 81, 68,163, 64,165, - 38, 40, 74,208,165, 50, 4,171, 50,219,118,124, 44,165,232, 67, 72, 22, 15, 30, 60,120,124, 46,152, 57,115,230, 63,101,154, 67, -113,200, 78,101,176,124,249,242,207,139, 96, 17, 4,132, 2,243,218,132, 54,180, 46, 75, 90, 55, 33, 4,142, 95,130, 48,171, 67, - 0, 64,102, 82, 4,247,252,206, 94,164, 60,187,200, 53,232,188,132,224, 56, 80, 5, 5,229,167,125,248,102, 25,210,182,204,197, -242,141,123, 54,205, 38, 73, 18,166,206,125,112,227, 86, 20, 92, 92,242,225,230,230, 6,149, 74,133,235,215,175,227,193,131, 7, - 48, 69, 51,108, 14,222, 2,150,101, 65, 17, 88,254,205, 50,164,197,230,151,207, 3,137, 83,167,144, 57,116, 40, 68,137,137, 48, -177,182,134,184, 88, 29, 42,193,243,231,207,113,229,202, 21, 36, 36, 36,192,221,221, 29, 4, 65,160, 74,149, 42,229, 54,208,131, -212,115, 14,243,199,111, 82,125,243,205, 55,242, 61,123,246, 32, 58, 58,218, 34, 56, 52,168,224,237,227,250,212,234,103,194, 82, -228,233, 77,171, 22, 11, 36, 34,210,238,206,217,115, 73,141,125,198,190,211,166,178,101, 75, 40, 30,189,222, 46,204,180,117,107, - 48, 85,170,232, 56,137,228,169,112,248,240, 14,218, 97, 13,138, 0,160,190,167,159, 29, 13, 46, 98,195,138, 69,164, 92, 34, 34, -111,159, 57,206, 53,246, 29,247,238,250,236,246,221, 92,142,227,102, 50, 12, 35,223,176, 97,131,192,209,209,145, 92,179,102,141, -254,244,233,211,122,142,227, 40,177, 88,188, 14, 0,250, 53,232, 97, 9, 78,112,110,243,218, 95, 65,177,180,117,248,149,144,164, -102, 77,198, 87,186,163, 72,197,194, 63,102, 78, 30,107,238, 81,205, 22,143, 99,147,112,245, 94, 50,110, 68,196,105,147, 10, 52, - 26, 61,203,125, 93,222,239,130, 67,131,210, 3,252, 3,123,205,152, 49,227,218, 31,127,252, 33, 30, 58,116, 40, 24,134, 41,125, -169, 84, 42, 92,186,116, 9,215,174, 93, 67,120,248,253, 60, 49, 87, 59,196,201, 84,181,115,249,215,150,231, 81, 65,252, 85,245, -234,213,233, 85,171, 86, 89,108,220,184,209,223,222,222, 62, 41, 35, 35,227, 97,177,178,229,226, 86,175, 93,230,133, 91, 49, 86, -246,230,174,132,162, 72, 11,101,102, 2,212, 25, 79, 57,150,211,159,250, 24,202, 19, 79,130,120,240,224,193,131,199, 7, 17,172, -191,248, 34, 3, 54,251, 22,167,203,190, 5, 66,238,194,133,222, 72, 64, 65, 86,124,233,215,180, 86, 97,208, 68,108,126, 24, 55, -118,169,223, 92,143, 26, 14,179,239,223,191,143, 75, 97, 17,208,235,245,120,241,226, 5, 94,188,120,129,147, 39, 79, 66, 36, 18, - 65, 34,145,128, 19,183, 67,131, 22, 83, 48,121,242, 20,196,196,165, 87, 24,127, 5, 0,208,190, 22,162,116, 58, 29,114,115,115, - 65,180,110, 13, 97,211,166,136,159, 52, 9, 23, 46, 93, 66,122,122, 58, 68, 34, 17, 68, 34, 17,244,122,227,182,253,162,105,154, -200,200,200,128, 90,173,102,105,154,254,219,143, 60, 44,253,136,128, 65,253,143, 55,171, 97, 83,211,197,173,186,217,245,227,123, - 17, 31,255,138,107, 92,190,189,191,212,172,106,213,138, 56,224, 46,117,239,222,222,157,247,238,105, 6, 15,123,189, 80,160, 81, -167,161, 79,189,156,100,178,170,213, 61,136, 27,199,247, 34, 33, 46, 21,229,217, 99, 89,118, 78,112,112,176, 89, 65, 65, 1,228, -114, 57,150, 47, 95,174,191,116,233, 82, 26,203,178, 77,246,132,172, 72, 7,128,125,107, 46,147, 62,126,221,207, 54,171,101, 83, -197,214,193,193,244,234,177, 61, 72,136,127,197, 53,123,143,142,162, 99, 48,109,206,188,197,103,199,118,107, 64,101,230,104,176, -253,244, 45, 90, 38, 17,237,208,179,220, 79,167, 31,236,205,168,232,183,193,161, 65,119, 3,252, 3, 3, 6, 12, 24,176,190,122, -245,234,142,192,107,119,240,144, 33, 67,176,102,205, 26,132,132,132, 28, 6,176, 21,192, 21, 53, 36,228,198, 83, 27,181, 37,108, -214,190, 28,155, 39, 78,156,200,116,113,113,113,216,186,117,107,250,146, 37, 75, 26,184,184,184,120,189,124,249,242,136,141,141, -205,168,217,223, 14, 9,251,253,207, 29, 46,114,215, 86,242,236,252, 66, 66,155,159,194,105, 50,159,102,177,218,252,229,255,165, -155,215,144, 66, 86,246,123,158, 16,242,224,193,131,199,191,139, 74, 39, 26,229, 10, 83,222, 32, 87,175, 9,150,210,168,223,198, -230,135,113, 42, 53, 9,153,169,195,223,237,190, 21,108,175,213, 75,160, 82,147, 48, 72,174, 0, 48,189,123, 3, 73, 73,128,135, - 7,224,228, 4, 46, 52, 20,186, 21, 43,176,105,235, 86, 36, 37,189,233,101, 98, 24,198, 88,130,197,101,102,102,114, 74,165,242, - 65, 81, 81,209,223, 8,214,176, 97,195, 22,212,169,219,160,113,183,225, 83,132, 87,143, 31, 44,120, 26,157,128,180,140,220,119, -214,167,137,137, 73, 65, 25,130,117,159, 35,136, 48,226,254,253,157, 12,112,111,112,241,206,242, 75,167,253, 30,226, 82,213,221, -242,171,169, 11,136,139,127,238,231,158, 62,137, 67,106, 70,110,249, 13, 71,146,127, 14, 29, 58, 84,187,107,215, 46, 77, 88, 88, - 24, 66, 66, 66,244, 52, 77,151,146, 43, 0, 72, 76, 76, 92,214,160,145,143, 87,183, 97,147,169, 75, 71,247,231, 61,123,154,136, -140,204,124,170,178,109, 30,224, 31,104,229,215,161,227,150,229,107, 55, 82,187,175,196, 49,183,239, 62,134, 68, 44,210, 29,143, -220, 51,193, 16,185, 42, 67,178,142, 42, 20,138,170,247,239,223,247,188,127,255,254, 79,201,201,201,160,105, 26, 44,203, 2,192, -159, 0,238, 2, 56, 99,103,103,167, 10,240, 15,220, 99,200,222,193,131, 7,153,189,123,247,198, 78,153, 50,197,122,234,212,169, -233,243,231,207, 55,169, 82,165,202, 2, 23, 23,151, 42,227, 70,143,124,121,116,203,188,223,189, 44,210, 31,168,226,207,171,212, -169, 15,182,147, 92,190, 87,202,163,115, 25,159,195, 77, 23,155,127,149, 39, 60, 60,120,240,248,175,131,123,235,133,119,188, 47, -239,248,127,227,187,207, 68,193, 50, 0,189, 86,245,209, 11, 86, 88, 88,104,124, 43, 86,176, 18,146, 32,136,247, 37, 88,108,110, -110,110,130, 74,165,186, 27, 23, 23,247,198,143,126, 28,183,113,144, 68, 34,153, 58,125,250,116,211,180,180, 52, 36,235, 45,168, -204,236, 2, 90,171,167,223,153,180,201,202,202, 42, 91, 60,117,170, 53,147,156,156, 7,150, 77,185,255,232, 81,159, 6,121, 97, -165, 54,127,158,188,125, 3,195, 48,254,115,230,204, 33, 50, 50, 50, 80,104, 94,147,200,200, 14,135, 90,199,100,149,167, 76,236, - 56,181,100,248,224, 14,211, 86,222,184,113,227,174,181,181, 53, 56,142, 35,203,146,171, 31,198,172, 31,107,110,110, 62,122,194, -132, 9, 38, 73, 73, 73,200, 16, 57, 11,178,243,238,107, 52, 90,250,166, 49, 46,174, 0,255,192, 70, 20, 69,133, 82, 20,101, 86, -183,110, 93,242,235,175,191, 38,118,237,218,149,146,154,150, 57, 46,149,161,215,178, 28, 55,194,152,122, 44,201,111,117,252, 82, -148,243,132,166, 16,108, 14,111,232,100,105,101, 61,119,232,208,161,208,235,245,104,223,190, 61, 30, 62,124,184, 51, 59, 59, 59, -101,228,200,145,238,109,219,182,197,252,249,243,135, 4,248, 7,206, 15, 14, 13,138,175,200,118,122,122,122,161,149,149,213, 77, -165, 82,217,107,239,222,189,217,222,222,222, 2, 11, 11,139, 28, 0,226,212, 87, 73,228,145,223,151,165,101,103,103,143,211,233, -116,225,252, 88,199,131, 7, 15, 30,255, 58,136,183,200, 78,121,239, 43,251,221,251,216,252,223, 36, 88,198, 42, 88,101, 33, 20, - 10,223,112,155,149, 5, 69, 81, 40, 42, 42, 50,218, 22,185,109, 27, 48,123, 54,240,252,249,235,213,121,110,110,128, 78, 7,193, -176, 97,127, 39,131, 70,186, 8, 11, 11, 11, 31,228,228,228,100,230,231,231, 95, 7,192, 0,192,238,149, 23, 70,199,196,196, 76, -207,201,201,169,213,191,127,127, 58, 37, 37, 5, 97, 97, 97, 8,185, 17,193,188,140,203, 96,197, 76,225, 59, 99,124,236,237,237, -179,105,192,154,160,233, 80, 68, 71,255,217, 31, 96, 99, 1,252,190,236,236,193,184,184,184, 62,233,233,233, 84,187,118,237,240, -242,229, 75, 92,185,114, 5,251,142,158, 68,114,220, 43,206,148,212,133,148,167,128, 0,192,190,139,171, 30,125,221,117,238,193, - 51,103,206, 52, 22, 10,133, 71,138,149,176, 57,233,233,233,147, 53, 26,141, 67,203,150, 45,233,248,248,120, 92,190,124, 25, 39, - 66, 46,235,210, 19,211,116, 18, 78,115,194, 24,114,101,106,106,122,105,212,168, 81,230, 2,129, 0, 22, 22, 22,216,188,121, 51, - 30, 63,126,220,228,248,221,223,211, 1,156,169,204, 13,118,244,194,131, 5,224,240, 29,163, 7,217,218, 45, 67, 63,120,246,102, -145,181,181, 53, 34, 35, 35,225,229,229,133,149, 43, 87, 10,158, 61,123,230, 94,187,118,109,196,196,196,224,229,203,151, 73, 0, - 18,140, 49,158,155,155, 91, 96,105,105,121,101,202,148, 41,189,127,251,237,183, 92, 0,148, 70,163,145,246,234,213,203, 53, 45, - 45,109, 18,199,113, 47, 62,183, 17,135, 79,147,192,131, 7, 15, 30, 31, 85, 41, 43,143,220,113,239, 32,122,159, 7,193,226, 56, - 40,245, 69,105,156,176,254,106, 66, 31, 23,196,113, 69,111,166,143, 18,201,172, 96,225,216,128,200,206,201,214, 3, 80,123,123, -195, 24,246,242,236,214,173, 91,158,237,218,181, 67, 92, 92, 28, 18, 19, 19, 65,107,114, 32, 36,139, 64,146, 82, 56, 57, 57, 65, - 46,151,227,250,245,235, 0,240,204,168,218,213,106,141,190, 96, 99, 21, 44,165, 82,121, 55, 51, 51, 51, 62, 45, 45,237,114, 76, - 94, 24,247,219,210,211,223, 63,123,246,108,110, 70, 70,134,156,227, 56, 4, 5, 5, 9, 47, 95,190, 92, 20, 26, 26,170,207,207, -207, 63,195,178,236,140,242,146,131, 74,165,210,104, 93, 66, 66, 12, 21, 29,125,154, 3, 30,197,230,133,113, 91, 22, 29, 63,255, -228,201,147,142, 5, 5, 5,132, 64, 32,192,238,221,187,113,231,206, 29,220,188,121,147, 99, 24, 38, 9, 64,191, 75,169,231,238, - 25, 42,231,239,167,151,150,178,200, 69,223,110, 91,145,146,146, 50, 78,175,215,203, 9,130,192,134, 13, 27,132, 23, 46, 92, 80, -222,184,113,131, 80, 40, 20,251, 88,150,253, 33, 38, 47, 44,179, 34,123, 67, 58, 78,247, 54, 55, 55,191, 60,114,228, 72,179,167, - 79,159, 66, 40, 20,194,212,212, 20, 79,158, 60, 97,130, 67,131,210, 43,219,193, 46,132, 61,182, 6,135, 57, 99, 39,143, 37, 73, -146, 36,183,110,216, 38,178,148,115,248,227,143, 63,112,232,208,161,244,122,245,234, 57,140, 28, 57, 18,158,158,158,120,250,244, - 41, 86,173, 90,149,171,213,106,123, 5,135, 6, 25, 45,233,230,229,229, 37,185,185,185,197,110,220,184,177,238,132, 9, 19,212, - 19, 38, 76,112, 85,169, 84,251, 63, 71,114,245, 49, 97, 40, 35, 63,239,134,228,193,131,199,255, 51,149,172,188,239, 62,137,154, - 85,177,130, 69,226,135, 86,205,106, 46, 89, 60,111,106,157,214,237, 23,155,144,217, 33, 96, 83,143,113, 2,177, 9,108,221, 90, - 17,132,196,158, 13,189, 18,158,123, 42, 44,246, 5, 1,252,244,244, 30, 12,178, 23,138,162,186,245,235,215,111,121,147, 38, 77, -122,255,242,203, 47,144,211, 23,240, 52, 98, 45,234, 90,114,144,218,247, 68,124,142, 25,118,236,216,129,220,220,220, 99, 20, 69, - 25,179,206, 83,175, 30, 53, 74, 44, 26, 51, 6, 58, 87, 87,160,168, 8,120,241, 2, 16,139,193,124,255,125,105,144, 25, 65, 16, - 16,137, 68,208,106,181,224, 56,142,205,202,202, 98, 13, 16,172, 91, 71,143, 30,189, 17,147, 23,150,182,243,215,115,253,146,146, -146,230, 54,109,218, 84,110,105,105,137,179,103,207,226,193,131, 7, 68, 98, 98, 98, 33, 77,211, 61, 98,242,194,110, 87,100, 43, - 51, 51,243, 98,173,232,232, 67, 37,217,222, 55,253,116,108,233,243,231,207, 59,182,109,219,150,176,177,177,193,169, 83,167,112, -243,230, 77, 36, 39, 39,115, 82,169,116,248,131,212,115,187, 43,219,144,139,190,221,246,117,102,102,230,184,158, 61,123,202,165, - 82, 41, 78,157, 58,133, 59,119,238, 16, 47, 94,188, 80,233,245,250, 78, 49,121, 97, 81, 70,117, 8,129, 96,230,137, 19, 39,204, - 66, 66, 66, 32,145, 72, 96,102,102, 6,141, 70, 3,130, 32, 52, 31,171,211,169,213,106, 28, 62,124, 88, 1,160,122, 84, 84, 84, -159,217,179,103,175,173, 90,181,170,101, 82, 82, 82,166, 86,171,237, 24, 28, 26,244,168,178, 54,147,146,146, 66,214,172, 89, 83, - 95, 34,145, 56,156, 60,121,146, 83, 40, 20,251, 63,148,188,124,104,154, 6, 30, 60,120,240,224, 97, 52, 73,226,202, 33, 77,132, -145, 42,213,187, 72,149, 49, 36,236,211, 16,172,163, 17, 97,151, 70,212,243,107, 55,101,206,226,175, 29,237,183,142,255,113,250, -112,183,198,141, 38,201,107,182,136,227,174,223,188,165,216,119,226,192, 75,165, 74,179,195, 76,136,109, 32,161,220,113, 59,204, -224, 9, 67, 31,237,137, 7,208,167,157,215,224, 22,189,186,251,173,158,220, 55,179,241,248, 33,175, 83, 17,108,218,187, 25,135, -143,220,186,171, 40,164,166, 94,142,222,119,211,200,107, 88,246,245,215, 95, 47, 24, 59,118, 44,217,186, 79, 31,232,110,221,250, - 27,203,147, 72, 36,144, 74,165,120,245,234, 21,158, 61,123,198,177, 44,187,236,232,245,141,186,138,140,198,197,197, 93,139,201, - 11,203,216,249,235,185, 90, 9, 9, 9,191,215,169, 83, 71, 94, 66,134, 78,158, 60, 9, 0,133, 0,198, 24, 34, 87, 0, 16, 29, - 29,125,187,132, 92,173,249,254,192, 23,241,241,241,179,189,189,189, 9, 83, 83, 83,252,249,231,159, 56,117,170,212,179,184, 57, -242,229,153, 74,147,171,159, 38,110,105,152,158,158,190,174, 77,155, 54,114,138,162,112,236,216, 49,132,132,132,148,148,113,180, -177,228,170, 88,225, 91,181,114,229,202, 94,223,127,255,189,212,212,212, 20,143, 30, 61,194,241,227,199, 21,122,189,190,219,251, -116,176,142,126,117,115,142, 94,120,240,203,150,181, 91,190, 3, 64,144, 14,254,132,204,162, 10, 44, 44, 44, 76,243,242,242,184, -224,208,160, 61, 1,254,129, 71, 99, 99, 99,107, 0, 72, 14, 14, 13,202,127,159,243,112, 28,167, 39, 8, 98,199,236,217,179,127, -206,206,206, 94,202,113, 28,251,161, 55,199,135, 18,169,138, 72,218, 63,117, 78, 30, 60,120,240,248, 28,176,124,249,114,194,128, -210,100,232,253,135,126, 71,124,234, 58, 48,184, 85, 78, 9,122, 54,247,179,166,116,152, 88,179,154,211, 48,117,145, 22, 41, 25, - 57, 7, 73, 22,107, 1,100, 28, 41,179, 31, 97,101, 92, 21,215,151,250, 57,105, 9,188, 28, 63,116, 60, 1, 0,155,246,108,226, -196, 28,170,180,154, 27, 86,169,237, 76, 6,181,159,218,128, 32,136,165,213,170, 85,235, 50,122,244,104,248, 44, 89, 2,125, 84, - 20,150, 14, 24, 0,153,165, 37,242,242,242,240,244,233, 83,168, 84,170, 11, 0,230, 4,135, 6, 69, 26, 99,247,247,101,103,125, -226,226,226, 46,191,122,245,202, 68,163,209, 16, 49, 49, 49, 40, 42, 42,210, 22, 51,227,181, 0,230, 84,180, 7,225,219,248,117, -198, 31,195,226,226,226,118,165,167,167, 19,122,189, 30, 47, 95,190,132,246, 47,247,230, 29, 0,109, 98,242,194,116,149,185,246, - 31,199,109,244, 75, 75, 75, 59,151,159,159, 47,209,233,116,136,143,143,103,105,154, 46, 2, 64, 1, 88, 18,147, 23,246,115, 69, -191,127,215, 86, 57, 1,254,129,173,122,246,236,121, 97,230,204,153,146, 46, 93,186, 40, 11, 11, 11,187,239, 9, 89, 17, 86, 25, - 59, 37,200, 56,232, 13, 20, 7,185,159,121, 94,125, 64,131, 86,131, 86, 14, 25, 50, 4, 11, 23, 46,196,179,103,207,234, 5,135, - 6, 61,126, 31,187, 4, 65,180, 2,208, 29,128, 3, 94,103,115, 40,251, 55,227, 29,175,115, 28,199,133,126, 10, 2,195,111,149, -195,131, 7, 15, 30,255,255, 96,116,144,251,241, 91, 97, 57, 0, 22,118,111,234,183,145,101, 65,128, 64,214,233,200,176, 15, 58, -121,113,242,209, 95, 55,237,221, 52, 19, 0, 72, 2,203,191,249,165,194,164,162,239,196,254, 75,171, 31, 2,248,114,232, 23, 51, -252,190,251,238,187,101,221, 28, 29,155,142,240,243, 3, 37, 20, 34, 34, 34, 2,185,185,185,247, 72,146,156, 19, 28, 26, 20, 90, - 25,187, 49, 49, 49, 43, 82, 82, 82, 4,241,241,241,137,121,121,121, 47,240, 58, 38, 44, 22,192,153,152,188,176,231,149,189,222, -103,207,158,253,252,226,197, 11,100,101,101,105, 88,150,205,101, 24,230, 69,177,189, 29, 49,121, 97,215,223,167, 14,147,147,147, -191,203,200,200, 80,101,100,100, 60, 43, 44, 44,140, 3,240, 4,192, 11, 0, 23, 42,187, 97,116, 9,130, 67,131,174, 7,248, 7, -182,189,114,229,202,247, 42,149, 42,104,239,133,149,239,221,208, 5, 95,172, 1, 0,174,237, 23,120,185,213, 63, 48, 68,244,244, - 41,167,211,233,136,226,197, 6,228,251,218,229, 56,238, 58,128,235,149, 33, 42,159, 74, 29, 50, 70,201,226,149, 43, 30, 60,120, -240,248,111,161, 66, 5,235, 99, 78, 48,229, 63, 77,251, 17, 59,102,195,177,132,112, 25,147,247,202, 16, 6,119,152,214,135, 32, -136,239, 0,144, 28,199,253, 18, 25, 25,121,168, 50, 74, 83, 9,198,246,158, 47,120,215,166,201,159, 27,140, 81, 36,202,107,131, -127, 90,205,120,251,188, 1,254,129, 11, 4, 2,193, 87,122,189,126,127,112,104,208,119,255,132,218,194,147,149,143, 95,167, 60, -120,240,224,193,227, 35, 19,172,127,115,178,250, 28, 7,254,127,250,250, 63, 69,182,237,255,250, 4,203, 19, 44,158, 96,241,224, -193,131,199,167,134,128,175, 2,158, 12,240,224,193,131, 7, 15, 30, 60, 62, 46, 72,190, 10,120,240,224,193,131, 7, 15, 30, 60, - 62, 46,254,149, 24, 44, 30, 60,254,167,110,138,215,251, 43, 17, 0, 56,206,192, 13,194, 43,144,255,191,193,187, 91,121,240,224, - 81, 30,120, 23,225,191, 59,113,147,248, 75, 53,100,141,153,192,121,124,146, 54, 18,224,117,154, 11,134, 32, 8, 6, 0,203,183, -211,127,146, 24,125, 80,158,156,216,252,171,124,159,224,193,131, 71,249,243, 73,101,231, 13, 95, 95,223, 26, 0,168,136,136,136, -152,207,225, 2,124,124,124,110, 87,175, 94,221, 45, 54, 54,150, 38, 8, 2, 4, 65,128, 36,201,210, 77,158,133, 66,225,213,155, - 55,111, 14,249,212,229,108,220,184,177,200,194,194,226,156, 84, 42,109,247,174,239, 57,142, 99,105,154,150,159, 59,119,206,168, -140,233, 4,136,247, 79,113, 0,142, 37, 64,144, 28, 62, 60, 25,167,177, 48, 53, 53,101, 73,146, 36, 72,146, 4, 69, 81,120,251, -239,187, 62,211,233,116,166,207,159, 63, 47,119, 39,241,118, 95,253,106, 14,160, 23,128,187, 4,208, 24, 4,113, 23, 64,227,191, -222,227, 46, 64, 52, 6, 16,122,113,231,140, 87, 21,212, 35, 9, 0,117,103,214,149,185, 62,117,125, 78,145,148, 93,121,231,204, -172,157,105,121,103,217,157,178,101, 98, 99,242,195, 88,126, 40,249,223, 38, 88, 85,170, 84,241,227, 56,110, 45,128,122,111, 17, -238, 39, 36, 73, 78, 77, 78, 78, 14,125, 23,193,226, 21, 44, 30, 60,120,148, 7,131, 10,150,175,175,111, 45, 0,109,139, 95,126, -158,158,158, 78, 26,141, 6,190,190,190, 25, 0,194, 0, 92, 6,112, 37, 34, 34,194,224,190,129,205,154, 53, 75,210,235,245,174, -149, 41,160, 80, 40,204,162,105,218, 41, 34, 34,226,157,233, 18, 28, 28, 28,170,239,217,179,199,230,225,195,135, 48, 49, 49,121, -227, 37, 16, 8,208,188,121,243,230,159, 9,185, 10,113,112,112,104,253,251,239,191,227,193,131, 7,240,245,245, 45,253,158, 97, - 24, 12, 24, 48,128,148,201,100, 18, 0, 70,111, 73,211,172,121,179, 23, 52, 77, 87,170, 62, 69, 34, 81, 54,110,194,182,218,236, -106, 2, 44,131,206, 64,219,155,145, 36, 57, 83, 40, 20,118, 96, 89,182, 30, 0, 8, 4,130, 40,157, 78,119,145, 97,152,229, 17, - 17, 17, 10, 99,207, 75,146, 36,145,149,149,133,125,251,246,193,197,119, 32, 88,144,104, 95, 71, 4,178,120,138, 59,117, 95, 11, -154, 1,158, 93, 92,131,153,211, 3,225,227,227, 3,150,101, 43,236,159, 18,177,248, 18, 8, 52,250,107,166, 36, 74, 88, 83, 25, -105,130, 0, 8,132, 3,104, 90,145,173,134, 63, 54,148, 58, 63,117,142, 23,139,197,214,123,247,238,197,237,240,219,240,168,233, - 1, 90, 79,131, 3, 7,134,101, 48,245,219,169, 16,103,139,229, 0, 84, 31,218, 39, 60, 44,253, 90, 2,248, 26, 64, 38, 94,231, - 65,139,251, 84, 68,195,219,219,251, 70,179,102,205,106,223,187,119, 79,199,113, 92,233,195, 73,201, 3, 11,195, 48,175,246, 94, - 88,233,243, 49,206, 23,224, 31,120, 24, 64,223,226,183,161,193,161, 65, 29,223,215, 86, 59,175,193,102, 2,129, 96,166, 72, 36, -234,160,215,235,235, 21,143, 23, 81, 90,173,246,162, 94,175, 95,126, 57,122,159,209,253,147,227,184, 85,219,183,111,175, 87,181, -106, 85,164,167,167, 35, 51, 51, 19,121,121,121, 80, 42,149,117,182,111,223,190, 1,128, 7, 63, 93,240,224,193,227,163, 16, 44, - 95, 95,223, 99, 0, 58,122,122,122,202,191,248,226, 11,248,250,250,194,221,221, 29, 82,169, 20, 0,144,147,147, 99, 31, 29, 29, - 61, 32, 50, 50,114,192,205,155, 55,225,235,235, 91, 4,224,102, 68, 68, 68,185, 3, 38,195, 48, 78,151, 46, 93,130,153,153,153, - 81,133,203,206,206,198,151, 95,126,105, 85, 92,206,119, 18,172,212,212, 84,246,199, 31,127,204,187,126,253,186,174,120, 98, 32, -202,196,208,128, 97,152,236, 79, 89,193, 4, 65,144,254,254,254,103,139,201, 21, 41, 16, 8,112,247,238, 93,188,124,249, 18,246, -246,246, 48, 49, 49,129, 68, 34,129, 94,175, 7, 77,211,121, 61,122,244, 96,117, 58,157, 81, 74, 22,195, 48, 78, 87,174, 92,129, -137,137,137, 81,101, 97, 24, 6,173, 91,183,182, 4, 0,241, 43,177, 0, 40,159, 96,249,250,250,182, 23,139,197,251,199,141, 27, -103,217,164, 73, 19,129,141,141, 13,104,154, 70,114,114,114,243,219,183,111,251, 30, 60,120,112,172,175,175,239,160,136,136,136, - 75, 70, 18, 44,236,218,181, 11, 63,255,252, 51,186, 46,232,134,181, 95, 89,131, 36, 94,111, 99,148,159,159,143,110,222, 18, 76, -219,171,196,197,125, 7,160, 41, 42, 4, 69, 81,176,176,176,168,208,166, 68, 34,246, 58, 16, 52, 10, 67,103,255,142, 61,203,190, -198,176, 57, 59,177,251,151, 17,165,127,191,154,187, 19,127, 44, 29,129,175,230,238,106,210,111,202, 86,201,225, 53, 99,222, 93, -167,135, 64, 58, 69, 58, 61, 47, 38, 87,132, 68, 34, 65, 65,215,238,120,161, 82,193,252,222, 61,152,218,216, 64,171,123,157,113, -223, 60,203,252,101,247, 30,221,223,165,100, 85, 10,182,182,182,187,143, 28, 57,226, 78,211, 52,190,251,238,187, 64, 15, 75,191, - 30, 49,121, 97, 33, 31,129,184,117, 6, 48,167,248,237, 47, 49,121, 97,231, 12, 14, 2, 2,129,203,198,141, 27, 45,159, 60,121, - 2,145, 72, 4,137, 68, 2,177, 88, 12,177, 88, 12,137, 68,130,142, 29, 59, 50,239, 91,158, 0,255, 64, 91, 0, 91, 0,200, 0, - 76, 6,208,237,220,185,115,160, 40, 10,157, 59,119,246, 15,240, 15,172, 3, 96,133,137,137, 9,167, 82,169, 70, 26,187,161,120, - 59,175,193,237,165, 82,233,254,185,115,231, 90,182,110,221, 90, 96,107,107,139,219,183,111,195,210,210,178,249,213,171, 87,125, -183,109,219, 54,182,157,215,224, 65,151,163,247, 93, 50,178,168,181, 93, 93, 93, 49,111,222, 60,152,155,155,195,218,218, 26, 86, - 86, 86,176,182,182, 70,131,106, 57, 53,230,142,178,201,205,206,167,149,231,238,152,253, 32, 20, 10, 47, 37, 36, 36,188,226,167, - 15, 30, 60,202,199,204,153, 51, 43,115,248, 63,190, 25,243,242,229,203, 63, 43, 5,171,199,197,139, 23, 73,150,101, 97,102,102, - 6,138,162,222,248,210,218,218, 26,109,218,180, 65,179,102,205,208,177, 99, 71, 60,123,246, 76,246,235,175,191,250,251,250,250, -138, 34, 34, 34,202,157,184, 77, 76, 76,112,226,196, 9, 16, 4, 1,129, 64, 0,161, 80, 8,129, 64,240,198,255,101, 63, 43,121, -154, 46, 15, 22, 22, 22,206,167, 78,157, 34, 37, 18, 9,103,106,106,202, 93,185,114,133, 43,110,172,247,142,111,242,245,245,117, - 20,137, 68,203,244,122,253, 0,150,101,197,229, 29, 71, 81, 20, 45, 18,137,142, 21, 22, 22,206,138,140,140, 76,122, 7,185, 34, - 0,144, 50,153,172,253,182,109,219, 32, 16,188,174,238,146,137, 75, 42,149,150,254,181,178,178,194,228,201,147, 49,127,254,124, -210,220,220,220,104, 37, 75, 38,147,225,202,149, 43,160, 40, 10,117, 58,116, 0, 73,211, 72,190,115, 7, 2,185, 28,142,141, 26, -129,208,233,160,140,141,133,208,196, 4, 14, 14, 14,127,107,199,114,174,191,179,139,139,203,145,181,107,215,202, 0, 32, 33, 33, - 1, 98,177, 24, 36, 73,130,227, 56,116,238,220, 89,232,235,235,107,187,112,225,194,147,190,190,190,125, 35, 34, 34, 12, 78,226, - 20, 69, 97,248,240,225, 88,190,124, 57,214, 13,183, 6, 69,190, 38, 87,101,182, 10,194,170, 33,166,104,188, 86,140,121,243,230, -225,244,233,211, 32,201,242,189,160,205,155, 55, 79,170,218, 98,164, 56, 51, 51, 19, 98,145, 8, 25, 25, 25, 16, 11,139,255,150, -121,159,158,158, 14,177, 72,132,228, 91, 91, 83,124,125,183, 58,254, 77, 9, 61, 4, 2, 23, 32,160, 72,202,254,183,223,126,131, - 68, 34, 1, 0, 20, 17, 4, 24, 0,118,118,118,208,112, 28, 36, 18, 9,228,230,114, 4, 6, 6, 98,209,252, 69, 31,172,100,213, -168, 81,163, 74,235,214,173,161,209,104,112,225,194, 5,113,143, 30, 61, 78,121, 88,250,173, 2,176, 49, 38, 47, 44,233, 3,238, -233, 57, 28,199,249,149, 40, 80, 0, 12,182,141, 94,175, 79,153, 48, 97,130, 73, 5, 10, 86,250, 7,148,103,221,137, 19, 39,122, -235,116, 58,140, 28, 57, 50,186, 90,181,106, 2, 43, 43, 43,108,217,178, 5, 86, 86, 86,208,104, 52, 15,131,130,130, 4, 41, 41, - 41, 88,187,118,237,239, 0,186, 24, 65,174, 58, 87,171, 86,237,200,193,131, 7,101, 0, 16, 31, 31,143,228,228,100,156, 63,127, - 30,131, 7, 15, 70,255,254,253,133,173, 90,181,178,253,246,219,111, 79,182,243, 26,220,247,114,244,190,115,198, 20,212,210,210, -146,153, 61,123, 54, 37,151,203,223, 80,194,239, 93,152, 77, 44,157,230,100,177,118, 63, 97,238,227, 63,105,246,230,205,155, 91, - 86,171, 86,237,231,115,145, 59, 83,248,105,148, 7,143,143,142,178,100,235, 31, 39, 94,159,138, 96,233, 77, 77, 77, 69,145,145, -145,224, 56, 14,166,166,166,176,176,176,128,133,133, 5, 20, 10, 5, 30, 63,126,140, 39, 79,158, 32, 33, 33, 1, 4, 65,160,122, -245,234,165, 98, 69, 5,106, 78,233,100, 75,179, 4, 66, 30,229,129,227, 88,244,107, 94,245,157,228, 74, 40, 20, 26,188,128,203, -151, 47,235,167, 15,119,186, 65,107,149,118,140, 94,123,245, 50,199,141,244,245,245,189,109,103,103,231,234,237,237,205,148,156, -179, 50,113, 89, 66,161,112,197,248,241,227, 7, 13, 28, 56,144, 44, 33, 69, 37, 10,144, 70,163,129, 78,167, 3, 77,211, 40, 42, - 42, 18, 30, 62,124,184,223,169, 83,167,228, 0,186, 85,164, 28, 61,122,244, 8, 15, 30, 60, 0, 73,146,176,178,178,130,185,185, - 57,100, 50, 25,100, 50, 25,196, 98, 49,228,114, 57,164, 82, 41, 72,146,132, 90,173,206,235,220,185, 51,155,157,157, 45,143,136, -136, 48, 72,180,132, 66,225, 27,215, 87, 82,127,101, 20, 10,163,200,106, 49,185, 50, 23, 10,133,123, 86,173, 90, 37,203,204,204, - 68, 76, 76, 12,188,188,188, 48,103,206, 28,168, 84, 42,172, 89,179, 6,233,233,233,176,180,180,196,220,185,115,101,223,127,255, -253, 30, 95, 95,223,234, 17, 17, 17, 5,134, 20,172,237,219,183, 67,175,215,163,132, 55,105, 52,154, 82, 66, 83,122,103,113, 28, -230,207,159, 15,138,162, 42, 44, 47,195, 48, 78,118, 54,150, 56,126, 41, 10, 34,145, 16, 39,175, 60,134,176,228,175,176,236,251, -104, 72,196, 34,112, 44, 99,249, 78, 37, 52, 26, 4,210, 65, 1, 64, 68,100, 4,148, 95,118, 67,161, 86, 11,211,131, 7, 97,238, -225, 1,212,168, 1, 91,173, 22, 5, 47, 19, 33,151,203, 75,203, 91,162,100, 41,108, 21,230, 88, 9, 69,101,111,188,146,107, 27, - 63,126, 60,102,206,156,137,208,208, 80,225,181,107,215,102,245,235,215,175, 13, 0,163,221,218, 30,150,126,222,246,246,246, 59, -106,215,174,221, 16, 0,252,252,252, 42, 85,142,216,252,171, 56,112,121, 77, 75, 0, 56,250,253,230,121, 78,213,253,126, 76,140, -189, 38,120,107,175,108,251,125,179,253, 56, 0, 32, 9,232, 69, 2,252,218,251,231,176,239,141, 60,133,248,241,227,199, 48, 53, - 53,197,230,205,155, 5, 54, 54, 54, 8, 15, 15,135, 72, 36,194,176, 97,195,208,176, 97, 67,129,137,137, 9,174, 94,189,138,252, -252,124, 99,148, 43,115,177, 88,188,103,223,190,125,178, 57,115,230,160,113,227,198,240,244,244, 4, 65, 16,232,219,183, 47, 56, -142, 67, 94, 94, 30,236,236,236,176, 98,197, 10,217,232,209,163,247,180,243, 26, 92,253,114,244,190, 2, 67,131,186, 86,171,229, -164, 82,105,233,131,143, 68, 34,129, 72, 36, 66,102, 62,201,205, 89,157,157, 79, 8,172,201, 30, 95, 54,168, 57,105,210, 36,114, -193,130, 5,254, 0,126,231,231, 66, 30, 60, 62, 58,136,255,202,133, 8, 12,176,200,210, 73, 79,161, 80, 64,161, 80, 32, 57, 57, - 25,155, 55,111, 46,157,180, 75,136, 80,241,222,114, 70, 65, 40, 20,226,113,114, 17, 8,146,128, 90,195,225,234,147, 12,116,109, -226,254, 78,146,101, 12, 90,181, 15,240,234,237,245,204,124,194, 47, 33, 28,240, 58, 46,235,216,177, 99, 54, 49, 49, 49,144, 74, -165,165, 68, 70, 42,149, 66, 40, 20, 26,140,203, 98, 89,182,207,128, 1, 3,200,144,144, 16,232,245,122, 8, 4, 2,136, 68, 34, -136, 68,162, 55,254, 23,137, 68,232,209,163, 7,121,228,200,145, 47,218,181,107, 39,184,124,249,178,254, 45,178,192, 17, 4,193, - 18, 4, 1, 95, 95, 95,100,101,101, 65, 36, 18,193,204,204, 12, 22, 22, 22,144,201,100,165,238, 24, 19, 19, 19, 72,165, 82, 56, - 58, 58, 98,204,152, 49,248,241,199, 31, 73,161, 80,104,148,146,229,217,174, 93,169,114, 69,201,100,112,242,241, 41, 85,174, 4, -114, 57, 36,238,238, 32,116, 58,112,106,181,193,186,164, 40,106,198,168, 81,163,204, 5, 2, 1, 98, 99, 99, 33, 22,139,161, 82, -169,208,171, 87, 47, 40,149, 74, 48, 12, 3,177, 88, 12,189, 94,143,170, 85,171,162, 67,135, 14,166, 33, 33, 33, 51, 0,204, 51, -164, 96,141, 26, 53, 10, 27, 54,108,192,196,223,115,176,241,107,235,191, 29, 51,121,183, 18, 0,240,211, 79, 63,225,242,229,203, - 6, 9, 97,223,142, 13,113,226,242, 35, 84,115, 52,193,139,244, 34,212,172, 98,134,196, 12, 13, 60, 93, 45,145,156,169, 69,109, - 55,107,164,228,232,208,179, 93, 29, 68,157, 47,199,136, 23, 56,164,130, 65, 58, 80,207,171, 30, 18, 4, 2, 48, 90, 45,204,220, -220, 96,107,107, 11,113,241,221, 46, 17, 73, 96, 98, 98, 2,153, 76,246,134,146, 37,209, 72,228,192,123, 17, 44, 2, 0, 82, 83, - 83,209,174, 93,187,248,177, 99,199, 86,247,241,241, 1, 73,146,226, 74,144,171, 70,117,234,212,185,124,241,226, 69, 51, 7, 7, -135, 18, 55, 51,148, 74, 37, 6, 13, 26, 4, 0, 7, 43, 83, 38,150, 67,224, 87, 83, 47, 8,112,175, 23,192,234,202, 27, 20, 4, -191,238,190, 52, 21,128,177, 4, 43,240,187,239,190,235,214,165, 75, 23,129,133,133, 5,196, 98, 49, 74, 72,140, 84, 42, 69, 74, - 74, 10,244,122, 61,246,239,223,207, 1,152, 98,112,192, 18, 8,102,204,156, 57,211, 92, 40, 20,162,118,237,218,152, 58,117, 42, -246,238,221, 11,103,103,231,215,182,117,151, 64,234, 36, 96,152,206,168, 85,171, 22,122,244,232, 97,122,244,232, 81,131,253, 19, -192, 3,141, 70,211,184,228,158, 44, 41, 31, 0, 68,189,176,140, 58,118, 33,174, 97,213,170, 85,235, 90,184, 93,221,209,182,109, -219,134, 54, 54, 54,205,218,121, 13,222,249,234,213, 43,126, 37, 33, 15, 30, 70,240,136,119, 16, 39,206,128,130,197,189,117, 28, - 97,192,102,217,223, 17, 70,156,255,147, 18,172, 74,161, 50, 4, 75, 32, 16, 32, 49, 71,131,198,213, 44,193,113, 64,200,131, 20, -244,108, 81,243, 13,114, 5,130, 52, 74,193, 2,128,115, 39,183, 20,221,184,192, 22,177, 12,151, 14, 0,105,105,105,220,210,165, - 75, 21, 33, 33, 33,218,183,230, 51,112, 28, 71, 24,138,203,226, 56, 78, 32, 16, 8, 64,211,244,223, 86,185,181,111,223, 30, 87, -175, 94, 45,253,172, 88,209, 32, 81,126,156, 24, 87, 76,218, 96,111,111, 15,177, 88,140,178,131,120, 73,172, 75,137, 58, 82,118, - 96, 55,246,250,203, 42,131,101,127, 83, 25,229,170, 12,249,245,111,210,164,137, 32, 62, 62,190,148, 68,234,245,122,180,107,215, - 14, 4, 65, 32, 45, 45, 13, 98,177, 24, 34,145, 8, 4, 65,160, 73,147, 38,162,107,215,174,249, 27,154,192, 72,146,196,166, 77, -155, 64,211, 52, 0, 96,210, 31, 74,172,255,202, 20, 26,141,166,244,125,201,113, 63,252,240, 3, 72,146,172,208, 69, 8, 0,173, - 27,185,131, 83,165,148,182,145, 64, 32,120,231, 95,107,107,107,148,235, 45,238, 15, 14,128, 30,187, 95,247, 97,243,240,112,216, -218,218, 2, 46, 46,144,104,181,144,169, 84,200, 40, 40,128,165,133, 89,105,187,149, 85,178,140,113,185, 86, 68,176, 56,142, 67, -102,102,102,131, 69,139, 22,181, 2,224, 10,192,168, 56, 44, 15, 75, 63,135, 18,114,197,113, 28,186,117,235,134,169, 83,167,162, - 73,147, 38, 80, 40, 20,152, 62,125, 58,242,242,242, 54,244,247,251,118,213,163, 71,143,102,198,228,133,173, 53,100,147, 36, 16, -244,199,234,142,239, 82,176,202, 30,163, 23, 9,176,218,152, 50,150, 4,180,215,175, 95, 31,147, 39, 79,198,129, 3, 7,176,123, -247,110, 48,204,235,144,174, 62,125,250,160,127,255,254,200,203,203,131,163,163, 35,145,156,156, 28, 19,224, 31, 88, 97,224,187, - 88, 44,246,111,221,186,181, 32, 49, 49, 17, 45, 90,180,192,152, 49, 99, 48,106,212, 40, 28, 63,126, 28, 54,146, 88, 68, 93,159, -131, 90, 77,191,131,180,184,127,182,110,221, 90,116,254,252,121,131,253, 83, 36, 18, 77,237,216,177,227,114,142,227,234,189, 53, - 16, 71, 83, 20, 53, 11, 0,146,146,146, 30,247,236,217, 51,193,223,223,223,183, 70,141, 26,118, 89, 89, 89,130,216,252,171,244, -187,236,241,171, 11,121,240,248,155,123,175, 34,215, 31, 87,142,146, 85,145,141,202,158,227,179, 82,176, 12, 78,232,111, 19, 44, - 99, 67,158,210, 21, 12,244, 12,135,154, 78,230,160, 40, 1, 78,132, 39, 34, 37,187, 16, 30,174,182, 16, 8, 4,248,243,250, 51, -252,126, 42, 28, 53, 93,108,192,146, 34,128,169, 88,121,217,114, 88,233, 84,246,189,153,153,153,211,193,131, 7, 63, 40, 46,171, - 36, 70,140,162, 40,244,236,217, 19,167, 79,159,134, 80, 40, 4, 65, 16,160, 40, 10,190,190,190,165, 46, 63, 3,100,141,235,222, -189, 59,244,122, 61,204,204,204,254, 22, 68, 92, 18,219, 84, 18,236, 94,162,180, 85,134, 96,165,132,135,131,162,168, 82,229, 74, - 17, 19, 3,161,137, 73,169,114, 69,101,102, 66,100,106, 10,226, 45,119, 92, 57, 68,185,158,173,173, 45,146,147,147, 75,137,148, -179,179, 51, 38, 77,154,132,194,194, 66,236,216,177, 3, 5, 5, 5, 16,139,197, 16, 10,133,168, 89,179, 38,180, 90,109, 61, 35, -148, 49,140, 27, 55, 14, 59,118,236,192,197, 95, 90,128,162, 40,212,253,149, 44, 37, 82, 37, 4,150, 36, 73, 44, 94,188, 24,237, -219,183, 55,138, 24, 10,133, 66,236,218,181,171,180,205, 74,108,148,188,190,253,246, 91,195,253,178, 63, 88,236, 6, 88,142, 45, -117,133, 51,197,119,102,137,171,146,162,168, 82,119,110,137,146,245,177, 8, 22, 0, 93, 76, 94,216,249, 74,154,248,114,206,156, - 57,102, 44,203,162,125,251,246,248,230,155,111,208,184,113, 99,172, 91,183, 14,215,175, 95,199,182,109,219,176,119,239, 94,232, -245,122, 81,231,206,157,103, 2, 48, 72,176,250, 44, 14, 91, 4, 96, 81,179, 50,159, 13,104, 59,249,111, 43, 12, 9,130, 24,121, -180,211,204,145, 44,203, 26, 90, 93,216,237,220,185,115,176,177,177,193,157, 59,119, 74,251, 53, 0,105,112,104,144,230,194,222, - 40, 90, 42,149, 10, 52, 26, 13,126,253,245, 87, 72,165, 82,244,235,215,207, 63,192, 63, 80, 18, 28, 26,244, 78,229, 86,167,211, -213,123,245,234, 21, 78,159, 62,141,238,221,187, 99,244,232,209, 72, 78, 78,198,144, 33,131,176,112,116, 33,106,122,250,193,170, -218,104, 16,228,235,135, 11, 47, 47, 47,104, 52, 26,131,253,243,197,139, 23,225, 0, 12,250, 87, 75,250, 82,101, 30, 90,120,240, -224, 21,172,127, 13,196, 59, 8,218, 39, 81,175,254,117, 5, 75, 32,150, 34,238,101, 54,238,167,168, 80,219,217, 12,114,169, 24, - 2,129, 0, 53,157,173,240,232, 69, 54,188,170, 57, 34, 51,191, 8,193, 33,247,241,221,136,142, 56,114,249, 1,138,204, 61, 73, -105,246,253, 10,237,206,252,198,229, 46,173, 41,176,162,181,154, 91, 27,142,232,134, 42, 20,138,240,154, 53,107, 58, 39, 37, 37, -233, 21, 10, 5,124,124,124, 74, 7,197, 38, 77,154,128,162,168, 91,183,110,221,234,103,140,210,214,191,127,127, 28, 59,118, 12, -125,250,244,193,249,243,175,231,192, 38, 77,154, 32, 58, 58, 26,114,185,220, 40, 18, 84, 28, 40, 12,169, 84, 10,145, 72, 84, 26, -228, 46, 22,255,229, 13, 42, 81, 69, 74, 84, 18,130, 32,140,182, 93, 66, 4,203, 83,174, 42,227,110, 5, 0,154,166, 33, 18,137, -192,113, 92, 41,201, 82, 42,149,200,207,207, 47, 45,127,201, 95,157, 78,103,148, 77,138,162,176,110,221, 58,208, 52,141, 14,115, -110,130,164, 68, 88, 61,196, 20,130,226, 98, 79,219,171, 4,205, 0,247,183,117,199,156, 57,115,222,136, 41, 51,212, 70,163, 71, -143, 46, 85,172,222,165, 98,149,157, 24, 43, 30, 9, 56, 56,120,214, 6,138,138, 32, 81,171, 1,137, 4,180, 68, 2, 27,173, 22, - 92, 97, 65,105,156, 92, 73, 27, 1, 0, 37,160, 62,108,244,121, 93,174,247, 25,132,142,206,154, 53,107, 44, 77,211,117,155, 52, -105, 34, 27, 51,102, 12,146,147,147,177,106,213, 42,117, 78, 78,206,154, 47,190,248, 98,172,169,169,169,165, 74,165, 82, 38, 36, - 36, 44,125,223,242, 81, 20,229,178,113,227, 70,203, 7, 15, 30,148, 42,172, 37, 15, 1,221,186,117, 51,184,186,144,101, 89,108, -220,184,177,212, 53,248, 46,130, 92,214,101,104, 76,155,215,173, 91, 23, 38, 38, 38,224, 56, 14, 52, 77, 99,217,178,101,232,223, -171, 45,206,220,164,176,246,155, 13, 32, 41, 33,132, 66, 33,118,236,216, 81, 54, 54,180, 92,184,186,186,250, 49, 12,243,118, 14, -172, 39, 36, 73, 78, 77, 73, 73, 9,173,232,183, 37, 74, 21,159,209,159, 7, 15,131,132,231, 83,158,255,147,168, 89, 6,103, 93, -146, 36,193,178,172,193, 73,222, 16,193, 34, 0, 98,114,239,111, 5,235,143,220, 68, 53, 59, 41,154,215,178, 41,117, 9, 54,172, -110,143,147,183,159, 99, 88, 39, 33,206,221,121,142, 70,158, 85,208,165,133, 23, 26,122,184,162,207,248, 72,131, 23,209,194,111, - 96,205,226, 24, 44, 6, 0, 28, 29, 29, 93, 14, 30, 60, 88, 81, 12, 86, 35, 67, 54, 53, 26,205,235, 96,233,147, 39,209,169, 83, - 39, 92,190,124,185, 84,181,120,252,248, 49,188,189,189, 17, 19, 19, 99,180,202,196,178,236, 27,196, 74, 36, 18,189,241,189, 92, - 46, 7, 69, 81,165, 1,182, 0,254,118, 76,121, 40, 89, 45,168,136,137,129, 64, 46,135,180, 90,181, 82,229, 74,104, 98, 2,141, -165, 37,180, 90, 45, 44,140,136,193, 18, 10,133,143,147,147,147,155,154,153,153, 65,163,209,148,198,157,149, 37, 52, 37,229, 23, -137, 68,136,143,143,135, 68, 34,121,108, 76, 63,250,246,219,111,177,127,255,126, 0,192,234, 33,166, 48,145,191, 94, 69,168, 86, -171,177,106,136, 41,166,237, 85,130, 36, 73, 44, 93,186, 20,157, 58,117, 50,234,218,133, 66, 33,126,251,237, 55,112, 28,247,134, -114, 85,162,102, 77,155, 54,173,116,245,163,145,140,231,181,202,154,158, 14, 78, 44,134, 53,199,129, 40,238,227, 37,109, 84,162, -100,189,143,130,229, 97,233, 39, 4, 80,189, 77,155, 54, 68,153, 7, 19,182, 18,191,159, 88,183,110,221, 57, 82,169, 52, 41, 61, - 61,125,175,163,163, 99,224,154, 53,107,170, 38, 38, 38,194,220,220, 28,103,206,156,145,126,251,237,183, 83,194,195,195,251,198, -228,133,157,253,208, 1,130, 97,152,148, 9, 19, 38,152, 68, 70, 70,254,109,133, 33,203,178,134, 86, 23,158,251,242,203, 47,123, -154,155,155, 99,228,200,145,144, 74,165,232,219,183, 47, 44, 44, 44,212, 87, 14, 62, 67,227,198,141, 33, 16, 8, 32,149, 74, 49, -125,250,116,196,197,197, 1,192,185,242,212, 43, 0, 16,139,197,143, 19, 19, 19,155,202,229,114,232,116,186,210,251,239,228,217, -203, 32, 9, 14,164,208, 2, 66,161, 16, 34,145, 8,223,126,251, 45,194,194,194, 32,149, 74, 31, 27,184,198, 21,219,183,111,175, -103,111,111,143,151, 47, 95, 34, 55, 55, 23, 74,165,178,206,250,245,235,215, 40, 31,172,172,203,106,115, 9, 82,100,193,213,239, -189,161,214, 55, 35, 71,186, 50, 12,195, 38, 36, 36,100,163,156,212, 49, 60,120,240,248,155,130,244, 54,225, 33,140,124,176,124, - 91,133,122,251,119,132,145,234,217,103,167, 96, 61,139,136,136,104,208,176, 97, 67, 36, 38, 38,150,187,194,167,100, 73,243,243, -231,207,193,113, 92, 2,202,201,173,196, 1, 92,243,195,171,244,151,175, 92, 17, 60,123, 18,253,134,226,224, 93,211, 17, 7,174, - 68, 99, 79,200, 3, 92,138,140,199, 79,163, 59, 67, 40, 20,162, 90, 21, 59,152,230, 71,177,134, 30,147,207,157,216, 84,112,237, - 60,167, 98, 89, 46, 5, 0,210,210,210,216, 69,139, 22, 41,207,159, 63,175, 45, 89,106, 94, 50,201, 23, 15,168,169, 6, 8,163, - 94,161, 80, 8,196, 98, 49, 8,130,192,245,235,215, 33, 20,190,126, 42,126,252,248,245, 42,181, 23, 47, 94, 64, 36, 18,149, 40, - 56,172,161,193,150, 32,136,210,152,171,119,145, 50,185, 92, 94,122, 76, 9,193,170,140,234,244, 49,148, 43, 0,208,233,116,161, -225,225,225,141,186,119,239, 46,204,206,206,134, 72, 36,122,131, 68,144, 36,249, 6,193,186,121,243,166,182,168,168, 40,212, 24, - 5,107,213,170, 85,208,233,116,165,105, 26, 74,226,175, 74,114, 97,173, 26, 98, 10,255,157, 34,204,156, 57,211,104, 82, 36, 16, - 8, 48,126,252,248,119, 42, 87, 37,255, 27, 75,130, 72,146, 68, 97,198, 43,136,197, 98, 88,151,180,145,230,175, 76, 12, 37, 4, -187, 68,201, 2, 0, 1,101,124,253,122, 88,250,117,179,179,179, 91, 51,104,208,160,106, 45, 90,180, 64, 94, 94, 30,212,175, 73, -175,209, 55,127,181,106,213,190,143,140,140,116,204,205,205,173,114,242,228,201,150,246,246,246,144, 72, 36,232,221,187,119, 33, -199,113,228,234,213,171,165, 91,182,108,145,206,154, 53,107, 27,128, 42,134,236,149, 77, 52, 26, 25, 25,169, 99, 89,182, 52, 61, - 3,203,178,175, 14, 94, 89, 91,236, 2, 12,168,244,224, 18, 28, 26,212, 43,192, 63,208,157, 97,152, 88,111,111,111, 65, 74, 74, - 10,122,247,238, 13,153, 76, 86,122, 63,209, 52, 13,157, 78,135,228,228,100, 14,128,103,112,104, 80,172,129, 7,159,208,176,176, -176, 70, 1, 1, 1,194,252,252,252, 82, 59,148, 64, 84, 74,172,202,254,189,116,233,146,182,176,176,208, 80,255,244,114,113,113, -193,252,249,243, 97, 99, 99, 3,123,123,123,212,168, 81, 3,245,221,179, 61, 22,173, 93,146,171, 82, 83,218, 87,133, 77,175,143, - 25, 51,186, 74, 27,191,182, 13,158, 60,121, 18,159,145,145,113,231,114,244, 62, 62,192,157, 7,143,114, 80,156,119,138,120, 15, -117,139,168,228,251,202, 30,247, 89, 16,172, 94, 19, 38, 76,216,212,174, 93,187,206,179,102,205,130,153,153, 25, 82, 83, 83, 75, -149, 42,145, 72, 4, 87, 87, 87,104, 52, 26, 92,189,122, 21, 57, 57, 57, 97, 0,198, 70, 68, 68,148,251, 52,206,232,105,136, 4, -111, 78,130,175, 93, 4, 2,124,219,183, 5,214, 29,190,137,222,126,245,209,196,203,189, 82,228, 96,203,145,194,170,101,223,223, -187,119,207, 30, 0, 22, 46, 92,248,126,149, 34, 16, 28, 59,116,232,208,192,206,157, 59,147, 20, 69,129, 97,152,210,201,190,108, - 32,190, 70,163,193, 31,127,252,193,201,100,178,144,183, 87, 16,190, 69, 46,232,128,128, 0, 97, 73, 76,136, 92, 46, 47, 85,213, - 74,148, 53, 43, 43,171, 82,130, 85, 66, 8,140, 81,199,104,154,126,189, 90,176,204,138, 78, 42, 51,243,141,149,152, 37,202,149, - 49,238, 23,134, 97,150, 31, 62,124,120, 92,147, 38, 77,172,173,173,173,193, 48, 12, 8,130,128,157,157, 93, 41, 89, 41,113, 15, - 70, 71, 71, 35, 36, 36, 68, 69,211,180,193, 12,110, 37,106,210,177, 99,199, 80, 54,108,173,132, 92,149,144, 74,150,227,176,124, -249,114,116,235,214,205, 40,229, 84, 32, 16, 96,235,214,173,111, 40, 88,101, 99,177,102,205,154,101,108, 63,226, 38,140,155, 64, - 0,128,135,151, 71, 41,137, 42,187,108,223,202,202, 10, 36, 73,150, 42, 89,149, 81,176, 60, 44,253,190,236,213,171,215,201,109, -219,182,193,218,218, 26, 42,149, 10,113,113,113, 37,253,202, 6, 64,134, 49,118, 18, 18, 18,214,245,232,209, 99,113,175, 94,189, -136,142, 29, 59, 66, 38,147,225,135, 31,126, 64,116,116,244,104, 0, 15,142, 31, 63,254,100,204,152, 49,168, 86,173,154,115, 37, -250,187,203,198,141, 27, 45, 99, 98, 98,222,136, 13,236,213,171, 23,243, 17,198,152,160, 21, 43, 86, 8,228,114, 57,180, 90, 45, -242,242,242,160,213,106, 75,235,181,176,176, 16, 46, 46, 46,152, 51,103, 14,177,112,225,194, 53, 48,144, 7, 75,175,215, 47,223, -177, 99,199, 56, 63, 63, 63,107, 7, 7, 7,176, 44,251, 6,161, 42,251,255,253,251,247,113,252,248,113,149, 78,167, 51,212, 63, - 9, 39, 39, 39,246,251,239,191, 39,205,204,204, 96,102,102, 6,115,115,115,220, 56, 57,133,252,117,186,147,249,186, 3, 4, 70, -246,156,223,135, 97, 24,246,201,147,167,241, 27, 55,110,188, 33, 20, 10, 47, 86,100, 48, 54,255, 42, 31,232,206,131,199,255,115, -148, 59,243, 68, 68, 68, 36, 2,232,226,235,235, 59,232,250,245,235,171,166, 78,157,234,208,182,109, 91,228,228,228,192,213,213, - 21,206,206,206,136,136,136, 64,100,100,100, 14,203,178, 51, 1,236,140,136,136, 48,248, 68, 87, 50, 41,190,157,230,193,199,211, - 5,123, 22, 12,169, 84,146,209, 18,188, 29,131,229,227,227, 19,233,234,234,234,156,148,148,164, 47,171, 96,149,252,111, 40, 6, - 75,173, 86,207, 56,120,240,160,112,247,238,221, 61, 89,150, 21, 86, 64,156,244, 82,169,244,172, 90,173,174,112,121,249,177, 99, -199, 68, 0,208,179,103, 79,110,244,232,209,176,180,180, 44, 87,201, 42, 81, 70,140,141,193,138,137, 10,193,198,237,167,192,178, -220,223, 2,188,223,126,245,235,103, 48,236, 12, 17, 17, 17, 5,190,190,190, 35, 22, 45, 90,180,255,251,239,191,151, 87,173, 90, - 21, 58,157, 14,235,215,175, 7,203,178,165,113, 89,209,209,209,152, 62,125,122,161, 90,173, 30, 97, 40, 7, 86, 9, 17,249,245, -215, 95,161,215,235, 75,211, 52,148, 36, 26,149, 74,165, 80,171,213,152,117,232,245,170,205,233,211,167,131,162, 40,131, 10, 22, - 77,211, 16, 10,133,152, 60,121,114,133,171, 8,141, 33, 88, 39, 79,156, 20, 1, 64,247, 30,221,233, 81,163, 70,193,206,206,174, -220, 54, 42, 81,178, 42, 67,176, 0,124,179,126,253,122, 88, 91, 91, 35, 59, 59, 27,113,113,113, 8, 15, 15,199,131, 7, 15,158, -198,228,133,101, 24,107, 36, 38, 47,108,169,135,165,223,174,115,231,206,245,149, 72, 36, 3,237,236,236, 92,146,147,147,247,196, -228,133,237, 3,128, 85,115,247,129,166,233,210,149,122,198,160, 36,209,232, 59, 20,172,244,143, 48,198,104, 79,158, 60, 9,115, -115,115, 28, 60,120, 80,111, 99, 99, 35, 8, 10, 10, 42,117, 11,198,199,199,235,167, 78,157, 42, 40, 78, 56,171, 53,100,236,114, -244,190,130,118, 94,131, 71,124,251,237,183,251, 87,175, 94, 45,175, 81,163, 6, 8,130,192,239,191,255,142,177, 99,199,190, 65, -174,190,249,230,155,194,162,162,162, 17,198,228,192,210,235,245, 92,217,197, 39, 34,145, 8,217, 5, 36,247,221,154, 44,133,178, -136,210, 92, 95,182,236,118, 98, 98, 98,238,171,212,180, 59, 66,161,240,194,139, 23, 47, 18,249,184, 43, 30, 60,120,188,175,130, - 85, 50,225,238,247,245,245, 61,183,124,249,242,165, 71,143, 30, 29, 59,101,202, 20,194,202,202, 10,135, 14, 29, 66, 78, 78,206, -110, 0,211, 35, 34, 34,178,140, 61, 97, 70, 70,198,107,149,165,140,130,245,118,238,171,202,166, 22,248,216, 49, 88,145,145,145, -169, 0,250,127,244,202, 22, 8,232, 73,147, 38, 9,133, 66, 33, 26, 54,108, 88,234, 50, 44, 73,106, 40, 22,139, 97,105,105, 89, -234,202, 52, 68,176, 68, 98, 81,162,151, 99,100,141,222,189,122, 0,132,160,116, 98, 44,187,225,117,217, 87, 81, 81, 17, 72,146, - 84, 2, 64, 81,237, 34,186,130, 54, 63,229,235,235,219,127,206,156, 57,123, 58,117,234, 36,111,214,172,153,184,122,245,234, 16, -137, 68, 72, 76, 76,196,213,171, 87,181,103,207,158, 45,212,104, 52, 67, 35, 34, 34,140,138,243, 33, 73,178,212,245,231, 92, 93, -140,223,175,170, 75, 93,132, 0,176,254,130, 26,213,237, 41, 80,245,234, 98,249,178,165,232,221,187,183,193, 62, 64,211, 52, 28, - 29, 29, 75,137, 95,217, 24,161,178, 4,171,146,113, 82,220,204,105, 51,141, 82,178, 42, 73,176,164,193,193,193,232,213,171, 23, - 30, 61,122,132, 99,199,142,225,200,145, 35,207,105,154,174,180,239, 45, 38, 47, 44, 21,192,186,226,215, 27, 72, 79, 79, 47,212, -233,116,242,212,212, 84,218, 24, 91,101, 19,141, 2,131,255,246,253,192,118, 83, 74,221,135, 37,245,107,196,234,193,178,248,246, -244,233,211, 34, 20,111,149,147,158,158,254, 72, 44, 22,139,165, 82, 41,146,146,146,192,178,108,131,160,160,160, 21,120, 29, 90, - 48,206, 24,131,151,163,247,157,106,231, 53,184,255,215, 95,127,189,167,111,223,190,242,182,109,219,138, 61, 61, 61,161, 84, 42, -113,255,254,125,132,132,132,104,143, 29, 59, 86, 88, 84, 84, 52,244,114,244, 62, 99,250,103,180, 78,167,243,182,182,182,134, 80, - 40, 44, 85, 83, 31, 38, 88, 62,253,125,201,136,122, 28,173, 34, 8,161, 12,178,154, 75, 88,129,121, 77,163,219,169,132,128,241, - 74, 22, 15, 30,255, 63, 65, 84,102, 55, 25, 95, 95,223,230, 4, 65,156, 0, 32,229, 56,174,103, 68, 68,196,197,202,156,172,101, -203,150, 73, 90,173,182,178,155, 19,103,233,116,186,114, 55,123, 6,128,177,125,229, 73,114, 49, 71, 21,105,232,152,205, 71,233, - 14, 62, 62, 62, 25, 93,187,118,149,150, 23,131,165,211,233, 98,238,222,189,219,234, 83, 85,122,247,238,221,185,117,235,214,193, -218,218,186, 92,149,164, 87,175, 94,112,112,112,176,220,178,101, 75,254, 59, 27, 14, 4,217,160,125, 3, 7, 19,218,228,186, 70, -173,113, 55,106,134,151, 74, 95, 21,162,176,125,228,181,200, 88, 2, 4,201,129, 99, 13,180,183,149, 80, 40,156, 46,145, 72, 58, -106, 52,154,186,197, 54, 30,171,213,234, 11, 52, 77,175,140,136,136,200, 53,246,154, 27, 54,108,200, 82, 20, 69,148, 77,201,240, -174,191,101,255, 87,171,213,166, 33, 33, 33,170,143,209,151,202,235, 71, 4, 8, 18,239,216,125,160,123,143,238,244,242, 85,203, - 43, 84,178,250,246,236, 11,251, 58,246, 78, 51,231, 12, 75, 51,166, 12, 30,150,126, 19, 1,116, 7,144, 10, 32, 2,192,182,152, -188, 48,250, 99,246, 45, 15, 75,191, 9,181,107,215,254,238,233,211,167,191, 26,147,251,202, 16,134,116,156,158, 28, 30, 30,238, -146,144,144, 80,186,202,181, 71,143, 30,169,191,157, 92,236,252, 62,246, 2,252, 3,255, 4,208,179,248,237,185,224,208,160, 46, -239, 91,182,118, 94,131,173,132, 66,225,116,153, 76,214, 81,173, 86,215, 45, 86, 23, 31, 23, 21, 21, 93,208,233,116, 43, 47, 71, -239, 43,183,127, 22,147, 30, 2,120,255, 85,132,177,249, 87,185,202,174, 34,228,201, 22, 15, 30, 60,193,226,241, 15,162, 91,183, -110, 58,146, 36,133, 6, 8, 1,235,224,224, 32, 95,191,126,189,166, 60,130,245,190,231,231,192,177,198, 16,172,183,200, 22, 81, -172,110,253,167, 58, 76, 5, 4, 75, 7, 3, 65,146, 4, 65,192,178,137,165,249,119, 19,191, 81,252, 87,251,234, 71, 80,176,254, - 21,180,243, 26, 76, 20,171, 91,255,106,255,124,159, 52, 13, 60,201,226,193,131, 39, 88,149, 30, 56,120,252,239,129, 31,236, 63, - 46,254, 87,239, 23,190, 31,252,123,237,206,215, 53, 15, 30,255, 63, 64,242, 85,192,131, 7, 15, 30, 60,120,240,224,241,113, 33, -224,171,128, 7, 15, 30,188, 82,253,126,120, 31, 53,234,191, 92,215,188, 58,199,131,199, 95,224, 21, 44, 30, 60,120,240,224,193, -131, 7, 15,158, 96,241,224,193,131, 7, 15, 30, 60,120,124,222,248,215, 92,132,181, 44,218,124, 16,153,139,205,191,202,254,155, -118, 43, 66, 59,175,193, 50,142,227,122, 11,133,194,225,214,214,214, 77, 51, 51, 51, 23, 92,122, 28,188,234,115,104,208, 9,253, - 22, 46,164,105,122, 46, 73,146, 2,177, 88,204,152,153,153, 5,253,188,117,210,172, 10,174,255,179,237,156, 21,185, 27,254,173, -114, 15,238, 48,237, 48, 65, 16,125, 1,128,227,184,208,125, 23, 87,117,252,216,231,216, 63,199,111,164, 88, 68,125,201,114, 32, -117, 58,230,242,224,101, 31,158, 94,225,191,136, 15,117, 63,241,110, 80, 30, 60,120,124,150, 4,107,108,239,249, 2,117, 97,214, -124,129, 64,216,137,162, 96,195,178,108, 14, 77,115,161,174,110,158,243,127,222, 58, 73, 87,217, 19,143,233,222, 93,146, 24, 29, -189,133,147, 74,253,181, 34,145, 13, 71, 16,144,104,181, 57, 68, 81,209,229, 42, 78, 78, 99,118,220,184, 81,104,172,173,150, 45, - 91,198,208, 52,237,102,244, 69, 11, 4, 25, 35, 70,140,112, 31, 51,102, 76,165,183, 2,105, 95, 55, 96, 64,149, 42, 85,118, 52, -111,222, 92,238,237,237, 13,177, 88,140,101,203,150, 77, 7, 96, 52,193,242,232, 61, 95, 96,159,103,253, 21, 37, 20,246,224, 56, -174,225,235,125,190,169, 7, 44,173, 59,149, 97,149,189, 51,230,216, 79, 70,111, 34,219,175,182,159,159, 72,136,175, 25, 22,135, - 40, 7,159, 72, 71, 71,199,121,251,247,239,135,141,141, 13, 10, 10, 10,168, 73,147, 38,205, 12,240, 15, 92, 31, 28, 26,148,108, -220, 36,230, 71,236,152, 13, 71, 0,248,102, 25,210,220,221,221,204,105,154, 30,204,113, 92, 0, 0, 16, 4, 17, 44, 20, 10,247, -189,120,145, 88, 80,246,184,216,252, 48,163,151,199, 79, 31,182,188, 1, 65, 16,179, 8,130,104,206,113,156, 11, 69, 81,175, 0, -220,166,105,122,121,208,158, 89,247, 42,219, 38, 30,150,126,196, 96, 15,244, 55,179, 33,187, 19, 28,124, 64,128, 32,128, 72, 69, - 14,123,186,230, 51,236, 31,156, 23,102, 52,137, 30,212,126,170, 45, 73,146, 91, 0,200, 89,150,157, 70,146,100,183,147, 39, 79, -130,162, 40,116,239,222,221,127,112,135,105,245, 73,146, 92, 38,147,201, 88,181, 90, 61,114, 79,200,138, 15,206,118,206,113,104, - 60,115,242,194, 62, 36,212, 88,188,234,103, 14,192, 7, 17,172,214,173, 87,218, 83, 82,171,169, 32, 4,125, 88,150, 57,205, 48, - 57, 43,110, 92,154,158,250, 79,145,151,183,137,203,199,136,195,225,201,208,135,183, 15, 95,135, 60,120,252, 15, 16,172,177,189, -231, 11,116,218,188,243, 1, 67,134,187,244,235, 63, 88,110,106,106, 42, 74, 74,140, 83,239,220,177,245,203, 59,225,119, 90,254, - 48,102,189,127,101, 72, 86,231,106,213,122,168,205,204, 14, 12,159, 53, 75,212,180, 69, 11, 56, 56, 57,161,176,160, 0,207,159, - 61,179, 15,191,125,123,208,217,147, 39,251,118,172, 90,117,248,133,164,164, 3,198,216,163,105,218,237,218,134, 13, 2, 65,149, - 42,224,116, 58,232,108,108,192, 22,103,246, 22, 61,125, 10,104,181,224,116, 58,104,188,189, 65, 51, 12,122,246,236,233,112,239, -222, 61, 33,128, 74, 17,172, 14,245,134, 56,123,122,122,238,158, 51,103,142, 72,163,209, 32, 50, 50, 18, 55,111,222,100, 51, 51, - 51,127, 49,214, 70, 27,191,213,117, 29, 5,142,135,122,247,254,210,189,219, 23, 14,226,170,142,118,224, 56, 41,158,198,235,170, -158, 15,139,232,114,250,236,249,153,173, 91,173, 30,112,237,250,212,135,198,216, 19, 9, 49,240,122, 32,134,183, 93, 3,145,150, - 97,122,148,205, 50, 78,146, 36,172,172,172, 32, 16, 8,126,242,176,244, 27, 25, 99,128,104,212,178,240, 35,182,204,197, 82,150, -196, 76, 0, 24, 63, 64, 26, 43, 18,137,220, 39, 77,154, 36,238,211,167, 15,242,243,243,113,228,200,145, 86, 7, 14, 28, 88, 53, -126,128,244, 69,253,234,234, 90, 0,176,101, 46,150,143, 93,234, 55,215, 16,201,250, 97,204,122, 74,171,213, 46,176,176,176,152, - 49,116,232, 80,137,187,187, 59,164, 82, 41, 50, 50, 50,170,198,199,199,187,158, 60,121,178,199,220,145,107,214,217,216,216,252, - 48,125,217, 16,163, 18,112,254,216,216,175,250,216,230,228,161,214,195, 71,120, 89, 56,181, 16,145, 2,123, 0, 0,163,207,244, - 84,164,223,233,127,229,247, 29,115,126,244,241,235,183,240, 94, 88,172, 49,246, 40,138, 90,247,203, 47,191,244,182,182,182,198, -204,153, 51, 31,187,186,186, 18,150,150,150,248,237,183,223, 96,105,105, 9,189, 94,127,255,215, 95,127, 37, 95,190,124,137,181, -107,215,254, 14, 3,123,231,189, 75,173, 18, 10,169, 47,129, 55,213, 42,142, 41,132,190, 96, 9, 8, 2,236,135,220,208,237,252, - 87,216, 84,169, 86,231,209,180,192,233, 54,214,214, 54,228,201, 27,137, 53,207, 29, 88, 51,184,101,251,149, 62, 21,145,172,119, - 77,198,131, 59, 76,107,109, 98, 98,242,195,182,227,139, 58, 1,192,160,121, 90, 39, 86, 75,154,144, 98, 86,181,127,145, 56,245, - 99,145, 41, 30,255, 44, 41,227,137, 22, 15, 30,159, 41,193,170,101,209, 6, 26,117,206,252,129,253, 3,156, 39, 78,154,230, 70, -211,218,162,199,143,174, 93, 37, 72, 80,163,198, 12,151,103,101,189,148, 62,143,139, 89, 12,188,158,148, 13,161,139,187,251,151, -166,245,234, 29, 93,183, 98, 5, 97, 99,107,139,180,180, 52, 36,167,164, 32,249,201, 19, 0,192, 23,157, 59,195,167, 97, 67,225, -154,141, 27,247,118,118,117, 37,207, 37, 39,239, 51,106, 98,180,179,195, 43,119,119,112, 90, 45, 94,156, 59, 7, 66, 34, 1, 69, - 81,168,210,190, 61, 8,250,245, 92,157,123,235, 22,220, 60, 60, 74, 9, 72,229,149, 6,174, 69,171, 86,173, 68, 28,199, 97,250, -244,233, 5, 42,149,106, 41, 65, 16,123, 47, 71,239,123,105,148,210,230,183,210,195,193,222, 33,108,229,162, 49, 86,141, 60, 61, - 64,128, 69,114,198, 43, 0, 38,168,238, 66, 97, 68, 95, 31, 81, 43, 95,113,173,149, 27, 66, 47,183,105, 19,228,119,245,106, 96, - 84, 69,246,134,116,156,158,196, 90,212,114,109,185, 49, 27, 5,156,120,176,173, 68, 66, 87,171, 86, 13, 11, 23, 46, 44,221,148, -217,205,205, 13,225,225,225, 67,188,189,189, 71, 12,235, 52, 83,163,215,235,187,238,187,184,234,210,187,236,237,152, 13, 71,150, -196,204,241, 67,198,147, 0,176, 57,120,139,231,178, 45,161, 48,179,116, 41, 61,198,219,219, 27,129, 83, 70,137, 15,174,170,238, - 57, 46, 96, 60, 0, 96,211,222, 77, 51,119,204,198,218, 86,115, 81,161, 74,162,209,104,230,215,175, 95,127,198,140, 25, 51, 36, -183,111,223,198,165, 75,151,112,234,212, 41, 84,169, 82, 5,213,171, 87, 39,166, 78,157, 42,221,181,107,215,164,180,180, 52, 49, -128,169,134,234,115,110, 35,191,170,181, 27, 85,185, 57,115,219,110,187, 35,199,158, 97,217,242, 93,120,254,252, 57, 0,160, 70, -141, 26, 24, 50,164,191,240,215, 83, 87,235,173,158, 52,244,198,119,222,126,173,151,220, 15,123,102, 68, 27,139,239,223,191,143, -198,141, 27, 99,215,174, 93,132, 64, 32, 64, 68, 68, 4,196, 98, 49,190,250,234, 43,212,175, 95,159,148,203,229,184,113,227, 6, - 10, 10, 10,222,163, 15,161,241,236,201,243,250,144, 36,176, 56,104, 1,183,127,142, 95,161, 72, 72,126,177,108,237, 47,160,245, -136, 39, 8, 24,220,218,197,195,210,143,138,201, 11, 99,222,253,176, 33,251, 97,202,148, 41,118, 47,213,182,216,124, 6,176, 49, -113, 39,204,234, 14,179, 47,186,189,121, 38,128,105,198,150,115,232, 23, 51,252,228,114,249,169,194,194, 66,147,146,207, 88, 45, -105, 66, 8,184, 81, 96,200,144, 97, 63,208,218,221, 63, 11,115, 42,171,168,148, 37,100,134,222,243,224,193,227,127, 23, 51,103, -206,228, 96, 32, 89,243,167,196,242,229,203,255,241,115, 24,165, 96, 9, 41,170, 67,175,190,125, 36, 26, 77,145, 82,167, 83,169, - 18, 95, 92, 77, 77,207,136, 42,112,117,174, 99,237,255,133,183,125,114,114,106, 59, 99,236, 44, 24, 49, 66, 84,100,102,118,120, -125, 80, 16, 65, 82, 20,104,154,134,155,155, 27, 30, 60,120,128,130,188, 60, 20, 41,149, 72,122,244, 8, 85,221,220, 48,233,171, -175,136,101,171, 87,255, 62,164,105,211,147,123,239,220, 81, 25,156,184,104,186,172, 10, 1,226,173, 61,232, 88,177, 24,100,229, -246,164,251, 27, 88,150, 77,120,245,234, 21, 76, 76, 76,224,229,229,101, 26, 30, 30,126,245,210,227, 96,163,200,149,199,152,245, -148,147, 72,114,124,249,162,193, 86, 2, 97, 28,158, 37, 41, 96,111,217, 16,122,198, 18,249, 74, 45,162, 98, 47, 33,234,233, 41, - 84,119,118,197,232, 33, 53, 45, 87,109,201, 56,233,225,191,183,102, 76,104,133, 74,142,211,214, 29,123,161, 80, 40,112,248,240, - 97,216,218,218, 10, 31, 63,126,140, 87,175, 94,129,162, 40,200,100, 50,120,120,120,224,235,175,191, 22, 58, 57, 57, 33, 34, 34, - 66,114,246,236,217,211, 99,123,207, 55,221, 98,164, 27,146,120, 7, 25,165,222,163, 30,103,124,181,162,145,169,169,233,140,192, -192, 64,201,158, 61,123,144,151,151, 7,115,115,115,216,217,217,225,254,253,251,136,136,136,192,140, 25, 51, 32,149, 74,101, 11, - 23, 46, 28, 61,125,216,242, 3, 39, 79,182,185, 85, 1,201, 32,198, 54, 39,142,206,217,177,203, 78, 32,124,128,234,238, 11, 16, - 30,174,128, 86,251, 90, 68,203,201,201,192,247,223, 37, 67, 42,155,139, 89, 91,119,217, 4,118,106,119,120,159,165, 95,125, 67, -238, 66,138,162, 2, 15, 28, 56,208, 45, 55, 55, 87, 16, 30, 30, 94,186, 61, 76,201, 43, 45, 45, 13, 12,195, 96,239,222,189, 28, - 73,146, 83, 12, 42, 74, 94,131, 71,218, 90,201,191,164, 4, 4,153,158,169,186, 60,166, 27,192,178,106,176,121,203, 65, 16, 96, - 57, 14,141,103, 79, 93,228, 94,236, 30,124,212,127,113,216,111, 6,239,163, 5, 11,156,251,181,153, 36,136,138,138, 74,143,201, - 11, 43,122,163,252, 66,225, 80,123,123,123,108, 59, 3,228, 21, 1, 5, 69, 12, 84,133, 26,130, 36, 5, 93, 42, 34, 88,227,250, - 44,248,169,176,176,240, 59, 0, 16, 8, 4,135, 36, 18, 73,143, 53,107,214,200, 71,143, 30,141,128,217, 58,115,134,212, 91,138, - 4, 66, 61,205, 65, 7,146, 91,170, 81, 83, 67,199,174, 97, 11, 46,207,135,158,159, 74, 62, 31,240, 36,149,199,127, 0,111, 19, -179,207,154,168, 85, 4,163,164, 28,130, 36,108, 76, 77,100,130,200,136, 3,151, 46,158, 95,120, 38, 39,243,138, 66, 42,204, 21, - 40,149, 17, 69,255,199,222,121,135, 71, 81,181,109,252,158,153,237,125, 83, 72, 33, 5, 2,113, 9,189, 11, 82, 18,122,145, 38, -138, 74, 68,130, 10, 82, 44, 96, 4, 35, 10, 47,240,130, 20, 81, 4, 69, 33, 32, 72, 13, 32, 54,164, 67, 16, 2, 82,164,119,217, - 80,210,123,217,244,173, 51,243,253, 65,146, 47,240,166,236,166, 64,128,243,187,174,189,146,157,157,125,118,230,204, 41,247,121, -206, 57,207,105,228,165, 0, 15,202,201, 30, 59, 39,142, 31,255,246,157, 15, 62, 16,107,180, 90,200,100, 50,184,186,186, 34, 51, - 51, 19, 70,163, 17,133,185,185, 48,103,101,193,146,149,133,127, 35, 35, 33,181, 90,209,183, 75, 23, 97, 70,102,230,122,123,108, -155,221,221, 17,123,232, 16,226,162,162,224, 61,120, 48,188,123,244,128,231, 11, 47, 32,235,216, 49,100, 93,184,128,188,127,254, -129,114,244,104, 48,145,145, 16, 84,115,123,160, 99, 55,183, 95, 56,124,248,240,190,148,148, 20,188,251,238,187,180,183,183,247, -254,158,205, 94,109,105,207,119,221,244,236,184,177, 33,109,154,186, 57, 9,240,247,149,125, 72,205,204, 68, 86,174, 9,217,185, - 38,100,231,153,112,253,214, 1,240,156, 18, 87,255,141,135,197,148,143, 30,157,181,222,174,150,172,119,171,178, 91, 88, 88,136, -159,126,250, 9,167, 79,159,198,190,125,251,144,159,159,143,160,160, 32, 76,152, 48, 1, 65, 65, 65, 40, 40, 40,192,169, 83,167, -112,233,210, 37,164,166,166,130,227, 56, 97, 69,194,250,237, 37, 72,161,129,165, 63,108, 89,133,213, 17,225, 80, 54, 28,137,147, -167,175,225,198,141, 27, 40, 44, 44, 68, 90, 90, 26,126,253,245, 87,124,245,205, 26,228,161, 11, 86, 71,132,227,135, 45,171, 64, - 3, 75,223, 94,130, 74,247,227,163, 40,234,189,209,163, 71, 75,207,157, 59, 87, 42,174, 52, 26, 13, 26, 54,108,248,192,166,206, -158,158,158, 24, 59,118,172, 84,161, 80, 84, 42, 94, 70,235, 48,106,204,103, 19, 91, 72,100, 10, 24,139, 22,160,117,107, 26,179, -102, 73, 75, 63, 15,251,196, 9, 93,187,104, 96, 54,109,132, 80,108,195, 59,115,223,243,191,219, 2, 99, 43,181,217,231,163, 95, - 88,150,189,215,162, 69, 11,193,251,239,191, 15,137, 68,130, 45, 91,182, 96,213,170, 85, 88,182,108, 25,174, 93,187, 6, 95, 95, - 95,184,186,186,162, 97,195,134, 20,203,178,250,209,125, 62, 58, 92,133, 71,172,211,153,115, 87, 70,158, 58,115,117, 68,207,246, -214,113, 66, 1,221,255,171,149,203,240,213,102, 6, 20,232,231, 1,244,229,217, 66,216,178, 23,216, 61, 60,216,164, 73, 19,235, - 55,223,124,163, 24, 57,114,100,223, 30,186, 81,109,202,136, 78,111,198,156,158,190,255,212, 93,222, 83, 13, 48,176,192,152,126, - 11,214,180,171, 60, 15,219,158, 42,242,209,103,107,215,174, 21,172, 95,191, 94,224,237,237, 61,124,249,242,229,114,127,255,146, -141,141,105, 23, 64, 48,222,106,131, 51,103, 97, 54, 3, 0, 45,229, 94, 54,164, 22,184,217,219,232,151,120,195, 75,222,151, 21, - 2,100, 83,100,251,211,240,225, 99, 15,191, 30,119, 26,214,116, 56,178,188,123,170,142,205,154,124,151, 64,120,164, 30, 44,128, - 75,143,139,187,233,100,179, 38,179,195,187,185, 77, 18,230,229, 3,218,151,176,255,220,245,237, 73,137,119,165, 20,205,103,218, -165,230, 36,146,129,157,186,118, 69, 74, 74, 10,252,253,253,145,152,152, 8,189, 94, 15,179,209, 8, 83, 86, 22,172, 57, 57,176, -101,103,131,203,201, 65,204,241,227, 8,208,233,112, 76, 34, 9,180, 75,242,242, 60,104,154,126,160,177,254, 31,111,150, 66, 1, -148,217,252,217, 30,122,181, 24, 61, 66,173, 86,135,229,229,229,237,253,235,122,196, 2,179,217,252,222,162, 69,139,206,254,247, -191,255,117, 13, 11, 11, 83,135,133,133,253, 60,160, 93, 72,251,131,151, 54,154, 42,179,163,114,102, 71,117,109,171, 99,238, 36, - 94, 67,139, 70,195,225,230,244, 60,178,243,140,200,201, 55, 35,183,208, 2,255,231, 62, 70,110,129, 25, 57,249,133,184,114,107, - 43, 26,186, 55,166, 25,225,157, 65, 0,190,175,236,158,139,138,138, 96,181, 90, 97, 50,153,224,237,237,141,161, 67,135, 34, 35, - 35, 3,155, 54,109,130,201,100,194,196,137, 19,113,241,226, 69, 20, 22, 22,130,227, 56, 84,182, 53, 82,116, 78, 20, 63,113, 81, -224, 76, 93, 83,247,176, 75,151, 46,225,175,168,243,176,217,108,136,137,137, 65, 76, 76, 12,118,239,222, 13,145, 72, 4,137, 68, - 2, 94,220, 11,109, 94,152,138, 15, 63,156, 10,253,157,212,153,118, 76,114,127,193,211,211, 19,231,206,157, 43, 21, 87,106,181, - 26, 67,134, 12,193,252,249,243,255, 63,157, 84, 42, 4, 4, 4, 80, 20, 69,117,169,204,152,218,153, 30,210,178,203, 96,177,201, -248, 61, 80,172, 75,222,155,172,192,136,225, 26, 80,148, 4, 94, 13,149,160, 40, 9, 64, 73, 96,181,236,133,127,187, 23, 68, 10, -237,202,161, 0, 54, 84, 34, 2,135,236,222,189, 27,206,206,206, 56,119,238, 28,100, 50, 25, 40,138, 66,191,126,253, 62,112,117, -117, 13, 50, 26,141, 35,247,236,217, 67,229,228,228,192,215,215,183,228,188,190,163, 2, 63,144,239,140,250,174,194, 69, 25, 52, - 69, 33, 35, 51, 19, 78, 10,171,230,211,105,255,105, 76, 11,180,247, 63, 96,211,188, 22,126,179, 48,102,193,178,133,225, 0,122, - 8, 5,244,243,191,206,238,253,123, 85, 43, 9,255,252,243,207,116,111,111,111,247, 53,107,214,164, 46, 92,184,176, 77,159, 86, -111,180, 72, 76, 76,252,213,197,197,101,252,231, 31,190, 22,181,122,215, 26,111,129, 87, 31,121, 78,142,145,178,229,196,240,108, -230,181, 12,152,179, 43,245,135,179, 44, 43,112,113,113, 1, 69, 81, 24, 54,108,152,204,219,219, 27,102,179, 25, 0, 96,163, 97, - 98, 40,180,229, 5, 16, 48, 34,126, 21, 56,108,162,192, 13,101, 56,102, 7,169, 66,235, 15, 68,160, 62,152, 22, 68, 92,213, 27, -111, 84,105, 21,107,135,151,138, 47,231,123,101,223, 83,118,216, 69, 5,159, 85,246,189,199, 39,176, 44, 22,246,240,186,181,107, - 71,189,247,193, 8,207,127,110,255,253,203, 15, 63, 54, 29,248,198, 43, 71,246,184,186,181, 80,237,248,229, 95, 87,171,197,118, -208, 46, 59, 98,177,187,171,155, 27, 98, 98, 98,112,246,236, 89, 24,141, 70,152,141, 70,216,114,114, 96,201,202,130,213, 96, 0, -242,242, 32,178,217, 80,152,144, 0,191,182,109, 97, 22,139,181,142, 8, 44,154,166,129, 98, 1,197,201,100,160, 25,230,254,139, -166,193, 43, 20,224,139,199,101,236, 33,168,249,235, 29, 59,116,232,176, 35, 60, 60, 92,244,241,199, 31,119, 25,208, 46,100,101, -212,191, 59, 98,251,180,122,163,239,210,165, 75,255, 89,176, 96,129,100,204,152, 49, 1,225,225,225, 33, 0,194, 43,179, 37, 20, -155,219, 52,242,208,129,161,122, 34, 43,215,140,236, 60, 19,114, 11,205,200,205, 55,227,192,129,183, 97, 50, 22,193,106,178,192, -102,182, 64,233, 54, 28,254, 45,251, 0,184,221,186, 74,207,157,217, 12,150,101,193,178, 44, 58,116,232,128,140,140, 12,244,237, -219, 23,167, 78,157,194,205,155, 55,241,231,159,127, 98,196,136, 17,184,120,241, 34,236,217,216, 59, 58, 39,138, 47, 48,142,134, - 76,233, 94,110, 26, 63,240,219, 54, 9, 10,140, 52,236, 92, 65,232, 43, 18,137,192,243,124,169,184, 82,171,213,216,190,125,123, -209, 23, 95,124, 33,123,248,100,137, 68, 66, 85,254,188,209, 65,169,109,143,130,188,217, 37, 41, 12,138,146,160, 99,167, 4,152, -205, 60,210, 82, 59, 67, 34,145,129,130, 4, 60,151, 14,185,218, 11, 60,207, 87,153,158, 28,199, 97,237,218,181,165, 67,131, 0, - 32,151,203,187,132,134,134,190, 92,222,249,237,219,183, 71, 81, 81, 81,165, 99,166, 28,207,195, 98,177, 20,219, 55,130,203,248, -111,169, 40, 20, 48,180,152,162, 41, 55,139,133, 21,127, 58,237, 63, 94, 52,101,243,170,106, 37,225,130, 53,239,179, 61,155,189, - 26,157,150,150,214,115,209,162, 69,169, 1, 1, 1,141,230,205,155, 55,215,213,213,181,193,228, 9,111,223, 27,250, 98,198, 79, - 11, 86,238,236,190,251,210, 63,254,172,201,178, 77, 32, 44,252,236,232,137,233, 85,118,130,242,243,243, 65, 81, 20, 78,158, 60, -137,118,237,218,161,160,160,160, 88, 96,209,185, 20,207, 69, 80,224, 23, 9, 56,172,177,242,184, 70, 1,179,109,188,200,174,177, -226,178,158,170,231, 52, 61,171,124, 79, 32, 16,145,245,212,224,232, 80, 31,133,170,135, 8,171,122, 95,209,103,143,124,168,177, - 74,129, 21,157,115, 28,103,206, 94,159, 47, 18, 49, 61,118,110,223, 46, 31, 54,164,169,188,113,227,198,140,179, 11,167, 62,113, - 34,222, 37, 62, 62,207, 32, 20,187,124,102,239, 15, 22,228,228, 32,246,250,117,228,100,103,195,152,151, 7,107,110, 46,172,217, -217,240,246,245, 5,175,213,130, 49,153,192, 24,141, 16,113, 28,228, 18,137,221, 55, 34,186,118, 13, 94,189,123,131,183, 88,144, -117,234, 84,233, 36,119,197,168, 81,128, 72,116, 95, 92,173, 95, 15,222,195, 3,236, 55, 85, 71, 84, 8, 12,120,205,213,211,211, -115,215,119,223,125, 39,202,202,202,194,181,107,215, 46, 29,188,180, 49,167,107,147,151, 84, 66,161,144,211,235,245,135,255,253, -247,223,161, 77,154, 52, 1,207,243,254, 85, 54, 94, 57,114,139,205,202, 35, 33, 51, 6,255,222,187, 8,154,118, 3, 45,244, 69, -110,129, 25, 52,237, 14,107,209,191,176, 90, 44,224, 89, 14,198,194, 68, 20,154,237,203, 7, 28,199,149,122,238, 2, 2, 2,176, -101,203, 22, 92,190,124, 25,119,238,220, 65,131, 6, 13,144,147,147, 3,157, 78,135,171, 87,175, 66, 32,168,221,176,103,133,133, -118, 71,210, 0,195, 48,113,137,137,137,205,220,220,220, 64,211,116,169, 23,171,103,207,158,178,196,196,196, 12,179,217,220,252, -171, 77,211, 51, 29,249,253,221,187, 79, 99,226,196, 20,164,167, 27, 0, 0,251,246,252,255,100,252,232,104, 30, 61,122, 30, 5, - 0,104,181, 90,124,253,117, 15,123, 68,250,158,225,195,135,191,172, 82,169, 48,126,252,120,200,100, 50, 12, 31, 62, 28, 69, 69, - 69,111, 0,192,242,229,203,241,209, 71,247,167, 49,133,133,133, 97,241,226,197, 40, 40, 40, 48,221,185,115,199, 92,185, 93, 14, - 22,139, 5,217, 5,106,205,199, 95,108,136, 5, 92,193,113, 44,175, 16,102, 75,191,248,236, 63,158, 52,101, 25,241,197,178,133, -224, 56, 19,184,220, 47,237, 26, 42, 60,126,235,231,194, 46,126, 35, 78,229,231,231,143,216,186,117,107,102,187,118,237, 4, 26, -141, 38, 11,128, 56, 37, 41,150,254,115,195,130,148,204,204,204, 73,215,211, 35,207,218,155,158, 81, 81, 81,160,105, 26, 23, 47, - 94,196,153, 51,103, 74, 61,189, 76,190,133,135,130, 6,120,158, 6, 69, 1, 2,198, 10,150, 19, 64, 68, 90, 15,226,189, 34,233, - 66,120,162,196, 30,255,168,188, 87,118,123,176,244,134, 40,238,141,126, 83,230,156,191, 80,248,155, 75,131,252, 60,214, 90, 80, -240,219,174,123,141,143, 69, 89,213, 20, 39,122,121,243, 95,246, 77,152, 22,154,205, 41,119,244,122, 31,158,227, 80,104, 48,192, -154,147, 3,139,193, 0, 91, 86, 22,224,236, 12,129,201, 4,218,100,130,208,106,134, 76,174,132, 33, 61, 29, 98,179, 57,219,174, - 59, 41,246, 16,240, 52, 93,234,181, 98, 24, 6, 80, 42, 1,177, 24,148, 66, 1,138, 97, 64,217, 57, 68, 40,147,201,182,174, 89, -179,198,211,211,211, 19, 51,102,204, 64,195,134, 13,155,191, 55,106,126, 97, 80, 80,144,204,213,213, 21,205,154, 53, 67,167, 78, -157,112,228,200, 17, 80, 20,117,187, 42,123, 54,139,248,252,141, 59, 54,159,130,162,179, 56,115,126, 51,204, 38, 11,116, 1,159, -194,138, 6, 80,121,188,131,194,162,223, 96, 49,222, 95,220, 39,113, 10, 66,106,106, 6, 0,234,106, 85,118,105,154,134, 84, 42, -133, 72, 36,194,189,123,247, 64,211, 52, 46, 92,184, 0,133, 66, 1, 79, 79, 79, 4, 5, 5, 33, 41, 41, 9,114,185, 28, 70,163, -209,161,204, 33, 20, 10, 97,181, 90, 43, 18, 76, 40, 42, 42,178,223, 79,204,243,167,226,226,226,116, 77,155, 54,165, 24,134, 41, -245, 98, 5, 6, 6, 34, 39, 39, 71,115,232,208,161,189, 19, 95,154,211,205,222,201,247,160,112,145,231,210,155, 55,109,218, 20, -233,233,233, 0,128,240,181,249,184, 19,221, 9, 60, 36, 88,250, 85,194,255,187,206,124,125,145,150,118, 27, 20, 85,121,122,110, - 59,242,205, 43,193,125, 67,125,120,158,143,110,221,186,181, 56, 53, 53, 21, 47,191,252, 50,126,249,229, 23, 0,192,180,105,211, - 48,109,218,180,135,189, 62, 85,170, 76,142,187,239,193, 90,181,249,178, 86, 92,236,145,181,217,108,248,244, 93,159, 24,142, 51, -130,203, 93, 10, 0, 49, 95, 44, 91,124, 8, 0, 40, 10,231,236, 73,130, 51,247,254,200,125,190,241,240, 99, 83,167, 78,125,105, -221,186,117,217, 0, 24,147,201, 36, 29, 49, 98,132, 79, 74, 74,202,251,122, 67, 84,140, 35,207, 59, 37, 37, 5, 52, 77, 35, 58, - 58,186,244,127, 0,160,228, 2, 13, 13, 46,152,163,168,109, 54,154, 98,193,114,109,121,224,178,128,166,236, 10,115, 82,158,167, -170, 50,207, 22,161,118, 5,196,147,148,174, 36, 15, 16, 30,145, 71,237,145,120,179,236,118,105, 36, 39, 27,230,125,252,241,172, - 6,195,134, 13,107,144,159,159,143, 61,123,246,184,254,115,126, 19,110,223,190,189, 28,192,243,118, 53,178, 22,203,190,115,103, -206, 76,234,217,189, 59, 98, 46, 92,128, 45, 59, 27,214,172, 44, 8,172, 86, 48, 70, 35,104,163, 17,140,209, 8,223, 14, 10,128, -247,196,153,123,201,128,201,116,204, 78,219,224,105, 26,188, 92, 14,154,166,193, 20, 15, 11, 66,161,184, 47,176,148, 74,208,197, - 2,171, 42,122, 54,123, 85, 62,120,240,224,190, 29, 58,116, 0,207,243, 88,186,116, 41,204,102,179,216,106,181,194,106,181,194, - 98,177, 32, 47, 47, 15,191,254,250, 43, 54,110,220,120, 82,163,209,252, 84,101, 35,107, 51,237, 59,114,226,226,139, 33,163,122, -139,247, 29, 90, 11,139,153,133,209,230,132,220, 66, 35,114,139, 4,176, 42, 6, 2,153, 81,224,105, 9,124,188, 91,224,182,254, -186,145,181, 90, 42, 93,178, 79, 81, 20,132, 66, 33, 84, 42, 21,148, 74, 37,110,221,186,133,137, 19, 39,226,208,161, 67, 72, 74, - 74, 66, 96, 96, 32,130,130,130,112,248,240, 97, 56, 59, 59,151, 14, 1,217,193,173,211,167, 79, 55,235,213,171, 23,238,220,185, -131,216,216, 88, 88, 77, 89, 16,210, 69,160,105, 41, 60, 61, 61, 33,151,203,241,247,223,127, 3,192, 45,123, 12,178, 44,251,253, -161, 67,135, 94,247,242,242,146, 53,108,216,176,116,136, 80,173, 86, 35, 36, 36, 68,120,231,206,157,150, 44,203,126, 11, 96,138, - 61,246,242, 51,185,189, 69,153,231, 95, 29, 49, 98,132,232,244,233,211,224,121, 30, 1, 1, 74,168,213, 10,128,146,162, 85, 75, - 23, 0, 49,160, 40, 10,189,122,245, 2,109,138,182, 21,102,179,123,237, 48,189,124,241,226,197, 98,133, 66, 1,179,217,140,252, -252,124,100,101,221,143, 70, 80,158, 7,171,168,168, 72, 82, 85, 65,229,139,135, 8, 75, 4,112, 73,222,204, 42,227,209,202, 52, -208,185,199, 46, 82, 55,143,222,216,230, 80,144,209,127, 98,118,197,245,111, 59, 54,250,135, 31,126,104, 57,101,202, 20,227,148, - 41, 83,124, 10, 10, 10,182, 59, 42,174, 40,138,178, 37, 36, 36, 8, 40,138, 2,203,178,108,116,116, 52,163, 86,171,139,107, 36, - 90,200,241,220,101,176,212, 46,150,165, 36,180,152, 29, 75,129, 62, 64,179, 54, 75,157,212,128, 20, 5,189, 33,138, 52, 5,118, -136, 86, 2,161,158, 83,209,156, 39, 10,255, 59, 95,170, 34, 79, 83,101,239, 29,241, 70, 61,210,249, 87, 14, 9,172,163, 55,182, -245,157,247, 94, 56,151,156,156, 76, 25, 12, 6,172, 95,127,127,113,159, 88, 44, 14,180,215, 70,143, 49, 99,166, 30,252,227,143, -183,218,182,108, 41,110,220,184, 49,110, 68, 71, 67,100,179, 65,104,181,130, 54, 26, 33,180,152,224,247,188, 10, 98,153, 43,146, - 99, 77,216,113,246,172,213,167, 73,147,183,236,177,109,234,220, 25, 57,103,206,128,166,105, 40, 94,123, 13, 16,139, 1,133, 2, -252,218,181,160,197, 98, 48, 12, 3,126,249,114,112, 3, 6,128,174, 98, 46,210,241, 91, 63, 23, 14,233, 60,254,220,205,155, 55, - 59, 7, 4, 4, 96,222,188,121,136,143,143, 7,199,113, 72, 79, 79, 55,166,167,167, 39,102,102,102,198, 80, 20,245, 91, 82, 82, -210, 90,189, 29,145,194,211,116,204,134,131,135, 35,167,119,108,223,178,217,192,190,115,241,219,239,255, 65,150,193,128, 60,147, - 0, 57,249,102,228, 23,241,144,136, 2,208,164, 73, 39,152, 77,133,136,190,118, 62, 33, 67,228,188,166,202, 7, 40, 16, 64,163, -209, 64,163,209, 64, 32, 16, 96,207,158, 61,232,212,169, 19, 66, 66, 66, 16, 27, 27,139,125,251,246, 65, 42,149,194,217,217, 25, -169,169,246, 5, 29,103, 24,102,200, 43,175,188,178,180,115,231,206, 47, 45, 94,188, 24,114,235, 97,252,123,254, 91,180,212,242, -144,186, 13,199,221, 44, 21,214,175, 95,143,236,236,236,223, 25,134,177, 43,254,217, 87,155,166, 95, 12,123,235,155,175,119,239, -222, 29, 58,105,210, 36,121,137,184, 42,241,146,204,156, 57, 83,246,193, 7, 31,132,124, 50,110,217,223, 95,110, 8,141,168,178, -167, 27,141,159,163,214,111,152,217,103,218,170,214, 99,198,140,193, 47,191,108,195,228,137,141, 1,234,254,188,171,145, 35,253, -241,217,231,215,241,252,243,189,225,238,206,224,214,206, 93,119,227, 27, 96,147, 61, 89,105,223,190,125,208,104, 52,216,177, 99, -135,205,213,213, 85,208,160, 65,131, 10, 61, 88,197, 2,171,242, 82,205,221, 31, 34,164, 40,234, 1,129,181,106,211, 37,173, 88, - 44,214, 82, 20, 5,171,213,138,110, 47,180, 9, 66, 53,162,184,199,197,197, 29, 90,177, 98, 69,107,137, 68,226,190,123,247,110, - 62, 47, 47,111,123, 53, 68,205,194, 43, 87,174,124, 6, 0,254,254,254, 59,111,220,184, 49,204,211,211, 83, 14, 0, 98,161, 49, -219,108,165,126,100, 40,158,161, 36,130, 16,138,167,132, 22, 43,191,221,146,155,155,102,207, 28, 23, 71,231, 96, 17,113, 69,196, - 21,225,201,103,233,210,165,246,204,183,178,247, 51,202,206,239, 86,118,222, 35, 15,245, 96,183,192,234,213, 98,244,145, 79, 62, -249, 4, 99,198,140, 65, 70, 70, 6, 26, 53,106,132, 77,155, 54,225,206,157, 59,199, 0,116,177,199,198,220,185,115,109, 3, 54, -109, 26,241, 67,120,248,190,137,163, 71, 83,221,134, 15, 71,252,233,211, 48, 37, 37, 65,204,113, 16,203, 20,176, 22,185, 35, 43, -213,140,240, 11, 23,121,177,193,240,230,230,203,151,237, 26,215,178,217,108,104,212,168, 17,120,158, 7,179,100, 9,120,142,187, - 47, 87,221,220, 64, 21,199,109,226, 7, 15, 6,199,178,224,184,170, 87,195, 23, 22, 22,190,242,238,187,239, 94,222,187,119,175, - 83,112,112, 48,134, 15, 31,126,193, 96, 48,244, 62,125,247,247,188,234, 36,180,126,205,251,108,183,192,175, 71,172, 92,253,227, -201,113, 33, 33,206, 35, 71,174,196,133,107,215,144,105,113, 3,207,243,104,232,170,128,119,203, 79, 96, 50, 22,224,196,145,221, -217,156,205,248,138,254,248,228, 42,163,153,211, 52,141, 23, 94,120, 1,133,133,133,208,233,116,200,207,207, 71,102,102, 38,254, -250,235, 47, 72,165, 82,248,248,248,192,197,197, 5,106,181, 26, 9, 9, 9,118,121,176, 34,175,110,185, 11, 96,100,175, 22,163, - 95, 24, 49, 52,112,249,135, 47,167,119,154,252,198, 36, 0,192,170,173,171,241,203,175,167,207,229, 21, 50,211,142,222,216,118, -202,145, 52, 16, 10,133,243,178,178,178,168,133, 11, 23,126,252,234,171,175, 74, 2, 2, 2, 40,111,111,111,164,167,167,227,214, -173, 91,188,201,100,162,100, 50, 89, 67,123,108,141, 54, 68,113,159, 61, 31,248,210,181,223, 22,157, 25,241,250, 76,215, 33, 47, -118,133,107,131, 84,112,108, 10, 64, 73, 32,147,123, 96,221,186,142, 72, 77,201, 66,236,161,141, 89, 69, 6,254,149,240,195, 81, - 85, 14, 63,138, 68,162,247,247,236,217, 67,209, 52,173,161,105,122,106, 74, 74,202, 85,177, 88, 44,174,200,131,101, 15, 69, 69, -249,176,154, 11,238,207,149,163,105,112,197, 2,235,238,157,155,165, 98,139,166,105,240, 44, 85,173, 40,238,122, 67,148, 77,167, - 13, 92, 31, 22, 22,182, 32, 51, 51,115,145,222,129,173,129, 74,216,114,232,171, 57, 0,230,148,188, 31,211,127,122, 96, 82, 82, -210, 30, 0,138, 77,255,149,231, 1,200,123,237, 83,179, 63,120, 74,194,211, 92,152,144,101, 51,183,175,113,171,117, 15, 22,153, -148, 76,196, 21,129,240,180, 64, 85,181,178,172,108,133, 23,212,252,117, 43, 69, 81,130,135, 26, 36,105, 85, 33, 10,138,123,177, -165, 49,183,250, 55,109, 58,200,172, 80,252,218,183, 99, 71,113, 51,119,119, 56, 75,165, 80,202,100,200,201,204,196,221,212, 84, -236,184,120,209, 66, 27, 12,111, 28,137,141,253,173,204,117, 84,184,217,243, 11, 47,188, 16, 99,179,217,124,202,244,198, 31,238, -157, 63,252,181,204, 65,131, 6, 53,156, 51,103,142,173,178,205,158,123,183, 12,238,213,187,119,239,200, 13, 27, 54,208, 19, 39, - 78,228,119,237,218,165,250, 59,250,151,130,154, 36,120,207,192,229, 45,105,129,100,103,135, 78, 93, 27, 53,246,243,147,104, 52, -106,152,173, 44, 82,211, 50, 17, 23,115,215,164,191,113, 41,158,179,152,237,218, 42,231,205, 1, 51,226, 88,150,245, 1,238,175, - 0,147,201,100, 15,132, 98, 40,241,152,148, 13, 95, 33, 20, 10, 51, 36, 18,137,167,189,115,157,254, 94, 20,232,105,166,144, 56, -121,204,100, 10, 0, 86,109, 89,197,139,121,120,117,159, 25,149, 92,221, 52,248,248,205,165,109,228,114,249, 39, 20, 69,117, 53, - 26,141,222, 18,137, 36,157,162,168,139,133,133,133,115,190,218, 52,253,226,195,158,143,202,242,229,172,142,129, 77,181, 13, 4, -191,190, 30,246,182,174,237, 11,129, 98,133,218, 27,128, 21,121,217,119,112,245,204, 41,203,182,197,155,111,231,164,115, 47, 47, -184, 24,165,175,206,181,142,238,243,209, 47, 69, 69, 69, 47,255,251,239,191, 21,137, 70,214,102,179, 41,244,134, 40, 83, 5, 29, -147, 96,158,231,237,106, 17, 41,138, 58,119,244,198,182, 42, 3,141,234,180,129,221, 1, 12, 5,224, 14,192,237,161,191,105,229, -188, 14,232, 13, 81,145,213,184,247, 30, 20, 69,205,138,136, 92, 54, 0, 0,130,195,140, 30, 44, 69, 43, 24,158, 50, 71, 44, 17, -197,151, 60,163,170,246, 34, 44, 47, 98,123,121,158,173,170, 68, 86,125,220,236,249, 81,111, 71, 67,196, 21,129,240,148, 10,172, -226,202,253, 83, 0,139, 0, 44,209, 27,162, 62,117,160, 98,120, 32,168,233,220,113,227, 68, 39, 79,156, 88, 9,169,116,160, 89, - 40,108, 0,138,162,196, 22, 75, 58,138,138, 14,183,105,218,244,189,175, 14, 29, 50, 62,116, 29,156, 61,118,171, 81,233,114, 85, -120,238,130,125,124,124, 22, 39, 37, 37,253, 26,121,117,203, 71,181,145,232, 37,155, 61,211,140,104, 40,207,243,109, 1, 80, 20, - 77, 87,107,179,231, 50,207,165,100,108,154,193,131, 19,249,216,234,120, 52,254, 63,125,139,247, 39, 44,222, 10,137, 6,150, 78, - 92,132,153,142,108,238, 92, 23,141, 73,217,124,185, 77, 27, 72,223,105,133,209, 74, 53, 61,132,227,208, 14,247, 3,208, 95, 41, - 52,112,123,141, 55,176,101, 65, 5,219,202,216, 75,239,150,193,103, 76, 38, 83,115,163,209, 40, 54, 26,141, 66,158,231, 75, 21, -187, 76, 38,203, 42, 42, 42,114,215, 27,162, 30, 89, 68,243,234, 54,178,149,137,128,199,189,217,115,121,129, 71,137,192, 34, 2, -139, 64,120,166, 4, 86, 13, 42,134, 58, 17, 66,117, 45,176, 8,247, 69,214,250, 48,120, 0,247,163,189, 63, 10,113, 69, 26,147, -218,231, 73, 31,126, 35, 2,235,127, 61,134,164,140, 16, 8, 68, 96, 17,158,210, 70,139,240,116,148, 23,146, 15,158,204,231, 78, -158, 27,129, 80,127,161, 73, 18, 16, 8, 4, 2,129, 64, 32,212, 46, 2,146, 4, 4, 2,129,120,170, 9, 4, 2,161,118, 33, 30, - 44, 2,129, 64, 32, 16, 8, 4, 34,176, 8, 4, 2,129, 64, 32, 16,234, 55,143,108,136,176,174, 86, 0, 61,142,149, 69,229,253, -102,125, 25, 98,113,244,218,234,243,208,144,189, 97, 26, 30,229, 53,212,229, 74,180, 39,225,153,212,215,252, 80, 87,101,157, 64, - 32, 16,234, 92, 96,213,135,198,238,105,168,228,237,177,225, 72,122,218,187,217,171,189, 54,235, 34,198, 82, 93,231,165, 71,153, -158, 79,130, 24,170, 78, 7,224,113,199,193, 34, 98,168,238,235, 29, 2,129,240,104,161,107,163,112, 63, 43,133,255, 81,136,171, -186, 74,207,186,254, 93,123,237,219,147,151, 28,185,142,199,149,158, 53, 73,167,178,175, 71,245,156, 73, 3, 77, 32, 16, 8,245, - 76, 96,145,138,185,246,122,219,143, 91, 56,212, 85,163,254, 36, 8,222,250,122,223,213,185,174, 39,245, 25, 62, 92, 78,170,122, - 79, 32, 16, 8, 79,181,192, 34, 60,122,113, 85,215, 13,233,227,104,160,171, 35, 6,159, 6, 97,226,168,199,202,145,252, 68, 58, - 63, 4, 2,129, 64, 4,214, 83, 43,166, 72, 35,247,244,240, 36,122,147,202,254,126,125,205,139,229,109,238, 92,222,222,131,164, - 44, 17, 8, 4, 34,176,158,177, 70,183, 42,111,193,211,210, 48,212,100,136,230, 89, 30,222,169,205,231, 95, 29,207, 20,241,102, - 17, 8, 4, 2, 17, 88, 79,116,195,233,200,106,188,103, 73,100,145,185, 51,228, 25,217, 83,142,202,122,170,202,150,165, 71,189, - 97, 50,129, 64, 32,212, 11,129,245,172, 86,122, 21, 45,117, 39,158,130,186, 21, 14,101, 95,132,154,151, 75,146,150, 36, 15, 16, - 8,132,122, 42,176,236, 41,200,207, 74, 65, 39,226,234,233, 78,223, 39, 45, 31, 63, 41,229,146,204,193, 34, 16, 8, 68, 96, 17, - 72, 69, 79,120,236, 98,196, 17, 97, 84,209,185, 79,114,167,135,162, 40,146, 17,236,120,238,164,158, 34, 16,158, 18,129,245, 44, -185,163, 29,189, 87,226,170,175,189, 52, 34,141,198,211,247, 92, 29,157,131,165, 55, 68,145,132,173, 66,128,147,114, 66, 32,212, -127,106,101,171, 28,210,160,212, 77,143,243,113, 9, 55,123,135,108, 30,167,176,124,146,210,243, 81,167,197,147,124,159,164,179, - 82,243,114, 73, 32, 16,158, 48,129,245,172,245,154,234,226,126, 29,177, 89, 31, 26,154,202,174,183, 38, 43,217,106,107, 47,194, -186, 72,207,186,216, 87,175,182,169, 78, 16,214,186,202, 79,246,172,172, 45,121, 78, 21,205,185,170,232,115, 2, 17, 87, 4,194, - 51, 33,176,158,182,158,242,227,186, 95,123, 68, 65,117,196,192,147,180, 25,119,109, 94, 79,109,166,103, 93, 8,237,250,146,246, -143, 51,196, 72,121,225, 78,202,187, 54, 34, 30, 8, 4,194,211, 4,197,243,252, 35,105, 32,106, 90,121, 86,116, 29,117,101,151, - 80,113, 26, 63,170, 52, 35, 13,110,253, 21,182,245, 33, 31,146,178, 78,202, 8,129, 64, 4, 22,129, 64, 32, 16,136,192, 34, 16, -158, 33, 72,152, 6, 2,129, 64, 32, 16, 8, 4, 34,176, 8, 4, 2,129, 64, 32, 16,136,192, 34, 16, 8, 4, 2,129, 64, 32, 2, -139, 64, 32, 16, 8, 4, 2,129, 80,125, 42, 12,211, 64, 38,183, 63, 72,109,132,107,168,205,152, 82, 79,154,205, 71,145,190,117, -121, 77,164, 76,212,239, 52,125,177,211, 59, 98,163,209,216, 78, 40, 20,222, 58,120,105, 99, 78,109,216,236,230,255,178, 82, 32, - 16, 52,147, 72, 36,183,107,203, 38,129, 64,120,118,168,112, 21, 97,151, 46, 93,226,108, 54,155,143,189,134,132, 66, 97,134,213, -106,245,140,136, 92,102,171,232,156, 49,253,167,199,113, 28,247, 63, 54,105,154,230, 56,142,163,203,179, 41,145, 72, 60,195,127, -159,103,171, 47, 21,187, 78, 27,232, 13, 96,169, 66,161,232, 67,211, 52,157,151,151,247, 23,128, 25,122, 67, 84,108, 53,237,169, - 0, 76, 0,208, 25, 0, 5,224, 28,128, 31,245,134, 40, 67,117,133, 80, 77,238,243, 73,177,249,184, 68, 91,207,102,175,202, 25, -134,105,155,156,156,124, 70,111,136, 98, 73, 21, 82,115,241, 94,147,103, 19, 24,240, 90,115,154,166,167,201,100,178, 87,155, 55, -111,174,190,119,239, 30,159,149,149, 21,197,243,252, 91, 81,255,238,168, 86,153,236,254,220, 43,238, 2,129, 96,157, 70,163, 25, -232,239,239, 79,215,134,205,186, 78,195,250, 10,233,148,212,127, 94,104, 58,210,131,227,184,141, 12,195,180,145, 74,165, 46, 42, -149, 10, 42,149, 42, 83, 42,149, 94, 17, 10,133, 33,223,110,255, 44,229, 73,204,123,245,129, 10, 61, 88, 44,203,122, 30, 57,114, - 4, 42,149, 10, 44,203,130,231,121,112, 28, 7,158,231, 75, 95,101,206, 69,255,254,253,157,138,237, 85, 40,134,120,158,247, 60, -124,248, 48,180, 90,109,233,177,244,244,116,188,248,226,139,116,121,199,135, 14, 29, 90,165,205, 71,137, 78, 27,232,165, 84, 42, -175, 12, 26, 52,200,210,185,115,103,185, 72, 36,226, 51, 50, 50,186,175, 95,191,254,138, 78, 27,216, 86,111,136,138,113,208,222, -243, 26,141,230,199,145, 35, 71,154,125,125,125, 27, 41, 20, 10,186,168,168,168, 73,120,120,248, 88,157, 54,112,178,222, 16,245, -247,163,170,100,235,162,224, 60,206,194, 88, 81, 48,203,154,208,171,197,232, 97, 12,195,236,240,246,246,230, 0,100,245,105,245, -198,168, 35,215,182,254,243,180, 10,159,154, 54,148,246, 62,255,234, 10,225,158,205, 94,149,139, 68,162, 61,115,231,206,109, 60, -102,204, 24, 8,133, 66, 24,141, 70, 42, 34, 34, 34,104,241,226,197, 87,251,180,122,163,195,145,107, 91,111, 59,114,205,125, 91, -143,241,148,201,100, 87,230,206,157,235, 50,118,236, 88, 80, 20,133,162,162, 34,106,219,182,109,255, 99,115,219,138,158, 24, 61, -149, 8, 8,194, 19, 45,174,166,231,229,229, 45, 82,169, 84, 2,103,103,103, 72,165, 82, 8,133, 66, 8,133,194, 6,106,181,186, -159, 86,171,141,159,255,193,218,153,179,191,155,240, 21, 73,173, 90, 20, 88, 0, 32,147,201,240,199, 31,127, 64, 32, 16, 64, 40, - 20, 66, 36, 18,149,254, 45,251,127,195,134, 13, 65,211,246, 77,231, 82,169, 84,216,189,123, 55, 84, 42, 21,212,106, 53, 52, 26, - 77,165,199, 31, 7,179, 70, 5,154, 0,136,183,206, 12, 48, 11, 5,148,248,213,249, 55,205, 0,196,163,130, 84,156,198,183, 23, -189,240,171,149, 9, 90,173,211, 97,171,213,250,235,209,163, 71,219,120,120,120,188, 62,101,202,148,101, 0, 94,114, 64, 92, 41, - 84, 42,213, 79, 83,166, 76,113, 9, 9, 9,185,238,237,237,253, 83, 94, 94,222,137,211,167, 79, 55, 11, 15, 15,159, 49,105,210, -164,117, 58,109, 96,103,189, 33, 42,215,145, 94, 98, 89, 47, 33,195, 48, 25, 44,203, 86,234, 85,124, 84, 61,205,142, 29, 59,170, - 1,204,164, 40,138,101, 89,246,251,237,127, 45, 79, 46,249, 44,184,111,168, 7,128, 89, 0,242, 44, 22,203,151,191, 28, 95,105, -168,201,111, 85,212,176,215, 68,100, 13,104, 23,162,113,118,118,222,178,100,241, 98,201,222,189,123,145,144,144, 32,227, 56,238, - 87,157, 54,176,145,222, 16,101, 35, 85, 73,237, 8,107, 71,158, 17,195, 48,243,122,247,238,221,248,173,183,222,194,137, 19, 39, -176,127,255,126,116,232,208, 1, 67,135, 14, 69, 98, 98,162,114,237,218,181,227, 1,132, 57,242,251, 54,155, 45,164,184, 76,226, -200,145, 35, 56,116,232, 16, 58,117,234,132,161, 67,135, 34, 41, 41, 73,185,102,205,154, 82,155,115,230, 0,209, 57, 53, 75,147, -167,221,195, 83, 19,143,165, 35,249,168,186,233, 24,224,220,203,194,113,156, 16,128, 84,111,136, 50, 85,245,254,105, 19, 87,217, -217,217, 75,125,124,124,224,226,226, 82,122,156,227, 56, 20, 22, 22,162,168,168, 8, 12,195, 8,218,182,109,187,244,135,185,191, - 97,202,220,145, 68,100,213,150,192,162, 40, 10, 44,203, 66, 40, 20,150, 10,172,138, 94, 20, 69,161,170,128,165, 37, 54, 41,138, -130, 70,163,129, 82,169,132, 70,163, 41, 21, 82, 21, 29,127, 92,200,109,144,198,180, 95,109, 2,128, 5, 59,239, 31,107,215,112, - 80,202,252,161, 61,149, 90,173,211, 69,134, 97, 14, 39, 38, 38, 94, 93,180,104,209,137,240,240,240,119, 61, 60, 60,130, 28,252, -137,113, 47,191,252,178, 49, 56, 56,248,210,115,207, 61,215, 31, 64,130, 84, 42, 21,105, 52,154,159,243,242,242,164,223,127,255, -253,200, 97,195,134, 77, 0,224, 80,166,230,121,222,243,224,193,131, 16, 8, 4,232,215,175,223, 99,245, 0, 62, 84,233,125, 60, -116,232,208, 48, 55, 55, 55,172, 91,183,238,141,215,122, 77, 13,218,113,116, 69,236,152,254,211,189, 1, 28, 29, 59,118,108,147, -252,252,124,252,254,251,239,130,231, 52, 61,103,212,183,134,199,108, 54, 63,191,240,139, 47, 68,119,239,222,197,158,189,123, 75, - 14,171,189,188,188,186, 3, 56,246,168,175, 39,184,111,104, 19,169, 84,186, 20, 64, 7,147,201,228, 85,220, 33, 74,228,121,254, -183,162,162,162,207, 35, 34,151, 21, 61,237,149, 23,207,243,223, 29, 62,124,184,213, 59,239,188,211,255,200,145, 35,169, 86,171, -117,201,166, 77,155, 62,140,136,136,104, 60,120,240, 96,252,244,211, 79, 33, 58,109,224,231,246, 10, 96,157, 54,144,242,244,244, -124,123,244,232,209,136,143,143,199,184,113,227,146,121,158,159,189,117,235,214, 89, 37, 54,215,175, 95,239,144,205,170,132,194, -227,220,194,232, 81, 64, 81, 84, 14, 0, 53, 0,173,222, 16,149, 83,131,250,163,228, 25,229, 0,144,148,188, 23, 10,133,144, 72, - 36,144, 74,165,144, 74,165,184,123,247,238, 47, 12,195,188, 21,157,115,220,106,231,245, 81,197,255,182,211,105, 3,255, 97, 24, -166,210,247,122, 67, 20, 87, 31,210, 85,167, 13,244,166, 40,106, 57,128,222,184,191, 88,237,152,139,139,203,212,191,163,127,137, -181, 83, 92,121,228,229,229, 45, 42, 43,174,196, 98, 49,186,119,239,142,194,194, 66,156, 63,127, 30, 54,155, 13, 49, 49, 49, 80, -171,213,232,212,169,211,162,205, 95, 31,222, 58,127,126,207, 20, 34,155,236,167, 82,183, 19,203,178, 85,138, 43, 71, 4, 86,105, -171, 84,236,161, 82,171,213, 80,171,213, 40,201,227, 15, 31,175, 9, 93,252, 70, 28,208,105, 3, 7, 84,231,187, 63,207,110,142, -159,230, 52, 42, 87, 32, 74,165, 82,222, 98,177,236,140,142,142, 62,221,168, 81,163, 52,131,193,160,213,106,181,118,123,240,202, -208,217,207,207,175,177,143,143,207, 85, 0, 91, 1,236,191,118,237, 90, 76,175, 94,189,216, 13, 27, 54,156,106,221,186,117, 19, -154,166, 59, 87,231,250, 53, 26, 13,142, 28, 57, 82,223, 26, 67,173, 82,169,196,164, 73,147, 16, 22, 22,230, 43, 16, 8,142,142, -233, 63, 61,144,227,184,168,247,223,127,191,201,135, 31,126, 8,149, 74, 5, 0,198,154,244,150,171,235, 61,169,232,123,189, 91, - 6,239,237,213, 98, 52, 47, 16, 8, 14,220,189,123, 87,176,106,213, 42, 88,173,165,117,183, 80, 32, 16, 92,126,212,105,249,122, -239,105,205,165, 82,233,249,175,191,254,122,196,193,131, 7,125, 78,157, 58, 69, 31, 63,126,156, 94,177, 98,133, 79,167, 78,157, - 38, 74,165,210, 75,193,125, 67,133, 79,123,229,117,236,230,246,184,163, 55,182, 13, 56,116,232,208, 91, 22,139,229,237, 99, 55, -183, 47,231,121,254,219, 63,254,248, 3,206,206,206,104,217,178,165,155,187,187,123, 55,123,237, 53,108,216,176,117,203,150, 45, -155,250,249,249,225,231,159,127, 6,207,243,107,142,222,216,182,190,172,205, 86,173, 90, 57,100,211,158,252,248,140,204,107, 49, -180,112,237,195, 63,223,120,120, 77,123,206, 18, 0, 98, 0, 98,129, 64, 32,150, 72, 36, 98,169, 84, 42,150, 72, 36, 98,137, 68, - 34,126, 22, 18, 82,167, 13,244,162, 40,234,186, 72, 36, 26,162,213,106, 53,206,206,206, 42, 95, 95,223,129, 58,157,238,218,220, - 41,171, 27,219, 99,131,227,184,141, 10,133, 66,224,236,236, 12, 0, 24, 54,108, 24, 54,111,222,140,129, 3, 7, 90,187,118,237, -106,125,245,213, 87,225,233,233, 9, 0,184,122,245, 42, 24,134, 17,184,185,185,109, 36,146,169,150, 60, 88, 37,174,194,170,196, - 85,137,192,178,151,148,148, 20,168,213,106,168, 84,170, 7,188, 84, 21, 29,175,118, 99,251,220,115,125,228,114,121, 79,157, 54, -112,184,222, 16,117,184, 22, 50,181, 16,192,165,123,247,238,245,248,237,183,223, 94,220,186,117,235,133,206,157, 59,123, 47, 95, -190,252,195,155, 55,111,230, 39, 37, 37,253,227,104, 47, 85,173, 86, 35, 51, 51,243,132, 82,169, 20,159, 63,127, 62,174, 71,143, - 30,217, 0, 92,243,242,242,156, 20, 10,133,221,137, 90,118, 88, 80, 42,149,154, 41,138, 18,104,181, 90,104,181, 90, 75, 86, 86, -150, 49,184,111, 40, 68, 34, 81,134,197, 98,177,107,184, 16, 0,222, 28, 48, 35,149,101, 89,183,202,206, 17,137, 68,105, 27,246, - 45,118,183,199,158,205,102,155, 31, 17, 17,209, 87,161, 80, 52,123,247,221,119, 1,160,209,146, 37, 75,142,189,255,254,251, 24, - 55,110, 28,182,108,217,130,141, 27, 55,222,165,105,250,135,186,234,209, 87,199,174,201,100,250,209,213,213,117,208,192,129, 3, -169,213,225,225, 12,199,113, 44, 69, 81,133, 0, 24,138,162,222,126, 28,171,203,164, 82,233,244, 5, 11, 22,168, 91,182,108, 73, -101,100,100,128,231,121,208, 52, 13, 87, 87, 87,204,152, 49, 67,250,249,231,159,123,221,186,117,235, 51, 0,243, 30,101, 90, 61, -252,221,234, 8,135,234,252,238, 95,215, 35, 54,148,246, 24,105,250,204,189,123,247,192,243, 60, 84, 42, 21, 40,138,146, 58,146, -180, 74,165, 18, 0, 16, 19, 19, 3,158,231,255, 41,107, 19, 64,117,108, 18, 0, 48, 12, 3,137, 68, 2,161, 80,104,232,215,230, - 77,208, 52, 45, 61,120,105, 99,117,134,220,212, 0,114, 5, 2,129, 88, 42,149, 66, 34,145,148,122,176,174, 94,189,186,221, 17, -239,213,115,154,158,224, 31,242, 12, 84,245,254,113,243,156,166, 39, 40,138, 90, 46, 18,137, 36,206,206,206,162,146,227, 22,139, - 69,228,236,236, 12,127,127,255,149, 0, 94,172,210,179, 66,211,109,156,157,157, 65, 81, 20,196, 98, 49,198,141, 27,135, 83,167, - 78,253,200, 48,204, 36,145, 72,132,232,232,232,213, 74,165,114,124,137, 14,136,141,141, 69,135, 14, 29,218,144,156, 92,203, 2, -203, 30, 15, 22, 77,211,118, 15, 17,190,244,210, 75, 16, 8, 4, 15,120,201, 42, 58, 78,211, 52, 85,221, 27,147, 72, 36,120,241, -197, 23,165,114,185,252,119,157, 54,112, 56,207,243,118,187,116, 94,157,127, 19,114, 27, 48,243,247, 82,113,213,208,215,215,247, -216, 75, 47,189,212,212,100, 50, 33, 43, 43,107,216,183,223,126, 59, 66,163,209, 64,127,253,148,100,242,164,233, 5, 0, 66, 29, -236,153,158,205,207,207,111,113,227,198,141,230,123,246,236,217, 57, 99,198, 12,152,205,102,103, 0, 78,227,199,143, 31,148,150, -150,118,151,227,184,179,246, 12, 33, 60,180,120, 64,108, 54,155,161,213,106,177,106,213, 42,105,137, 55,176, 91,183,110, 14, 13, - 23,178, 44,235,118,244,232, 81, 40,149, 74, 20, 20, 20,192,100, 50,193,102,179,129,231,121, 8, 4, 2, 72, 36, 18,244,234,213, -203,173,228, 30,171,186,198,157, 81,223,165,143,233, 63,189,215,154, 53,107,142, 2,104,246,238,187,239,162,117,235,214,120,238, -185,231,176,105,211, 38,124,251,237,183, 49, 52, 77,247,218,114,232,171,212,218,244, 64,213,164,225,214,105, 3,189,250,247,239, -255,109,143, 30, 61,168,240,240,112,158,231,121,170,120,152,123,188,205,102,139, 58,126,235,231,244,199, 81,104,105,154, 30, 24, - 16, 16, 64,229,228,228,128,231,121, 48, 12,243,192,107,198,140, 25,178,119,222,121,103,214,184,193,159,206, 16, 10,133,185, 54, -155,109, 91,126,126,254, 23,142,204,109,171,141,149,159,101, 63,175,204, 94,117,158,205,248, 97,179,162,205,102,115,227,135,202, - 1, 26, 52,104, 64, 9, 4, 2, 30, 0, 37, 16, 8,120,119,119,247, 77,179,222, 93,233,177, 96,205,251, 85,174,248,244,246,246, -142,144,201,100, 60, 0, 74, 34,145,240, 30, 30, 30,123,222, 28, 48,131,119,115,115,131, 84, 42, 45, 61,238,233,233,185, 97,214, -187, 43, 27,182,104,209,147, 29, 61,149, 52, 34,118,228,215, 82, 33, 84, 70, 16, 25, 67, 6,133,225,239,191,255,222,234,136, 40, -210, 27,162,204, 45, 92,251, 60, 32,172, 74,132, 22,195, 48, 14,175,234,253, 55,235,168, 72,167, 13,108,143,251, 43,184,171,124, -255,184,197, 85, 49, 65,114,185, 92,244,240,231,217,217,217,162,102,205,154,217,213,171, 17,139,197, 46, 50,153,236,190,177,160, - 32, 36, 38, 38, 90, 25,134,153,212,166,159, 27, 11, 0, 59,119,102, 79,202,202,202, 10,177,217,108, 66,129, 64,128,180,180, 52, - 52,109,218,212,133,228,230, 58,246, 96,149, 76,110,127, 88, 96,217,233,150,196,225,195,135,161, 84, 42, 75,189, 94,197,171, 5, -203, 61, 62,124,248,240,106,247, 30, 36, 18, 9,180, 90, 45,130,131,131,229,137,137,137, 27, 0,120, 87,211,115,229,209,184,113, -227,227,231,207,159,247,139,139,139,195,212,169, 83,177,114,229,202,211, 75,150, 44,105, 75,211, 52,221,217, 47, 79, 44, 97, 77, -157,202, 91, 65, 88, 81, 79,190,216, 27,118,254,247,223,127,255,170, 69,139, 22,173,124,124,124,156, 2, 3, 3,143,154, 76, 38, -237, 7, 31,124, 48,104,232,208,161, 47,182,105,211, 38, 3,192,218,138, 26,159,232,156,227, 15,216,189,119,239, 30, 82, 82, 82, - 74, 23, 9,104,181,218, 26, 15,181,222,189,123, 23, 9, 9, 9, 80, 40, 20, 80, 40, 20, 80, 42,149, 80, 42,149, 16,139,197,144, -203,229, 14,219,219,114,232,171,212, 55,250,125, 28,188,102,205,154,139, 93,187,118, 69,171, 86,173, 16, 29, 29,141,239,190,251, - 14, 52, 77,191,181,229,208, 87, 9, 85,121,253, 30,165,184, 26, 60,120,240,169,136,136, 8,175,115,231,206, 33, 59, 59,155,218, -190,125, 59, 79, 81, 20, 45, 20, 10,119,255,117, 61,226,177, 77,120,181,217,108, 42,177, 88, 12,171,213, 10,129, 64, 0,134, 97, - 74,255, 50, 12, 3, 47, 47, 47, 28, 58,116, 72, 80, 88, 88, 40,200,204,204,148,175, 91,183,238,131,115,231,206,121, 2, 8,126, - 90, 42, 46,179,217,220,248,212,169, 83, 2,134, 97, 74, 59,119, 44,203,130,101, 89, 88,173, 86, 88,173, 86, 44, 92,184,144,122, -229,149, 87,156, 50, 50, 50,132, 0, 88, 59,234, 39,239, 13, 27, 54, 80, 20, 69,225,235,175,191,166, 0, 48, 28,199,149,218,180, -217,108,152, 63,127, 62, 53,114,228, 72,151,140,140, 12,225,232,169,199, 73,152, 14, 59,196, 85,137, 8, 42,239, 85,205,252,175, -150, 74,165,185,197, 67,131,144, 72, 36, 56,123,246,236, 3,222, 43, 71,234, 15,189, 33,234,162, 35,239, 31, 55, 37,245,112,153, -169, 10, 0, 0,133, 66, 1,157, 78, 7,160,160, 74, 27, 42,149, 10, 2,129, 0, 60,207,195,104, 52, 34, 61,253,127,251,138,233, -233,233, 48,155,205,165,231, 22, 79,225, 32,212,150,192,226,121,222,174, 33, 66,123, 61, 88, 37,174,226, 63,255,252,179,220,201, -236, 21, 29,175, 14, 98,177, 24, 26,141, 6, 7, 15, 30, 52, 94,186,116,105,130, 35,223,253,121,118,115,128, 43, 66, 52, 0, 95, - 95,223,189,231,207,159,247, 43, 40, 40,192,143, 63,254,136,179,103,207, 70,235, 13, 81,253, 74,206,157, 53, 42,208,212,222, 7, -113,246, 54,240, 58,109,160, 87,155, 54,109,142, 79,154, 52,169,113,106,106, 42,102,207,158,109, 90,184,112, 97,159, 53,107,214, - 76, 80, 42,149,116,114,114,242,189,246,237,219, 39,233,245,250,201, 85,173, 32, 44, 17, 89, 2,129, 32,121,226,196,137, 62,197, -133,207,252,211, 79, 63,137,181, 90, 45,222,120,227, 13, 99, 74, 74,138, 20, 0, 68, 34, 81, 54,203,178,118, 79,204, 21, 8, 4, -105,227,199,143,119,171, 34,141,211, 28, 73,215,215,123, 79,243,164,105,122,123,104,104, 40, 90,181,106,133,107,215,174,161, 85, -171, 86, 8, 11, 11,195,146, 37, 75, 54,150, 76,124,175, 77,207,149,189, 60,252,140,134, 15, 31,126,122,235,214,173, 94,209,209, -209, 72, 78, 78,198,142, 29, 59,226,204,102,115,152, 68, 34, 25, 31, 27, 27,251, 88, 87, 13,114, 28, 39,162,105, 26, 37,175,135, - 61, 88, 37, 98, 75, 38,147,193,213,213, 21, 51,103,206, 20,141, 24, 49, 98,104, 61,232,121, 87,248,121,117, 68, 48,195, 48, 48, - 26,141, 48,153, 76,229,190,188,189,189, 29,158, 27, 73,211, 52, 44, 22, 11, 76, 38, 19,204,102, 51,204,102,115,169, 61,179,217, - 12, 79, 79,207,234,204,183,124,102,121,216,115, 85,242, 42,246, 92,209, 0,254, 4,224,208,196,113,189, 33,202,220,183,245,152, - 82, 15, 86,117,189, 87,117, 69, 93,172, 76, 44, 91,134,116, 58,221, 49,181, 90, 61,244,230,205,155, 15,120,177,130,131,131, 45, -254,254,254,199, 83,216, 75,246,136,180, 76,177, 88,220,192,104, 52,226,244,233,211,104,222,188,185,240,250,245,235,171,119,238, - 76,158, 4, 0,183,111,223, 94,157,150,150, 38,244,242,242,186,127, 79, 1, 1,200,205,205,205, 36, 57,250, 49, 8, 44,123,231, - 96, 81, 20,133,130,130, 2, 40,149, 74,168, 84,170, 82, 37, 14, 0,133,133,133,229, 30,175, 73,193,254,235,175,191,140,225,225, -225,163,244,134,168, 3,213,244, 94,249,125,240,193, 7,237,178,178,178,176, 98,197, 10,172, 95,191, 62,209,108, 54, 15,168,238, - 53,233,180,129, 94,237,218,181, 59,121,252,248,113,159,123,247,238, 33, 52, 52, 20,215,174, 93, 27, 50,116,232,208,182,168, 70, -160,209, 18, 97,176,113,255, 18,223,146,247, 99,250, 79,183,170,213,106, 40,149, 74,164,167,167,139, 0, 72, 35, 34,151, 57,236, -109,217,116,224, 75,119,123,127,223, 30, 70, 5,126,208, 64, 40, 20, 30, 11, 13, 13,245, 15, 14, 14,198,134, 13, 27,176,114,229, - 74,148,204,193, 2,224,187,100,201,146, 99, 99, 7,126,210,125,211,129, 47, 19,107,218,112,215, 32,144,172,124,216,176, 97, 39, -182,111,223,238,149,158,158,142, 98, 17, 28,151,156,156,220, 91,111,136,186, 7, 96, 71, 61, 40,183, 84, 98, 98, 34, 54,111,222, - 12,150,101,241,230,155,111,162, 81,163, 70,165, 2, 43, 37, 37, 5,235,214,173, 3,199,113,152, 48, 97, 2,124,124,124, 96,181, - 90,165, 19, 95,154, 35,168, 40,104,239,195,233,245,164, 76,188, 46, 27,151,239,225,151,197, 98,169,117,219, 53,181,249,172, 11, -172,115,231,206,109, 23,137, 68, 60, 0,187,135, 5,203, 35,242,234, 22,201,168,192, 15, 76, 18,137, 68,124,242,228, 73,135,134, - 25,107, 90, 71,216,209,206,213,234,202,196,135,203, 98, 64, 64,192, 52, 79, 79,207,126, 29, 58,116,192,245,235,215, 69, 18,137, - 4, 99,198,140,177,188,248,226,139, 22,129, 64,240, 62,114,171,190, 70,185, 92,126, 69,165, 82,245, 75, 78, 78,134,213,106,197, -193,131, 7,225,234,234, 58,222,100, 50,133, 36, 39, 39, 35, 53, 53, 85, 40,151,203, 65,211, 52, 4, 2, 1, 6, 12, 24,128,228, -228,228, 43, 36, 71,215,162,192,178, 90,173,240,245,245, 45, 13,175, 80,210, 91, 46,219,107,118,100,130, 59, 0,152, 76,166,210, -225,166, 18, 49, 69, 81, 20,204,102,243,255, 28,175, 9, 23, 47, 94, 60,121,231,206,157,175,245,134,168,189,142,126,183,100, 14, - 22,128,152, 13, 27, 54, 92,248,231,159,127, 58, 92,189,122, 53,198,100, 50,245,126, 56, 98,123, 89,111,151,189,226, 42, 62, 62, - 30, 27, 55,110,196,201,147, 39,245,122, 67,212, 17, 0, 71,106,177,112,163,100,108,189, 62, 33, 20, 10, 39,142, 29, 59,182,172, -184,138,166, 40,234,245,149, 43, 87, 70, 0,104, 54,110,220, 56, 24, 12, 6,223,240,240,240, 57,184, 31,217,190, 86,188, 81,142, -226,227,227,179,122,211,166, 77,190, 28,199, 33, 51, 51, 19,239,191,255,126,108,124,124,124,111, 71,131,200,214,177, 7,139,159, - 54,109, 26,214,174, 93, 11,154,166, 17, 18, 18,130,220,220,255,175, 85,157,157,157,203,251,140, 65, 61, 10,218, 91, 91,226,170, - 50, 44, 22, 11, 28,157,163, 92,219, 54, 31, 30,202,127,148, 13,125,125, 18, 88, 55,110,220, 40, 17, 86, 33, 53, 17, 86, 15,219, -174,238, 48,227,147,204,231, 43,222, 73,252,103,119, 92,203, 6, 13, 26, 44,127,243,205, 55,123, 55,108,216,144,150, 72, 36,199, - 4, 2,193,212,219,185, 39, 98,237,106,248, 5,130, 16,181, 90, 29, 47, 20, 10, 5,177,177,177,136,137,137, 65,108,108, 44, 0, - 8,141, 70, 35, 60, 60, 60, 74, 61,181,227,198,141,131,147,147,147,237,202,149, 43, 33, 68, 50,213,162,192, 58,185, 39, 20,187, -162, 40,176,118, 56,112,237, 21, 90,113,215, 55, 96,203, 31,241,176,218,184, 7, 42,180,248, 27, 27,177,229,143,120,216, 88,222, - 97,155,229,177,247,220,186,160,154, 38,142,222, 16,197,235,180,129,157,207,158, 61,235, 7, 32, 65,111,136, 50, 87,215,150,187, -187,251, 55,199,143, 31,247, 73, 72, 72,192, 79, 63,253,132,213,171, 87, 39,154, 76,166,129,117, 32,100,146,187,117,235,230, 3, - 56, 62, 44, 88,167, 46, 23,138, 98,210,211,211,177,124,249,114,108,217,178,229, 54,199,113,189,182,255,181, 60,121, 76,255,233, -189, 86,174, 92,121, 52, 39, 39,167, 89,126,126, 62,120,158,207,174,137,247,170, 38,141, 85, 27,143, 1,189,190,255,254,251, 97, -106,181,154, 58,126,252, 56,251,246,219,111,199,222,187,119,175,111,117,183, 65,170, 43,182, 30,254, 90, 52,125,236, 87,145, 0, -250,220,184,113, 3, 28,199,157,140,136, 92,214,189,228,243,202, 62,123,212, 84, 20,104,178, 54, 34,237, 87, 37,116,204,102,199, -139,107, 85, 54, 31,158,247, 82, 83,145, 85,155,226,170,166,123,164,150,183, 40,161,178,133, 10,149,253, 94,201,185, 73, 73, 73, -187, 0, 8,107, 83, 88,149,240,207, 63,255,236, 40,182,189,183,182,109,215, 80,248,215,217,202,196,146, 52,127,126,168,111, 2, -128,151,129, 44,164, 35, 11, 48,225,254,203, 78,190,223, 57, 59,101,238,148,213, 51, 91,182,108,185, 84,173, 86,227,218,181,107, -224,184,251,109,114,137,104, 21, 8, 4, 24, 55,110, 28,198,143, 31,143,125,251,246,205,108,219,223,157,196,192,170, 45,129, 37, - 18,137, 98, 71, 4,113, 77,179,185,158, 96,185,170,231, 28, 36, 37, 37,165, 22, 20, 20, 88,170,104,252, 99,123, 4,232,155, 38, - 24,250,195,198, 82,165, 21,154, 94,175, 71,143, 0, 61, 18, 12,253, 31,248,173,184,184,184,212, 99,199,142, 61,114,159,124, 89, -175, 84,177,251,246, 78, 85,222,174,146, 21,135, 21,161, 82,169,218,223,188,121, 19, 59,119,238,196, 15, 63,252,144, 88, 84, 84, -212,163,182, 27,238,231, 52, 61,241,247,223,127,251,214,102, 69,108,239, 80, 81, 85, 54, 45, 22,203,210, 3, 7, 14,176, 60,207, -107, 25,134,249, 50, 34,114, 89, 42,112,127,226,123,112,223,208, 30,155, 55,111,126, 15,128, 76, 40, 20,126, 81,221,225,169,154, - 54, 86,206,206,206,243,131,130,130, 84, 31,125,244, 81,246,174, 93,187,254,138,137,137,121, 91,111,136,202,175,143, 5, 55, 57, - 57,121,226,164, 73,147,194, 77, 38,147,160,160,160, 96,162,189,159, 61, 77,240, 60, 15,145, 72, 4,154,166, 33, 20, 10, 33, 22, -139, 33,145, 72, 96, 54,155, 97, 52, 26, 81, 88, 88, 88,218,104, 56, 98,179,100,149, 44,195, 48,165,187, 86,136, 68, 34,152, 76, - 38, 20, 21, 21, 57,108,243, 81,120,169,106, 35,172, 70,117,142,217, 65,136, 61,117, 73, 53,235,164, 16, 71,235,169, 71, 65,109, -175, 76,172,171,188, 51,247,135, 73, 95,125, 55,123, 39,218,183,111,191,168, 83,167, 78,130,248,248,120,164,167,167, 67, 40, 20, -162, 89,179,102,232,223,191, 63, 92, 92, 92,108,251,246,237,155,217,172,167,134, 68,113,175,142, 99,161, 34, 49,221,177, 99, 71, -119,137, 68,114,210,100, 50,249, 85,101, 68, 42,149, 38, 27,141,198,174, 17,145,203,226, 43, 59,111, 76,255,233,238, 34,145,232, - 1,155, 20, 69,241, 66,161,240,128,213,106, 29,192,243,124,169,186,146,201,100, 9, 22,139,229, 5,123,231,227, 56, 42, 20, 42, -237,125, 93,157,108, 2, 80,186, 69,206,195, 91,230, 60,252, 94,110,131,116,230,239,149, 79, 86,212,105, 3,135,107,181,218,133, -133,133,133,185, 22,139, 37,184,174,188, 34,143, 99, 79,185,199, 97,179, 46, 54,114,214,105, 3,189,188,188,188,118,230,229,229, -205, 61, 23,183,251,224,179, 92, 49,212,214, 6,221,246,122,176, 28,125,142,111, 15,249, 44,209,102,179,185,151,157,112, 94, 82, -151,149,252,229, 56, 14, 52, 77,231, 73,165,210, 6,246,108, 24, 95, 23, 54,235,250,217,144,205,148, 9, 53,101,195,151, 7, 60, -220,221,221, 55,122,122,122,182,241,247,247,119, 81,169, 84,200,205,205,205, 52, 24, 12, 87, 50, 50, 50, 66,202,122,174, 28, 17, -178, 51,102,204,168,180, 47,179,116,233, 82,234,105, 79, 91,170, 42,111, 37, 41,192,207, 54,181, 93,153,147,198,225,217,205, 71, -149, 77,164,119, 52, 47,204,122,119, 37, 83, 28,126,161, 42,108,246, 10,161,186,176, 73,168, 59,129, 79,168,223, 84, 33,176,176, -116,233,210,167, 62, 13,136,192, 34, 16, 8, 4, 34, 68, 8,132,218, 22, 88, 60, 30, 28, 6, 45,251,254,153,240, 96,145,128, 46, - 4, 2,129, 64, 32, 16, 8, 68, 96, 17, 8, 4, 2,129, 64, 32,212,111, 4, 36, 9, 8,132,186,167,166,147,186, 31,149,205, 39, - 45, 77,107,251,126,237,221, 91,243,113, 95, 39,129, 64, 32, 2,139, 64,120, 36, 98,197, 17, 72, 99,247,244, 60,255,218, 18, 68, -229,197,229,170,169,221,186,184, 78, 2,225, 9,130,194,253,121, 87,207,110, 2,212, 32,230, 25,129, 64, 32,148, 43, 96,107, 43, -126,218,227, 34,184,111,232, 30, 0, 47, 22,191,221, 27, 17,185,108,200,179, 42, 98,107, 26,192,180, 54,159,121,125,177, 73, 22, - 23, 16,170, 45,176,170,138,160,126,117,178,243,110,158,231, 59,131, 17, 13,104,243,125,234,229,135, 63, 39,162,141,240, 40, 26, -113,123, 42, 59,123,207, 43,239,252,224,190,161,109,132, 66,225, 39, 20, 69,117,181, 90,173,222, 34,145, 40, 9,192, 25,179,217, -188, 52, 34,114,217, 5, 82,217, 62, 90,129, 85,151,158,203,224,190,161,238, 0, 86, 3, 16, 3,152, 10, 64,191,127,255,126,176, - 44,139, 33, 67,134, 0,128, 14,192, 10,133, 66,193, 21, 20, 20,188, 19, 17,185, 44,181,170,161,191,199, 21, 48,183,188,223,174, - 47, 34,169, 38,246,106, 43, 54, 91, 89,222, 28, 48, 35,149,101, 89, 55,123,207, 23,137, 68, 25, 98,177,216,243,232,209,163, 36, - 76, 7,161, 74,170, 59, 68,216,207,235,249,254,226,148,107,103,118, 94,153,236, 54,185,205,170,180, 72, 71, 50,190, 78, 27,232, - 34, 22,139, 95, 87, 40, 20,253, 56,142,107,202, 48,204,205,188,188,188,195, 22,139,101, 91,109, 69,206,214,105, 3,181,206, 74, -193, 39,167,226,143,204, 36, 61,144,167,191,151, 93,213, 57,142, 84,188,193,125, 67, 25,134, 97,230,186,184,184, 76, 15, 11, 11, -147,248,249,249, 65,169, 84, 34, 45, 45,205, 87,175,215,251,172, 90,181,106,216,184,193,159,126,103,177, 88, 62,143,136, 92, 70, - 42,218,167,131,213, 95,126,249,229,112,149, 74,133, 79, 62,249,228, 86,227,198,141,161, 86,171, 17, 30, 30, 14, 39, 39, 39,176, - 44,123,235,171,175,190,162,226,227,227,177, 98,197,138,117,248,127,239,214, 51, 89,190,170, 51,175,172, 38,246,106,187,190, 46, -177,199,178,172, 91,100,100, 36, 84, 42, 85,149,142,134,204,204, 76, 12, 25, 50,196, 9, 79,217,158,158,132,122, 38,176, 56,155, - 21, 92,110,114,182, 95,215, 62, 77, 99,206, 28,221,113,229, 61,247,215,218,124,159, 26,105,207,119,219,120, 12,120,189,117,235, -214,223,174, 88,177,194,165, 73,147, 38,148, 76, 38, 67,114,114,114,243,203,151, 47,143,156, 51,103,206,156, 86,110,253,222,186, -150,118,248, 80, 77,111,204,195,137, 89,170,144, 49,111,180,114,233,125,230, 90,230, 95,187,234, 99,226,119,233,210,229,160,213, -106, 93,178,237,200, 55,127,213, 39, 81, 82, 89,143, 48,184,111,104,119,145, 72, 52, 71, 44, 22, 15,170,203, 96,139,143, 83, 0, - 51, 12, 51,167,123,247,238,211,231,205,155, 39,185,119,239, 30,110,221,186,133,228,228,100,248,249,249,193,207,207,143, 90,177, - 98,133,244,219,111,191,253,224,242,229,203, 52,128, 25,246,166,163, 78, 27, 72,123,120,120,140,239,219,183,239, 43,174,174,174, -154,196,196,196,156,227,199,143,255,145,154,154,186, 70,111,136,170, 86, 90,234,180,129,180,171,171,235,184,161, 67,135,190,226, -236,236,236,148,156,156,156, 29, 25, 25,249, 71, 90, 90,218,143,122, 67, 20, 87,157,116, 44,121,230,203, 62,141,232, 96, 52, 26, - 7, 91, 44, 22, 47, 0, 80,169, 84, 49, 13, 27, 54, 60,240,250,135, 65,151,171,235, 73,120,216,166, 66,161,136,245,240,240, 56, - 48, 38,180,239, 37, 71,174,177,115,231,206,238, 28,199, 29, 6,208,178,146,211,174,211, 52,221,239,236,217,179,169,246, 56, 39, - 46, 95,190,140,182,109,219, 98,235,214,173, 20,195, 48, 56,115,230, 12,100, 50, 25,198,141, 27,135,214,173, 91, 83, 82,169, 20, -119,238,220, 65, 94, 94,222, 83, 21,191,167, 46,203,154, 78, 27,248, 7, 0,103, 0,163,244,134,168,212, 50,199, 93, 1,252, 1, - 32,139,231,249, 97,142,136,182,202,188,210,213,177, 33, 18,137,176,107,215, 46, 8, 4, 2, 8,133, 66,100,101,101,193,199,199, -167,116,139, 36,161, 80, 88,250,151, 64,168, 53,129,117,237, 45,188,192, 50,242,173, 15,168,122,161,204,135,183, 22,197,167, 92, - 58,158,225,231,222,196,169, 81,247,193, 78,183,247,111, 94,119,121,114,131, 73,109, 87,165,239,175,204, 94, 91,207,129, 31, 78, -158, 60,121,241,252,249,243,165, 55,111,222,196,245,235,215, 97,179,217,160, 84, 42,209,186,117,107,122,239,222,189,158, 83,167, - 78,221,217,218,189,255,219, 87, 83, 15,253, 90,131, 66,221,168,189, 78, 53,124,239, 82,157,164,253, 91, 87,151,235,180,129,123, -244,134, 40,182,190, 37,190,205,102,235, 47, 20, 10,187,141,238,243,209,176, 71, 41,178,170, 75,112,223,208,238, 66,161,112,191, -197, 98,145,139,197,226,199,218,139,115,180, 81,176,183,226, 13,238, 27,218, 70,171,213, 78,159, 59,119,174,228,244,233,211,200, -206,206, 70, 90, 90, 26,166, 78,157,138, 85,171, 86,161, 85,171, 86, 80, 40, 20,248,240,195, 15,165, 83,166, 76,153, 18,220, 55, -244,231,136,200,101,231,236, 17, 66, 65, 65, 65, 17,155, 55,111,246,179,217,108, 52, 0, 88,173, 86,167,248,248,248,144,176,176, -176, 32,157, 54, 48,216, 81,145,165,211, 6,210,221,186,117,219,188,101,203, 22,127,177, 88, 76,219,108, 54,112, 28,215, 96,236, -216,177,239,124,254,249,231,189,117,218,192, 55,120,158,175, 86,190, 95, 28,186,225, 77, 0, 61, 6, 15, 30,124,175,121,243,230, - 87,104,154,230,227,226,226,148, 73, 73, 73,227,111, 28,205, 58,213,162,151,115,132,163, 54,151,206,216, 60,134,101,217,158, 3, - 7, 14,188,215,178,101,203, 43, 52, 77,243, 49, 49, 49,170,184,184,184, 9,151, 14,166,156,110, 55,192, 99,179,221,157, 60,142, - 59, 60,115,230,204,150, 2,129, 0, 86,171, 21, 54,155, 13, 44,203,194,102,179,149,254,111, 50,153, 90,110,218,180,233, 48,128, - 86,118,152,124,127,219,182,109,250,236,236,108,193,249,243,231, 33,149, 74, 33,147,201, 32,147,201, 32,149, 74,145,146,146, 2, -179,217,140,159,127,254,217, 6,224,131,167,177, 49,168, 44,210,126, 13,208, 2,232, 14,224,168, 78, 27,216, 75,111,136, 74, 45, - 22, 87, 71,138,159,203,223,245,160, 30,134, 80, 40,132, 64, 32,192,129, 3, 7,176, 98,197, 10,236,220,185, 19,126,126,126, 16, - 10,133, 15,188, 8,132, 90, 19, 88,156, 80,125,188,217,160,209, 12, 40, 6, 20, 77, 3, 20, 3,214,102, 5, 35,146, 52, 2,248, - 70,160, 24,240,150,124,248,245,126,217,227,206,254,205,187, 46,142, 19,143,106,191,193,188,171,130,198,160,113,231,206,157,231, - 45, 88,176, 64, 26, 25, 25,137,127,255,253, 23, 11, 23, 46, 68,113, 47, 22,251,246,237, 3,203,178,248,250,235,175, 85,131, 7, - 15,254, 65,167, 13, 60,166, 55, 68,101, 85,203,123,229, 34, 88,181,239,143,141, 46,110,194,104,188, 61, 34,215,229,251, 29, 49, - 83, 0,124, 87, 31, 31, 64, 88, 88,152,252,203, 47,191,252,179,190,139,172,224,190,161,221, 37, 18,201,254,217,179,103, 43,102, -207,158,205,214,150, 77,129, 64,176,209,106,181, 78,168, 47,247, 46, 20, 10, 63,156, 62,125,186, 52, 33, 33, 1, 6,131, 1, 18, -137,228,129,205,125, 37, 18, 9,104,154,134, 88, 44, 70, 72, 72,136,116,221,186,117,161, 0, 70, 87,153, 39, 61, 60,198,111,218, -180,201,207, 98,177,208, 5, 5, 5,165,189,227, 86,173, 90, 49, 51,102,204,240,153, 54,109,218, 36, 0, 43, 29,185, 86, 39, 39, -167,144,205,155, 55,251,139,197, 98, 58, 57, 57, 25,221,187,119,199,153, 51,103,208,165, 75, 23,102,198,140, 25,190,239,189,247, -222, 4,220,159, 87,228, 16, 75, 62,222,216, 1, 64,143, 79, 63,253,244,162, 82,169,180,149,249,189,236,230,205,155,231,165,167, -167, 7, 90, 18,101,122,145, 87,246, 5,123,109, 46,255,108,123, 91,150,101,123,126,248,225,135, 87,150, 46, 93,218,113,234,212, -169, 65, 0,208,191,127,255,163,179,102,205, 58,159,150,150, 22,100,208,139,111,105,117,230,115,118,154,108,153,148,148,132,253, -251, 43,238,211, 53,110,220, 24, 85,120,184, 74,242,225, 30, 0, 47,182,106,213, 10,147, 39, 79,198,111,191,253,134,141, 27, 55, -150,126, 62,106,212, 40,188,244,210, 75, 40, 40, 40,128,187,187,187, 32, 41, 41,233, 78,112,223,208,189,231,207,159,175, 55, 19, -223,235,241, 42,197,151, 0, 68, 2,104, 87, 44,178, 94, 1,176,173, 88, 92,253, 11, 96, 84,125, 17, 88, 73, 73, 73, 88,189,122, - 53,198,142, 29,139,206,157, 59, 35, 55, 55,151, 8, 44, 66,221, 9, 44,153,132,222,113,247,216,174,145, 86,147, 81,228,162,235, -152,227,252, 92, 27, 39,161,115, 67,208,254,253, 65,187,183, 6,207,218,192, 27,238, 2,199, 22, 9,125,187, 13, 50,198,253,189, -239,215, 75,227,149,237, 1, 92,125,216,150, 74,165,154,189,102,205, 26,205,149, 43, 87,112,235,214, 45,124,243,205, 55,248,239, -127,255, 11,145, 72,132,236,236,108, 12, 31, 62, 28, 39, 79,158,132,217,108,198,103,159,125,230,252,233,167,159,190, 15, 96, 94, - 53,188, 87, 29,198,191,214,229,121,129,186, 57,186, 15, 26,143,131, 63, 4, 41, 54,236, 78,154,169,211, 6,174,215, 27,162, 10, -235, 93,237,243,210, 75, 72, 77, 77,149,111,222,188,185,218, 34,107,236,192, 79, 14,218,108,182,254, 85,157, 39,147,201,254, 58, -126,252,120,159,234,138,171,117,235,214, 41,180, 90,109,149,139, 32, 28,176,185,111,210,164, 73,202,239,191,255,126,247,232, 62, - 31, 13,173, 15, 34,139,166,233,110, 77,154, 52, 65, 92, 92, 28, 82, 83, 83, 97, 50,153,144,154,122,127,100, 35, 33, 33, 1,222, -222,222,112,114,114,130,183,183, 55,154, 53,107, 70,209, 52,221,197, 30,187,189,123,247, 30, 1,128,190,115,231, 14,210,211,211, -161,209,104,160, 80, 40,224,229,229,133, 62,125,250, 8,252,253,253, 95,116, 84, 96, 13, 30, 60,248, 21,185, 92, 78,199,198,198, - 34, 38, 38, 6, 38,147, 9,122,189, 30, 26,141, 6,253,250,245, 19,234,116,186, 97,213, 17, 88,102,179,121,224,208,161, 67,239, -149, 21, 87, 37,136,197, 98,155,171,171,107,188, 82,169, 28,154, 13,251, 5, 86, 97, 97,225,160,126,253,250,197, 44, 93,186,180, - 99, 68, 68,196,184,146,227, 91,183,110,125, 75, 36, 18,217,194,194,194,226, 36, 18,201, 8, 95,141,239, 57,123,133, 66,183,110, -221, 82,125,125,125,243,196, 98, 49,196, 98, 49, 68, 34, 17, 74,254, 23,139,197,144, 72, 36,212,200,145, 35,253,237,184,188, 23, -247,239,223, 15,181, 90, 93, 58, 44, 88,156,190, 31,104, 52,154, 32,163,209,248,242,158, 61,123, 96, 48, 24,208,164, 73, 19,184, -185,185,225,204,153, 51,245,102, 14,150, 78, 27,216, 25,192, 50, 0,102, 0,159,235, 13, 81,103,106, 75,176, 85,247,187, 37,207, - 79,111,136,202,214,105, 3,251, 22,123,172,218, 2,184,128,251, 11, 9,254, 5,208, 75,111,136, 74,171,237,107,115,116, 5, 36, -203,178, 16, 10,133, 88,180,104, 17,204,102, 51,206,159, 63,143, 87, 94,121,165,164, 62,128, 66,161,192,247,223,127, 15, 87, 87, - 87,162, 24, 8,181, 39,176,252,191, 53,188,113,229, 61,247, 87,193,178, 91,157,253, 91,105,104, 10,160,253, 7, 96,223, 61, 57, -230,253,103, 43,220,156,100,152, 52,172, 13, 94, 28,180, 20,220,186,190, 82, 87, 95, 95, 67, 70,204,221, 79, 0,140, 41,167,225, -234,234,227,227,131,168,168, 40,248,249,249, 97,246,236,217,104,222,188, 57,228,114, 57, 82, 83, 83, 81, 80, 80, 0,133, 66, 1, -150,101,209,177, 99, 71, 70,169, 84,246,174,142,192,242,112, 18,252,248,205, 87, 11,181,153,119,182,226,252,191, 6,200, 53,222, -248,252,221, 78, 78,115,127, 56, 55, 7,192, 39,245,241, 33,180,108,217, 18, 83,167, 78,149,127,247,221,119,213, 18, 89, 54,155, -109,190, 64, 32,232,254,241,199, 31,203, 70,141,250,223, 14,225,245,235,215, 49,105,210,164,162,194,194,194, 47,170, 35,132,196, - 98,241,254, 31,127,252, 81,161,209,104, 16, 23, 23, 87,107,222,176, 31,127,252, 81,161, 82,169, 96,177, 88,100,235,214,173,171, - 23, 34,203,102,179,249,202,229,114,100,100,100, 96,218,180,105, 15,172,136, 45,241,184, 2,192,173, 91,183,224,237,237, 13,163, -209,232,101,143, 93,103,103,103, 39,158,231, 49, 97,194, 4,196,199,199,151, 30,247,242,242, 66,124,124, 60,108, 54,155,179,163, -215,234,228,228,228,108,181, 90, 17, 20, 20, 4,163,209, 8, 0,120,237,181,215, 32, 20, 10,145,150,150, 6,171,213,234, 82,205, - 52,240,106,209,162,197,213,138, 62,151, 72, 36,121, 74,165,178,115,182,209,126,155, 38,147,169, 97, 64, 64,192,191,161,161,161, - 65, 15,127,118,224,192,129, 94,243,231,207,255, 78, 46,151,119,117,240, 82, 57,137, 68,242,128,176,146, 72, 36, 16,139,197, 37, -243,102,236, 94,206,204,178, 44,194,195,195, 75,135, 5,139,197,100,247,208,208,208,151, 43, 42,179,245,136,165, 0,186, 21,255, -191,234, 57, 77,207,118,143, 67, 92, 85,244,189, 98,145,245, 26,128, 43, 0, 36,197, 66,240,181,242,196,213,227, 8,202,202,178, - 44, 24,134, 41,245, 84,203,229,114,116,232,208,161, 84, 96, 21, 21, 21,149,206,207, 34, 16, 28,234,176, 87,246,225,149, 73, 46, - 67,120, 75,209,166,231,134,142,163, 24,169,138, 70, 97, 6,168, 6, 1, 88,253,231, 21, 0, 64, 90,118, 17, 86,255,121, 5,188, -212, 5,188,218, 23, 90, 37,180, 0,134,149,103,171, 65,131, 6,174, 54,155,173,180, 71,208,188,121,115,200,100, 50,100,100,100, -224,195, 15, 63,196,254,253,251, 97, 54,155, 33, 18,137,208,164, 73, 19, 88,173,214,166,142,222, 76,115,151,192, 33, 83,198,245, -247, 83,184,232,128,236,226, 66,170,238,128,119, 95,235, 32, 86, 42, 36, 33, 58,109,160, 91,125,124, 8, 74,165, 18,237,218,181, -195, 27,111,188, 33,151, 72, 36, 27, 29,253,126, 68,228,178,191,109, 54,219,128,101,203,150, 21,173, 88,177, 2, 39, 78,156,192, -229,203,151,113,247,238, 93, 28, 60,120, 16, 19, 39, 78, 52, 26,141,198,106,137, 23,129, 64,240,211, 59,239,188,163, 80,171,213, -184,115,231, 14,148, 74,101,173,136,171,245,235,215, 43,180, 90, 45, 98, 98, 98,208,177, 99, 71,204,154, 53, 75, 38,149, 74,119, -143,238,243, 81,239,199,249, 44,132, 66, 97, 66,122,122, 58,124,124,124,176,110,221, 58,108,216,176, 1, 95,124,113, 95,151, 46, - 90,180, 8, 71,143, 30,197,133, 11, 23,224,227,227,131,140,140, 12,200,100,178,100,123,236, 38, 38, 38,102, 1,192,254,253,251, -113,244,232,209,210,215,137, 19, 39,144,149,149, 5,147,201,148,233,232,181, 38, 38, 38,102, 2,192,165, 75,151, 74,135,202,126, -255,253,119,196,196,196,128,101, 89, 88, 44,150,204,234,164, 1,195, 48, 44, 77,211,149,229, 9,208, 52,173,112, 48, 31,113, 2, -129,160, 34,193,195, 51, 12, 3,185, 92, 46,113,240, 58,249, 18, 65,245,176,184, 42,121,111, 39,187,134, 12, 25,130,221,187,119, -151, 10,172,145, 35, 71,194,100, 50,189, 6, 0,139, 23, 47, 6, 69, 81,160, 40, 10,115,231,206, 45,241,200,153,234, 81, 21,162, - 41,171,143, 31,133,184, 42, 79, 4, 69,231, 28, 47,247,120,241,156,171, 95,138,197,149,169,216,131,245,179, 78, 27,232,110,143, - 93,123, 61, 81,213,133,227, 56,136, 68, 34, 44, 90,180, 8, 98,177, 24, 13, 26, 52,192,172, 89,179, 48,111,222, 60,204,159, 63, - 31,223,124,243, 13, 26, 52,104, 64, 4, 22,161,246, 4,214,181, 49,120, 1,188,237,143,102, 67,198,138, 77,134, 12, 75, 97,210, - 93, 43,111, 41,168, 32, 46, 43, 15, 86,168, 2, 13, 22,160,202,175,120, 51, 51, 51,243, 45, 22, 11,100, 50, 89,105, 69,152,145, -145,129,217,179,103, 99,199,142, 29,104,220,184, 49, 56,142, 43, 61, 46, 18,137, 82, 28,185, 17,157, 54,144,113, 85, 51,223,126, -242,217,127, 85, 72, 92, 7,173, 74,140,222, 93,253, 1, 69, 11, 48, 66, 49,150,205, 26,234,236,238,170, 94, 94, 95, 5, 86, 66, - 66, 2, 34, 34, 34, 10, 77, 38, 83, 72,117,108, 68, 68, 46,251,219,106,181, 14,216,177, 99, 71, 81, 76, 76, 12,100, 50, 25,244, -122, 61,254,251,223,255, 26, 77, 38,211,144,234,122,134,108, 54,219, 91,107,215,174, 45,216,189,123, 55,148, 74,101,185,203,153, - 29, 17, 87, 66,161,112,255,103,159,125,166,208,106,181,136,143,143,135,179,179, 51, 92, 92, 92,208,189,123,119,124,247,221,119, - 50,153, 76,246, 88, 69, 22,199,113, 39,163,163,163,121,141, 70,131,102,205,154,161, 85,171, 86,120,254,249,231, 1, 0,109,219, -182, 69,243,230,205,225,231,231, 7, 0,184,125,251, 54, 0,252, 99,143,221,227,199,143,255,113,235,214, 45,214,195,195, 3,109, -218,180, 65,199,142, 29,209,181,107, 87,248,250,250, 98,245,234,213,150,216,216,216, 61,142, 94,235,145, 35, 71,126,191,122,245, -170,173, 97,195,134,232,208,161, 3, 36, 18, 9, 90,183,110, 13, 79, 79, 79,172, 94,189,218,114,239,222,189, 61,213, 73, 3,173, - 86,123, 55, 57, 57,185, 66, 1, 37, 18,137,220, 56,142, 75,116,208,230,189,228,228,100, 85,255,254,253,143, 62,252,217,224,193, -131,143, 74,165,210, 6, 28,199, 37, 86,212, 72,151, 91,121,209, 52, 47, 22,139, 33,149, 74, 81, 86,104, 73,165, 82, 72,165, 82, -136,197, 98,123,203,206, 8, 0,207, 89,173, 86, 91,171, 86,173, 32,151,203, 49,106,212, 40,136, 68, 34, 0,192,167,159,126, 10, -158,231,193,243,124,169,192,202,207,207, 55,214,163, 42,100, 90,177,119,232, 14,128,176,218, 54, 94,242, 76,236,125, 46, 15,133, -228, 41, 59,161,253, 6,238, 15, 19, 94, 5,208, 12,247,231,100,185,219, 43,162,234, 74,100,241, 60, 15,161, 80, 8,157, 78,135, -176,176, 48,236,221,187, 23,122,189, 30, 44,203,130,231,121,208, 52, 77,230, 96, 17,106, 79, 96,233,223,194,107,188, 66,123, 66, - 55,240,117, 70,191, 63,130,139,141,220,110,182, 21,230,228,193,104,128, 57,238, 44, 38, 13,107, 3, 0,165, 67,132,198,124, 3, -232,152,195,224,133,114, 0, 40,183,226,161, 40,234, 66, 76, 76, 12, 52, 26, 77,105,239,178,117,235,214, 56,117,234, 20,116, 58, - 29, 88,150, 45,173, 36,175, 93,187, 6,179,217, 28,229,200,141, 40,100,244,187, 75, 62, 31,237, 46,146,168,128,172, 40,168,213, - 74,172, 91,253, 21, 96, 74, 2,104, 49,134,245,107,199,120,186,107,251,232,180,129,205,234,219, 67,136,139,139,195,220,185,115, - 11,139,138,138,106, 52,209, 61, 34,114,217,223, 22,139,101,192,234,213,171,139,118,239,222,141, 47,190,248,162, 70,226,170,140, -112, 27,180,113,227,198,130,184,184,184, 26,121,176,132, 66,225, 76,171,213,170,248,207,127,254,131, 65,131, 6, 97,242,228,201, - 24, 51,102, 12,134, 13, 27,134, 94,189,122, 97,194,132, 9, 48, 26,141, 50,133, 66, 49,231,113, 61, 11,139,197,178,114,213,170, - 85, 70,154,166,161, 84, 42, 75,123,180, 37, 66,184,100, 56,202, 98,177,224,135, 31,126, 40,202,207,207,183, 75,180,103,102,102, -174,155, 49, 99,198,189,131, 7, 15, 90,115,115,115, 1, 0, 73, 73, 73,248,226,139, 47, 44,107,215,174, 77, 52, 24, 12,107, 28, -189,214,220,220,220,159, 62,249,228,147,152, 61,123,246, 88,105,154, 70,118,118, 54,180, 90,109,169,205,188,188,188, 53,213, 73, - 3, 95, 95,223,200,204,204, 76, 47,139,197, 34, 44,199,107, 36,145, 74,165, 29,112,127,162,178,221, 52,110,220,248,112,102,102, -166,215,172, 89,179, 46,188,245,214, 91,107, 61, 60, 60,238,120,120,120,220,126,231,157,119,214,204,153, 51,231,154, 68, 34,105, -231,168, 77,161, 80,200,149,245, 94,149,188,202, 30,115,128,111,191,252,242, 75,129, 76, 38,131,217,108, 70,126,126, 62, 50, 51, -239, 59, 0, 43,240, 96, 73,235, 75,253,161, 55, 68, 29,229,121,190, 45,207,243,254, 60,207,255, 85,219, 65, 64,107,232, 13,139, - 40, 22, 87,215,113,127,206,149, 30, 64, 31, 0,215,138, 69,214, 30, 71,196, 83, 89,177, 87,153,183,203, 17, 65, 88, 34,176,132, - 66, 33,198,140, 25,131,147, 39, 79, 34, 32, 32,224,127, 38,184, 87,230,213, 37, 16,202,163,220, 57, 88, 70,129,114,131,174,223, - 40, 90,127, 96, 59, 11,142,253,216, 6,166,125,166,254,124,123,185,175,214,153, 95,215, 29,189, 67, 34, 49,100,205, 27, 96,109, - 54, 20,165,221, 1,251, 99, 15, 8,204,185, 48,176, 46,133,160,168,163,229,217,204,202,202, 90, 58,127,254,252, 94,171, 87,175, -118, 42, 89,157,145,144,144,128,222,189,123,227,198,141, 27, 0, 0,177, 88, 12,154,166, 49,123,246,236,244,140,140, 12,187, 39, -231,234,180,129, 50,175, 6,226, 89, 99, 38,204,150, 34, 62, 28,160, 69,200, 64,123,180, 13,124, 7,105, 49,167,128,130, 27, 0, - 37,194,234,197,227, 93,135,191,245,245, 26, 0,245, 38,202,232,205,155, 55, 49,103,206,156, 26,139,171,178,130, 40,184,111,232, -128, 93,187,118,109, 52,153, 76, 19,106,209,230,160, 37, 75,150,236,119,115,115, 83, 84,215,206,198,253, 75,106,109, 98,176, 35, -209,194, 29,169,192, 35, 34,151, 93, 8, 25, 20,182,106,217,178,101, 83,166, 77,155, 38,149,201,100, 80,171,213,184,117,235, 22, -124,125,125, 1, 0, 69, 69, 69,152, 57,115,102,145,197, 98,217, 16, 17,185,236,148,157,141, 32,167,211, 6,142,153, 52,105,210, -248,102,205,154, 13,231, 56,206,197,108, 54,103,198,198,198,238,201,203,203,171, 86, 28,172, 98,155,111, 76,158, 60,121,156, 78, -167,123,197,106,181,186,216,108,182,204,184,184,184, 63,114,115,115,215, 87, 55,182,214,240, 9,207, 95,139, 59,103, 62,153,159, -159,223, 91,163,209, 36, 8,133,194, 92,154,166, 41,145, 72,228, 38,149, 74, 59,112, 28,183, 47,222,116,246,148, 35, 54,135,190, -211,233,198,237,147,249, 39, 10, 11, 11,251,205,154, 53, 43,126,193,130, 5,223, 50, 12, 3,137, 68,226, 38,145, 72, 94,228,121, -222, 97,155, 15, 15, 17,150,157,139, 85,226,125,114, 0,227,254,253,251, 33,149, 74,241,203, 47,191,216,220,221,221, 5, 90,173, -182,212,131,245,233,167,159, 62,112,178,201,100,146,212,199, 10,189,182,189, 60,181, 32,214, 82, 1, 68,225,126, 28,172,140,226, -124,155,169,211, 6,246, 6,176, 19, 64,225,227, 94,249, 88, 86, 96,137, 68, 34, 52,106,212,136,136, 43, 66,221, 9, 44,158, 17, -239,212,239,223, 54, 2, 2,225,224,182,107,115,254,190, 52, 94,217,218,152,157,126, 56, 89,211, 32,215, 83,235,167,230, 55,244, - 65, 81, 73, 37, 7, 0, 66, 25,140, 78, 29,108,233, 23,207, 8,140, 86,110, 66, 5,141,193, 63, 93,252, 70,108,223,180,105,211, - 59,227,198,141, 19,115, 28, 7,153, 76,134,208,208, 80,240, 60, 15,177, 88, 12,134, 97, 48,101,202,148,252,244,244,244,111,244, -134,168,219,246,222,132,171, 90,240,159,121,239, 62,231, 76,231,157, 7,114,207, 3, 2, 13, 92,157, 85,184,124, 46, 10,200, 57, - 7,208, 34,128, 22,163, 83,251,230,104,219,202,191,185, 78, 27,216,131,231,249, 19,245,225, 1, 76,156, 56,177,214,196, 85, 89, - 65, 4,160, 73,109, 94,103,137,200,250,248,227,143,247,115, 28, 39,127,154, 11,133,213,106,157,121,227,198, 13,188,247,222,123, -147,199,142, 29, 43, 11, 8, 8, 64,163, 70,141,160,215,235,113,235,214, 45,172, 94,189,218,104,179,217,214,153, 76,166,233, 14, - 10, 34, 22, 64, 56,128,240,202, 86, 58, 57, 34, 28,121,158,231, 0,172, 47,126,213, 26,190,157,196, 63, 75,243,213,209,106,181, -250, 37,145, 72,212,157,162, 40, 57,207,243,177, 60,207,207,119, 84, 8,149,224,223, 77,185,131, 79, 83,220, 86, 40, 20, 35, 21, - 10, 69,119,129, 64, 32,227,121, 62, 22, 64,117,108, 94, 63,118,236,152,103,223,190,125,205,101, 87, 14,150,204,193, 2,128,159, -126,250, 73, 91,236, 57,177,171, 40,254,249,231,159, 54, 0,114, 0, 31, 38, 37, 37,221, 41,105, 84, 23, 47, 94,140,153, 51,239, -111, 8, 49,103,206,156, 82, 47,214,211, 38,172, 30,238,180,212,134, 77,158,231,223, 44,239, 58,245,134,168, 76, 0,189,234, 67, -218,221,190,184, 22,155,255, 72,176,107,139,183,218, 88, 65, 77,120,118,176,123, 47,194,139,227,196,195,193, 90,191,133,218, 93, -226,227,239,231, 44, 23,243, 12,120, 14, 86,150, 70, 90,106,118, 65,110,156,158,186,145,198, 5,135, 28,194,110,190, 28,163,197, -145,172,133, 78, 78, 78,223,249,251,251,191,186,112,225, 66,109, 64, 64, 0,228,114, 57,120,158,199,149, 43, 87, 48,105,210,164, -172,140,140,140,240,204,204,204, 89,122, 67,148,221, 43,128,158,247,233, 21,237,164, 96, 52, 52,205,240,160,104, 0, 52, 64,211, -184,255, 63,131,210, 99, 20,141,162, 34,139,136,229,168, 95, 83,211, 51,198, 63,238,196, 15, 12, 12, 60, 88, 80, 80,240,196, 69, -114,151,201,100,115, 24,134,121,172,145,220, 31,209, 94,132,157,228,114,249,103, 0, 58, 23, 21, 21,121,200,100,178, 84,154,166, -207,229,231,231, 47,142,136, 92,118,186,186,105,250,180, 83,147,125,229,236,221, 46,165, 58,145,220, 29,220, 46,233,143,252,252, -252,225,122,189,190,194,134,150,231,121,234,105,216,139,208,145, 24, 90,246,158, 91,222,189,215,182,167,170, 54,246,187, 12, 25, - 20,150,117,250,183,129, 78, 27, 14,250,218,101,107,227,198,141, 73,199,142, 29,243, 41,238,216, 16, 8,181, 35,176, 0,224,242, - 36,103, 95,174, 40,247, 3,139,141, 11, 22, 49,240,224,121,176, 44, 15, 67,161,141,218,183,226, 60,251,209, 31,119,145, 93,220, -107,169, 52,147,235,180,129, 93, 61, 61, 61, 63, 99, 89,182, 21, 77,211,114,158,231,243,105,154,190,152,156,156, 60, 79,111,136, -186, 86, 31,133, 6,225,201,104,196, 43, 91,230, 93,147,205, 98,131,251,134,210, 17,145,203, 56,146,151,234,135,192,122, 20,162, -165, 87,139,209, 23,204,102,179,191,209,104, 20, 27,141, 70, 81,217,122, 77, 38,147,165, 95, 74,218,239, 86,219,117, 76,109,137, -144,234, 8,172,218,188,206,218,218,108,186, 54, 59, 98, 21,148,235, 38, 18,137,228,136,201,100,170, 82, 97,201,100,178, 4,139, -197,242,194,166, 3, 95, 38,146, 50, 79,168,182,192, 34, 16, 8, 4, 2,129, 64, 32, 84, 31, 50,115,143, 64, 32, 16, 8, 4, 2, -129, 8, 44, 2,129, 64, 32, 16, 8, 4, 34,176, 8, 4, 2,129, 64, 32, 16,136,192, 34, 16, 8, 4, 2,129, 64, 32, 16,129, 69, - 32, 16, 8, 4, 2,129, 80,111,248,191, 1, 0,124,193,226, 52,146,161,254, 67, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, +137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, + 2, 88, 0, 0, 2, 0, 8, 6, 0, 0, 0, 94,187, 18, 70, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, + 66, 40,155,120, 0, 0, 10, 77,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108, +101, 0, 0,120,218,157, 83,119, 88,147,247, 22, 62,223,247,101, 15, 86, 66,216,240,177,151,108,129, 0, 34, 35,172, 8,200, 16, + 89,162, 16,146, 0, 97,132, 16, 18, 64,197,133,136, 10, 86, 20, 21, 17,156, 72, 85,196,130,213, 10, 72,157,136,226,160, 40,184, +103, 65,138,136, 90,139, 85, 92, 56,238, 31,220,167,181,125,122,239,237,237,251,215,251,188,231,156,231,252,206,121,207, 15,128, + 17, 18, 38,145,230,162,106, 0, 57, 82,133, 60, 58,216, 31,143, 79, 72,196,201,189,128, 2, 21, 72,224, 4, 32, 16,230,203,194, +103, 5,197, 0, 0,240, 3,121,120,126,116,176, 63,252, 1,175,111, 0, 2, 0,112,213, 46, 36, 18,199,225,255,131,186, 80, 38, + 87, 0, 32,145, 0,224, 34, 18,231, 11, 1,144, 82, 0,200, 46, 84,200, 20, 0,200, 24, 0,176, 83,179,100, 10, 0,148, 0, 0, +108,121,124, 66, 34, 0,170, 13, 0,236,244, 73, 62, 5, 0,216,169,147,220, 23, 0,216,162, 28,169, 8, 0,141, 1, 0,153, 40, + 71, 36, 2, 64,187, 0, 96, 85,129, 82, 44, 2,192,194, 0,160,172, 64, 34, 46, 4,192,174, 1,128, 89,182, 50, 71, 2,128,189, + 5, 0,118,142, 88,144, 15, 64, 96, 0,128,153, 66, 44,204, 0, 32, 56, 2, 0, 67, 30, 19,205, 3, 32, 76, 3,160, 48,210,191, +224,169, 95,112,133,184, 72, 1, 0,192,203,149,205,151, 75,210, 51, 20,184,149,208, 26,119,242,240,224,226, 33,226,194,108,177, + 66, 97, 23, 41, 16,102, 9,228, 34,156,151,155, 35, 19, 72,231, 3, 76,206, 12, 0, 0, 26,249,209,193,254, 56, 63,144,231,230, +228,225,230,102,231,108,239,244,197,162,254,107,240,111, 34, 62, 33,241,223,254,188,140, 2, 4, 0, 16, 78,207,239,218, 95,229, +229,214, 3,112,199, 1,176,117,191,107,169, 91, 0,218, 86, 0,104,223,249, 93, 51,219, 9,160, 90, 10,208,122,249,139,121, 56, +252, 64, 30,158,161, 80,200, 60, 29, 28, 10, 11, 11,237, 37, 98,161,189, 48,227,139, 62,255, 51,225,111,224,139,126,246,252, 64, + 30,254,219,122,240, 0,113,154, 64,153,173,192,163,131,253,113, 97,110,118,174, 82,142,231,203, 4, 66, 49,110,247,231, 35,254, +199,133,127,253,142, 41,209,226, 52,177, 92, 44, 21,138,241, 88,137,184, 80, 34, 77,199,121,185, 82,145, 68, 33,201,149,226, 18, +233,127, 50,241, 31,150,253, 9,147,119, 13, 0,172,134, 79,192, 78,182, 7,181,203,108,192,126,238, 1, 2,139, 14, 88,210,118, + 0, 64,126,243, 45,140, 26, 11,145, 0, 16,103, 52, 50,121,247, 0, 0,147,191,249,143, 64, 43, 1, 0,205,151,164,227, 0, 0, +188,232, 24, 92,168,148, 23, 76,198, 8, 0, 0, 68,160,129, 42,176, 65, 7, 12,193, 20,172,192, 14,156,193, 29,188,192, 23, 2, + 97, 6, 68, 64, 12, 36,192, 60, 16, 66, 6,228,128, 28, 10,161, 24,150, 65, 25, 84,192, 58,216, 4,181,176, 3, 26,160, 17,154, +225, 16,180,193, 49, 56, 13,231,224, 18, 92,129,235,112, 23, 6, 96, 24,158,194, 24,188,134, 9, 4, 65,200, 8, 19, 97, 33, 58, +136, 17, 98,142,216, 34,206, 8, 23,153,142, 4, 34, 97, 72, 52,146,128,164, 32,233,136, 20, 81, 34,197,200,114,164, 2,169, 66, +106,145, 93, 72, 35,242, 45,114, 20, 57,141, 92, 64,250,144,219,200, 32, 50,138,252,138,188, 71, 49,148,129,178, 81, 3,212, 2, +117, 64,185,168, 31, 26,138,198,160,115,209,116, 52, 15, 93,128,150,162,107,209, 26,180, 30, 61,128,182,162,167,209, 75,232,117, +116, 0,125,138,142, 99,128,209, 49, 14,102,140,217, 97, 92,140,135, 69, 96,137, 88, 26, 38,199, 22, 99,229, 88, 53, 86,143, 53, + 99, 29, 88, 55,118, 21, 27,192,158, 97,239, 8, 36, 2,139,128, 19,236, 8, 94,132, 16,194,108,130,144,144, 71, 88, 76, 88, 67, +168, 37,236, 35,180, 18,186, 8, 87, 9,131,132, 49,194, 39, 34,147,168, 79,180, 37,122, 18,249,196,120, 98, 58,177,144, 88, 70, +172, 38,238, 33, 30, 33,158, 37, 94, 39, 14, 19, 95,147, 72, 36, 14,201,146,228, 78, 10, 33, 37,144, 50, 73, 11, 73,107, 72,219, + 72, 45,164, 83,164, 62,210, 16,105,156, 76, 38,235,144,109,201,222,228, 8,178,128,172, 32,151,145,183,144, 15,144, 79,146,251, +201,195,228,183, 20, 58,197,136,226, 76, 9,162, 36, 82,164,148, 18, 74, 53,101, 63,229, 4,165,159, 50, 66,153,160,170, 81,205, +169,158,212, 8,170,136, 58,159, 90, 73,109,160,118, 80, 47, 83,135,169, 19, 52,117,154, 37,205,155, 22, 67,203,164, 45,163,213, +208,154,105,103,105,247,104, 47,233,116,186, 9,221,131, 30, 69,151,208,151,210,107,232, 7,233,231,233,131,244,119, 12, 13,134, + 13,131,199, 72, 98, 40, 25,107, 25,123, 25,167, 24,183, 25, 47,153, 76,166, 5,211,151,153,200, 84, 48,215, 50, 27,153,103,152, + 15,152,111, 85, 88, 42,246, 42,124, 21,145,202, 18,149, 58,149, 86,149,126,149,231,170, 84, 85,115, 85, 63,213,121,170, 11, 84, +171, 85, 15,171, 94, 86,125,166, 70, 85,179, 80,227,169, 9,212, 22,171,213,169, 29, 85,187,169, 54,174,206, 82,119, 82,143, 80, +207, 81, 95,163,190, 95,253,130,250, 99, 13,178,134,133, 70,160,134, 72,163, 84, 99,183,198, 25,141, 33, 22,198, 50,101,241, 88, + 66,214,114, 86, 3,235, 44,107,152, 77, 98, 91,178,249,236, 76,118, 5,251, 27,118, 47,123, 76, 83, 67,115,170,102,172,102,145, +102,157,230,113,205, 1, 14,198,177,224,240, 57,217,156, 74,206, 33,206, 13,206,123, 45, 3, 45, 63, 45,177,214,106,173,102,173, +126,173, 55,218,122,218,190,218, 98,237,114,237, 22,237,235,218,239,117,112,157, 64,157, 44,157,245, 58,109, 58,247,117, 9,186, + 54,186, 81,186,133,186,219,117,207,234, 62,211, 99,235,121,233, 9,245,202,245, 14,233,221,209, 71,245,109,244,163,245, 23,234, +239,214,239,209, 31, 55, 48, 52, 8, 54,144, 25,108, 49, 56, 99,240,204,144, 99,232,107,152,105,184,209,240,132,225,168, 17,203, +104,186,145,196,104,163,209, 73,163, 39,184, 38,238,135,103,227, 53,120, 23, 62,102,172,111, 28, 98,172, 52,222,101,220,107, 60, + 97, 98,105, 50,219,164,196,164,197,228,190, 41,205,148,107,154,102,186,209,180,211,116,204,204,200, 44,220,172,216,172,201,236, +142, 57,213,156,107,158, 97,190,217,188,219,252,141,133,165, 69,156,197, 74,139, 54,139,199,150,218,150,124,203, 5,150, 77,150, +247,172,152, 86, 62, 86,121, 86,245, 86,215,172, 73,214, 92,235, 44,235,109,214, 87,108, 80, 27, 87,155, 12,155, 58,155,203,182, +168,173,155,173,196,118,155,109,223, 20,226, 20,143, 41,210, 41,245, 83,110,218, 49,236,252,236, 10,236,154,236, 6,237, 57,246, + 97,246, 37,246,109,246,207, 29,204, 28, 18, 29,214, 59,116, 59,124,114,116,117,204,118,108,112,188,235,164,225, 52,195,169,196, +169,195,233, 87,103, 27,103,161,115,157,243, 53, 23,166, 75,144,203, 18,151,118,151, 23, 83,109,167,138,167,110,159,122,203,149, +229, 26,238,186,210,181,211,245,163,155,187,155,220,173,217,109,212,221,204, 61,197,125,171,251, 77, 46,155, 27,201, 93,195, 61, +239, 65,244,240,247, 88,226,113,204,227,157,167,155,167,194,243,144,231, 47, 94,118, 94, 89, 94,251,189, 30, 79,179,156, 38,158, +214, 48,109,200,219,196, 91,224,189,203,123, 96, 58, 62, 61,101,250,206,233, 3, 62,198, 62, 2,159,122,159,135,190,166,190, 34, +223, 61,190, 35,126,214,126,153,126, 7,252,158,251, 59,250,203,253,143,248,191,225,121,242, 22,241, 78, 5, 96, 1,193, 1,229, + 1,189,129, 26,129,179, 3,107, 3, 31, 4,153, 4,165, 7, 53, 5,141, 5,187, 6, 47, 12, 62, 21, 66, 12, 9, 13, 89, 31,114, +147,111,192, 23,242, 27,249, 99, 51,220,103, 44,154,209, 21,202, 8,157, 21, 90, 27,250, 48,204, 38, 76, 30,214, 17,142,134,207, + 8,223, 16,126,111,166,249, 76,233,204,182, 8,136,224, 71,108,136,184, 31,105, 25,153, 23,249,125, 20, 41, 42, 50,170, 46,234, + 81,180, 83,116,113,116,247, 44,214,172,228, 89,251,103,189,142,241,143,169,140,185, 59,219,106,182,114,118,103,172,106,108, 82, +108, 99,236,155,184,128,184,170,184,129,120,135,248, 69,241,151, 18,116, 19, 36, 9,237,137,228,196,216,196, 61,137,227,115, 2, +231,108,154, 51,156,228,154, 84,150,116, 99,174,229,220,162,185, 23,230,233,206,203,158,119, 60, 89, 53, 89,144,124, 56,133,152, + 18,151,178, 63,229,131, 32, 66, 80, 47, 24, 79,229,167,110, 77, 29, 19,242,132,155,133, 79, 69,190,162,141,162, 81,177,183,184, + 74, 60,146,230,157, 86,149,246, 56,221, 59,125, 67,250,104,134, 79, 70,117,198, 51, 9, 79, 82, 43,121,145, 25,146,185, 35,243, + 77, 86, 68,214,222,172,207,217,113,217, 45, 57,148,156,148,156,163, 82, 13,105,150,180, 43,215, 48,183, 40,183, 79,102, 43, 43, +147, 13,228,121,230,109,202, 27,147,135,202,247,228, 35,249,115,243,219, 21,108,133, 76,209,163,180, 82,174, 80, 14, 22, 76, 47, +168, 43,120, 91, 24, 91,120,184, 72,189, 72, 90,212, 51,223,102,254,234,249, 35, 11,130, 22,124,189,144,176, 80,184,176,179,216, +184,120, 89,241,224, 34,191, 69,187, 22, 35,139, 83, 23,119, 46, 49, 93, 82,186,100,120,105,240,210,125,203,104,203,178,150,253, + 80,226, 88, 82, 85,242,106,121,220,242,142, 82,131,210,165,165, 67, 43,130, 87, 52,149,169,148,201,203,110,174,244, 90,185, 99, + 21, 97,149,100, 85,239,106,151,213, 91, 86,127, 42, 23,149, 95,172,112,172,168,174,248,176, 70,184,230,226, 87, 78, 95,213,124, +245,121,109,218,218,222, 74,183,202,237,235, 72,235,164,235,110,172,247, 89,191,175, 74,189,106, 65,213,208,134,240, 13,173, 27, +241,141,229, 27, 95,109, 74,222,116,161,122,106,245,142,205,180,205,202,205, 3, 53, 97, 53,237, 91,204,182,172,219,242,161, 54, +163,246,122,157,127, 93,203, 86,253,173,171,183,190,217, 38,218,214,191,221,119,123,243, 14,131, 29, 21, 59,222,239,148,236,188, +181, 43,120, 87,107,189, 69,125,245,110,210,238,130,221,143, 26, 98, 27,186,191,230,126,221,184, 71,119, 79,197,158,143,123,165, +123, 7,246, 69,239,235,106,116,111,108,220,175,191,191,178, 9,109, 82, 54,141, 30, 72, 58,112,229,155,128,111,218,155,237,154, +119,181,112, 90, 42, 14,194, 65,229,193, 39,223,166,124,123,227, 80,232,161,206,195,220,195,205,223,153,127,183,245, 8,235, 72, +121, 43,210, 58,191,117,172, 45,163,109,160, 61,161,189,239,232,140,163,157, 29, 94, 29, 71,190,183,255,126,239, 49,227, 99,117, +199, 53,143, 87,158,160,157, 40, 61,241,249,228,130,147,227,167,100,167,158,157, 78, 63, 61,212,153,220,121,247, 76,252,153,107, + 93, 81, 93,189,103, 67,207,158, 63, 23,116,238, 76,183, 95,247,201,243,222,231,143, 93,240,188,112,244, 34,247, 98,219, 37,183, + 75,173, 61,174, 61, 71,126,112,253,225, 72,175, 91,111,235,101,247,203,237, 87, 60,174,116,244, 77,235, 59,209,239,211,127,250, +106,192,213,115,215,248,215, 46, 93,159,121,189,239,198,236, 27,183,110, 38,221, 28,184, 37,186,245,248,118,246,237, 23,119, 10, +238, 76,220, 93,122,143,120,175,252,190,218,253,234, 7,250, 15,234,127,180,254,177,101,192,109,224,248, 96,192, 96,207,195, 89, + 15,239, 14, 9,135,158,254,148,255,211,135,225,210, 71,204, 71,213, 35, 70, 35,141,143,157, 31, 31, 27, 13, 26,189,242,100,206, +147,225,167,178,167, 19,207,202,126, 86,255,121,235,115,171,231,223,253,226,251, 75,207, 88,252,216,240, 11,249,139,207,191,174, +121,169,243,114,239,171,169,175, 58,199, 35,199, 31,188,206,121, 61,241,166,252,173,206,219,125,239,184,239,186,223,199,189, 31, +153, 40,252, 64,254, 80,243,209,250, 99,199,167,208, 79,247, 62,231,124,254,252, 47,247,132,243,251, 37,210,159, 51, 0, 0, 0, + 4,103, 65, 77, 65, 0, 0,177,142,124,251, 81,147, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131, 0, 0,249, +255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, 0, 0, 58,152, 0, 0, 23,111,146, 95,197, 70, 0, 1,216,207, 73, 68, 65, + 84,120,218,236,157,119,120, 20,197, 31,198,223,217,235, 53,149, 36,228, 2,132, 94,164, 73, 66,239, 32,189,136,116, 20, 27, 77, +249, 41, 10, 42, 10, 88, 64, 84,130, 32, 88, 80, 64,176,128,136, 84, 5,164, 74,239, 53,161,247, 22, 74, 46, 21, 82,238,114,253, +118,231,247, 7,119,241, 18, 46,201, 93, 18, 4,113, 62,207,179,207,221,238,237,189, 59, 59, 59, 59,251,238,119,102,103, 9,165, + 20, 15, 10, 66, 72,125, 74,233,105,166,201, 52,153, 38,211,100,154, 76,147,105, 50,205,255, 18, 92, 9, 50,181,204, 29, 25, 33, +132,186,166,118,143,186,230, 3,220,119, 90,134,154,237, 92,154, 83,254, 37,233,108,247,168,106,186,247,183, 44,117, 61,243,176, +172,242,211, 35,157,180,172,211,249,160, 52,203,250,188, 44,203, 50,234,229,184, 79,249,151,164,179,221,163,166, 89,176,252,148, +133,174,183, 50, 89,218,252,244,146, 78, 90,214,233,124, 80,154,101,125,189, 44,171, 50, 90,196,177, 47,179,107,211,163,140,248, + 97, 27, 12, 0,160,148, 18, 15,125,242,168,106,122,230,131, 91,191, 44,211, 90,134,236, 42,107,205, 2,249, 89, 86, 76,161,148, + 18, 66,200,110, 0,237,202,114,223,203,226,184, 23,216,215, 50,209,125,144,230,170, 44,203,253,131,214, 44,171,115,169,160,102, + 89,148,123,111,199,253, 1, 30,163,178, 74,103,153,156, 75, 15,162,204,123, 41, 63,165,214, 45,168, 89, 22,231, 82, 65,205,178, + 40,247,255,132,102, 89,156, 75,222, 52,203,162,220, 23,118,236, 89, 4,235,159, 49, 2, 5, 79,236,246,143,178, 17,122,192, 81, +172,118,255, 6,205, 50, 62, 70, 83, 92,154,101,121, 55,211,190,172,142, 81,193,178, 83, 22,119, 93,158,154,101, 85, 54,189,164, +179,212,199,201,155,102,105,211, 91, 72, 58,203,124,223, 75, 91,238,255, 41,205, 50, 62, 70,101,114, 46, 21,208,108, 95,198, 55, + 1,237,203,242, 92,242,212, 44,171,115,201, 75, 58, 75,125,156,188,105,150, 54,189,133,164,179,204,247,189, 12, 35,162,101,174, +251,216, 69,176, 30,164,185,122, 16,230,205,125,151, 84,214, 23,178,178, 52, 89, 15, 42,210, 86, 86, 81, 28, 47,186,187,203, 80, +110, 87, 89,167,211,149, 62,242, 32,140, 48,165,116, 10, 33,100,242,163,124, 66,179,115,137,157, 75,143,218,185,228,173,220,148, +246, 92,122, 80, 55,207,158,154,101,101,132,188,236,123,169,206,165,130,255, 45,139,115,169, 24, 77,242, 32,246,191,172,207,167, + 71, 17,238, 81, 73,200, 3,232,223, 67, 31, 68, 84,236, 1,238,119, 89,166,179,253,191, 97,223, 31, 68, 58, 9, 33, 83, 30,208, +190,255, 91,242,148,157, 75,236, 92,122,228,206,165, 2,101,178,125, 89, 69,134,202,250, 70,170,160,102, 89,246, 67, 42,203, 50, +250,160,247,189, 44,207,165, 7,113,236,255, 45,248, 29,193,122, 80,119,199,255, 6,205, 7,161,253,128,246,125,247,131,184, 59, +120, 0,253,186,202, 60,157,148,210, 41, 40,195, 38, 71,247, 62,151,101, 90, 31,100, 51,225,131, 40,155, 15,178,188,151,101, 63, +143, 7,180,239,255,150,227, 94,230,233, 44,171,115,201,203, 49, 47,117, 90,189,229, 95, 89, 55, 97,151,101,217,124,144,154,101, +161,253, 32,210,249,160,142,253,191, 9,242, 32,135,105, 96, 48, 24, 12, 6,131,193,248, 47,226, 53,130, 85,175, 94,189, 3,205, +155, 55,175,125,252,248,113,187, 32, 8,224, 56, 14,132,144,188, 73, 16, 4,253,177, 99,199, 98, 88,246, 49, 24, 12,159,238,228, + 8,225,240,119,151, 4,225,222,205, 44,187,187, 99, 48, 24,143,113,189,231,173,142,107,216,176,225,173,227,199,143, 87,248,235, +175,191,160, 84, 42,161, 86,171,161,209,104,160, 86,171,161, 86,171,209,179,103,207,228,189,123,247,234,252,221, 88,139, 22, 45, +110, 58,157,206, 72,127,254, 35, 18,137,210, 42, 84,168, 80,105,229,202,149,188,183,223, 35, 35, 35,111, 18, 66, 42,250, 89,217, +103,232,245,250, 72, 74,169,243,159,210,108,218,180,105, 42,207,243,225,254,104,202,100,178, 91, 7, 14, 28,168,196,138,233, 63, +131, 66,161,184,107,181, 90,131,139, 56,198, 84, 42,149, 58,101, 50,153, 73, 38,147, 89,197, 98,177, 88, 16,132,244,180,180,180, + 24, 74,169,213,203,250, 50, 0, 41, 0,130,138,216,172, 0,192, 12,224, 14,128, 28,151, 9,209, 3,232, 73, 41,229, 31,135,124, +141,141,141,149,148, 47, 95,254, 23, 66,200,224,162,214,147, 72, 36, 25,153,153,153,145,187,118,237,114,178,210,200, 96, 48,254, +237,120,141, 96,241, 60,127,123,244,232,209,234,132,132,132,194, 34, 88,169, 37,217,152,221,110,175,120,240,151, 95, 32,142,136, + 0,181,217,224, 8, 10,130, 32, 8, 16, 4, 1,146, 43, 87, 64,237,118,192,110,135,181, 94, 61, 0,128,195,225,192,211, 79, 63, + 29,145,145,145, 33, 1, 80,216,197, 38,242,141, 55,222,128, 86,171,133,197, 98,129,197, 98,129,213,106,133,213,106,133,205,102, +131,205,102,131,221,110,135,221,110,135,195,225,128,213,106, 69, 66, 66, 66,112,116,116,180, 24, 64, 97, 21,121,228,152, 49, 99, +160,209,104,242,244, 44, 22, 75,158,150,213,106,205,211,180,217,108,176, 90,173, 56,121,242,100,145,154, 60,207,135,239,222,189, + 27,106,181, 26,130, 32,128,231,121,240, 60,159,183,255,148, 82,120,154, 93,158,231,209,181,107,215, 72, 86, 68,255, 57, 28, 14, + 71,160,245,228, 73,136,130,130,192,223,185, 3, 71,181,106,112,186,142, 21, 55,127, 62,120,179,153,240, 14,135,196,242,202, 43, + 10, 39,165,124, 70, 70,134,115,212,168, 81,242,180,180, 52,113, 17,231,151,198, 96, 48,220,213,104, 52, 18, 0,119, 82, 82, 82, + 56,139,197, 98,168, 82,165,202, 41, 0,119,182,111,223, 30,145,155,155,155,213,167, 79,159, 29, 22,139, 37, 89,169, 84, 42, 0, +188,237, 50, 90,255,122,131,229, 54, 87,149, 42, 85,234, 57,123,246,108,172, 95,191, 30, 85,170, 84,129, 84, 42,133, 72, 36, 2, +199,113, 16,137, 68, 16,137, 68, 24, 59,118,108,176, 43,207,152,193, 98, 48, 24,143,167,193, 58,115,230, 76, 75, 0,232,223,191, +255,129,250,245,235,215, 62,119,238,156,221,117, 71,238,158,116,207, 61,247, 92,170,123, 30,128,126,201,146, 37, 62, 53, 25,138, + 35, 34,144, 24, 18, 2, 0,184,181,115, 39, 0,128,227, 56, 68,181,107,151,183, 78,230,209,163, 16,137, 68,168, 92,185, 50, 56, +174,248, 7, 29, 53, 26, 13,186,116,233, 2,153, 76,134,216,216, 88, 72,165, 82, 72, 36,146, 66, 39, 95, 80,169, 84,248,248,227, +143,239,165, 89, 44,134, 90,161,192,255,218, 52,131,146, 80,252,120,242, 2,172,188, 0,177, 88, 12,177, 88,236,179,166, 90,173, +198,138, 21, 43, 32,149, 74,189, 78,219,183,111, 71,159, 62,125, 32,149, 74, 17, 18, 18,130,255,210,128,108,143, 8, 2,167,209, +112,183,170, 87, 7,181,219, 97, 62,118, 12,144,201, 0, 0,202,249,243, 1,173, 22, 36, 40,136,191,219,167,143,213, 1, 56,213, +106,117,146, 90,173,206, 44,194, 16,240, 0,120,141, 70, 35, 33,132,140, 7,192, 83, 74,127, 36,132,136, 0, 12, 4, 96,163,148, +254,225,106, 62,123, 10,128,156, 82,186,139, 16,210, 19,192,191,190,249,140, 16,194,245,236,217,243,199, 74,149, 42,117,157, 61, +123,182, 90, 42,149, 98,238,220,185,144, 72, 36,232,209,163, 7, 66, 67, 67,241,215, 95,127, 65, 42,149, 98,252,248,241,172,244, + 49, 24,140,199,223, 96,121, 80,225,253,247,223, 15,250,245,215, 95, 33,151,203,161, 84, 42,161, 82,169,160, 82,169,242,125,159, + 52,105,146,207,119,218,212,102,203, 55,239,190,139, 45,184, 76, 36, 18,249,188, 19, 54,155, 13, 3, 7, 14, 4,128, 98,205,149, +175,102,200,102,179, 65, 44, 22,163, 90,165, 48,124, 56,160, 9, 90,138, 5,152, 50, 40,184, 59, 38,188, 24, 41,198,137,168,154, +152,115,235, 14,110,228, 24, 33, 22,251,246, 48, 38,207,243,133,154, 43,169, 84,138, 37, 75,150, 96,224,192,129,144, 74,165, 62, + 25, 75,198, 3,112, 88, 89, 89,222,127, 8, 9, 1,209,104,156, 8, 12,180, 59,157, 78,139,141,231,173,106,181,218, 32,147,201, +140, 62,152,161, 12, 15,195,149, 23, 48, 43, 96,204,156,174,101, 0,144,245, 24,152, 43, 2,128, 19,139,197,207,205,152, 49,131, +147, 74,165, 0,128,208,208, 80, 72, 36, 18,212,171, 87, 15, 90,173, 22,251,246,237,203, 59, 47, 24, 12, 6,163, 8, 36, 0,158, + 4, 16,230,170, 75, 13,200,223,253, 34,221,245, 25,230, 49,127,212,139, 78, 19,215, 58,238,223,221,243, 54, 0, 50, 47,203,239, + 0, 80,186, 38, 43,128, 3, 0,234,121,108,199,253, 63, 20,220,174,216, 85, 25,182, 3,176, 11, 64,251, 2,131,223,221,254,236, +179,207,212, 94, 34, 88,249, 38, 0, 62, 55, 25, 58,130,130,112,107,231, 78, 16, 66, 80,177,253,223, 67, 97,220, 57,124, 56,207, +108, 5,116,238, 12,168, 84, 16,125,241,133,207,102, 40, 53, 53, 21, 28,199,149,137,193, 34,132,192,110,183, 67, 33,151, 97,199, +252, 54, 72,185,230,196,103, 27,111, 99,237,225,235, 16,139,197,232, 89,187, 58, 6, 8, 4,211, 67, 20,120,197,193,195,238, 99, + 95, 93,167,211, 89,100,186, 8, 33,249,190, 51,254,113, 56,107,181,106, 48, 39, 36,128, 82, 10, 69,243,230,224, 52, 26,208,144, + 16, 88,126,249,197,104,118, 58,157,118,187,221, 90,126,229, 74, 59,213,106,141, 41, 28, 23,229,176,219,101, 40,124, 60, 57, 17, + 0, 81,106,106, 42,161,148, 46, 32,132,136, 8, 33, 67, 92,145,171,213,174,178,214, 25,128,147, 82,186,147, 16,194, 17, 66, 98, + 93, 39,242, 99,209, 1, 92, 16, 4,186,105,211, 38,204,157, 59, 23,161,161,161,232,210,165, 11,202,151, 47,143, 85,171, 86,129, + 82,138,215, 95,127, 29, 74,165, 18, 74,165,146,149, 62, 6,227, 63, 74, 17, 30,196,147,182, 19, 39, 78,108, 60,125,250,244,105, + 45, 90,180, 88,118,224,192,129,223, 8, 33,235,243,130, 55,148,246,114,105,173,247,152,111, 82,192,100, 73, 0,132, 17, 66,214, +187,215,247,156,247, 88,222, 9,128,204, 61, 63,113,226,196,122,211,167, 79,159, 54, 97,194,132, 73,113,113,113,210,137, 19, 39, + 54,152, 62,125,250, 52,247,118,188,165,195, 51,130,229,117, 20,224,213,171, 87,183, 44,184,135,117,234,212, 57,208,178,101,203, +218,241,241,241,121,166,139,227, 56, 93,147, 38, 77, 82, 41,165,197, 62, 93, 72, 41,117,255,199,107,212,138,227, 56, 64,173, 6, + 81,171,129,191, 13, 92,145,102,200,225,112, 64, 34,145,128,227, 56,108,221,186, 21, 74,165, 18, 61,122,244, 40,210,200,248, 98, +218, 20, 10, 25, 36,193, 34,188, 56,230, 48,210,239,154,242,154, 4,183, 39,222,198, 81,165, 10, 31, 60, 81, 31,106, 67, 34, 12, + 5,162,114,254, 70,176, 94,123,237, 53,216,108,182, 60,131,232,142, 96,177, 38,194,127, 30,158,255, 59,200, 68, 66, 66, 64, 53, + 26, 32, 40,200, 73, 1,131,221,110, 39, 14,135,195,198, 7, 6,230, 34, 48, 48,203,228,116,170, 57,145,200, 92,156, 25, 50,155, +205,198, 2,145,170,194, 34, 87,238,200, 86,214,191,221, 96,209,123, 21,138, 0,128, 86,169, 82, 37,239,220,139,136,136, 64,144, + 71,223, 75,133, 66, 1,165, 82, 9,169, 84,202,110, 42, 24,140,255, 46,190,188,137, 64, 62,125,250,244,105,158, 6,166,160,161, +241, 52, 78, 5, 76,148,167, 73,171, 87,140,167, 88, 95,208, 52,185,183, 75, 8, 89, 31, 23, 23,215,171,152,116,164, 23, 52, 88, + 62, 15,179, 47, 22,139, 43,204,159, 63, 63,104,205,154, 53,208,104, 52, 8, 10, 10, 66, 96, 96, 32, 2, 3, 3,209,191,127,255, + 98,155, 10,221,157,230, 11, 54, 1,122, 26, 44,226, 97,176,124,121,146,219,110,183,231, 25,172,209,163, 71,231,245,139, 42, 77, + 19,161,221,110, 7, 39, 18, 3,242, 42, 16,232,225, 60,115,229,158, 68, 18, 9, 18, 43, 54, 0,151,154, 4, 49,239, 91, 11,169, + 32, 8,249,210,241,209, 71, 31, 97,214,172, 89,121,134,211, 29,193,106,212,168, 17, 46, 93,186,196, 78,185,135, 16,112,113, 58, +157,127, 59,255,224, 96, 16,181,218,225, 12, 8, 16, 12, 70, 35,209, 6, 5,221, 38,132,228,164, 16, 82,201,228,112,104, 42,196, +196, 28,171,120,234, 84, 18,138,233,131, 21, 29, 29,125,138, 16,242,172, 43,114,181,202, 21,169,234,226,154,247,140, 92,217, 41, +165,167, 8, 33,186,199, 36, 63, 41, 0, 72, 36, 18,116,238,220, 25,245,235,215,199,218,181,107, 33, 8, 2, 94,123,237, 53, 40, +149, 74,124,245,213, 87,112, 58,157,152, 62,125, 58, 43,125, 12,198,127, 59,138, 85,220,197,222, 60, 97,194,132, 73,132,144,245, +174, 72,210,153, 34,140,148, 55,154, 20, 48,105,233,133,220, 28,246,242,102,178, 60,191,187,153, 56,113, 98, 61, 47,233, 56,122, +159,193,242,112,143,197,153,132,219,175,190,250,170, 58, 33, 33,193, 78, 41,133, 72, 36,202, 51, 8,190, 60, 93, 40,190,124, 25, +186,182,109, 1, 0,119,143, 28,201, 51, 85,218,174, 93, 1,149, 10, 68,165,130,227,247,223, 33, 18,137, 32,132,134, 2, 95,126, + 89,108,174, 57, 28,142,123,166, 71, 36,194,157, 59,119,202,164, 15,150,221,110,135, 72, 34,198, 33,141, 4, 84, 34,202,103,174, + 36, 18, 9, 68, 82, 9, 18, 35,106,129, 19,111,131, 88,236,219, 67, 79, 5, 13, 22,199,113, 24, 59,118,108,190, 60,108,213,170, + 85,158,225,100,252,179,112, 28, 39, 72, 22, 45,130,242,219,111, 65, 3, 2, 96,249,229,151, 44, 65, 36, 50, 24, 12, 6,177,122, +233, 82,169, 34, 52, 84,142,224, 96, 75,122,237,218, 25,102,155,205,166, 43, 87, 46, 93,161, 80, 20, 23,109,178,227, 94, 31, 44, + 71,129, 72,149,183, 72,150,123,254, 95, 31,193,114, 71,177,158,126,250,105,136, 68, 34, 4, 6, 6, 66,171,213,130, 82,154, 47, +114,229,116, 58,243,154,206, 25, 12,198,127, 23, 31, 60,136, 53, 46, 46,238, 76, 92, 92, 92, 94, 36,169, 96, 4,171, 16,122,186, +204, 84,152,219,156,225, 94, 95,170,163, 69,164,165, 87, 97,198,203,115,217,244,233,211,167,121, 73, 71, 94,179,100,161, 3,141, +182,104,209,162,182,231, 48, 13, 46, 3,165, 63,123,246,108,169, 6, 24,165,118,187,215,168,149,187, 89,144,168,213,127, 71,178, +124,104, 34,116, 27, 44,137, 68, 2,145, 72,148,103, 94, 22, 47, 94, 12,141, 70,131,151, 95,126,185, 68, 6,203,225,112,128,147, +138,176, 78,122, 9,144,136,239,139, 96,113, 98, 9,110, 6, 86, 4,145,136, 33,118,138,125, 74,103, 78, 78, 14,164, 82, 41,190, +250,234, 43,124,240,193, 7, 16,137, 68,224,121, 30,132,144,124,251,204, 58,184, 63, 28,164, 82, 41,207,219,108,160,193,193,148, +104,181, 14,179,217,204, 91,121, 94, 28, 16, 16,112, 83, 21, 22,166, 72,166, 84,110,176,219,181,213,106,214,220, 47, 22,139,179, +119,236,216, 81, 43, 49, 49, 49, 2,133, 15,169, 32, 2, 96,223,177, 99, 71,184, 71,228,170,171, 43,114,181,195,117,215,211, 24, +128,131, 82,122,146,220,163, 10,242,119,152,124, 28,140, 43,118,239,222,141,248,248,120,140, 30, 61, 26, 74,165, 18,223,124,243, + 13,156, 78, 39,166, 78,157, 10,165, 82, 9,153, 76,198, 10, 32,131,193, 40,138, 96,183,193,113,153,164,124,145, 37, 74,105, 47, + 79, 19, 84, 88, 83,161, 43,226,180,167,152,109,109,112, 25, 51,175,184, 35,105, 5, 34,112,235, 11,154, 51,177,219, 57,122,126, +138, 68,162, 10,243,230,205, 11,218,179,103, 15, 84, 42, 85,222, 0,163,207, 62,251,108,233,199,229,113, 27, 44, 87, 51,161,187, +185,144,104, 52,247, 12,150, 74,149,207,108,248, 26,109, 42,104,176, 38, 79,158, 12,177, 88,140,133, 11, 23, 2, 0,222,121,231, + 29,191, 35, 88,160,192, 65, 97, 23, 34,231, 53, 4, 22, 43,145,178,251, 28, 36, 18, 9,202, 55,237, 12,161,241, 0,220,149, 5, + 66,229, 26,174,193, 23, 50, 51, 51,113,238,220, 57,112, 28,135,143, 63,254, 56,223,254,187, 77,172,219, 92,109,221,186, 21,248, + 15,189,179,233, 81, 64, 46,151,219, 5,135, 67, 78, 2, 2, 28,208,106,109, 54,187,221, 98,231,121, 27, 33, 36, 71, 8, 14,182, +228,218,108,154, 28,165,210,172,187, 55, 32,104, 78,110,110,174,133, 82, 90,212, 83,132, 20,128,201, 96, 48,100,123,122,247, 2, +145, 43,111, 79, 19,102, 62, 78,163,156,187,111,148,120,158,191, 47,114,165, 80, 40, 32,151,203, 89,225, 99, 48,254,227,209, 43, +207,207, 66, 72, 47,208,207,137, 20,136, 52,165,123, 51, 86,158,205,129, 30,223, 29, 94,116,109, 5,154, 14, 11, 46,119,127,222, +137,139,139,219,233,142, 92,121, 44,207,151,142, 66, 35, 88,130, 32,228, 13, 52,234, 89, 65,150,116,128, 81, 79, 44,117,235, 34, + 59, 62, 30, 34,145, 8,218, 30, 61, 0,149, 10, 80,169,224, 92,185, 50,207,104,136, 63,249, 4,156, 90, 13,210,163,135, 79,154, + 60,207,231,107,190,147, 72, 36,200,202,202,130, 68, 34,193,167,159,126, 10,142,227,240,249,231,159, 35, 42, 42, 10,201,201,201, +216,188,121,115,177,154, 78,167, 19,196, 73, 32,127, 49, 28,138, 87, 53, 32,175, 84, 71,221, 94,175, 32,199, 16,141, 83, 54, 53, +234,228, 94, 68,208,142,201,176, 11, 78,159, 13,150,195,225,192,225,195,135, 33,149, 74, 65, 41,189, 55,128,229,189,206,236,121, +131,143, 58, 28, 14,216,237,118,204,152, 49, 3,236, 77, 34,255, 44, 10,133,226,174,233,229,151,145,222,189,187,221,102,179, 89, +163,214,172,177, 81,181,218,144, 36, 18, 69,167,212,168,113,167, 78,221,186,251, 43,112, 92,206,182,109,219,234,152, 76, 38, 91, +207,158, 61, 55, 63,241,196, 19, 23,118,238,220, 89, 84, 31,172, 27,125,250,244,217,238, 25,185,114, 69,178, 26,227, 94,159, 43, +207,200,149,131, 82,122,139, 16,146,254,184, 69,176, 94,126,249,101, 68, 70, 70, 98,206,156, 57,224,121, 30, 31,127,252, 49,148, + 74, 37, 38, 77,154, 4,135,195,129,175,190,250,138, 21, 64, 6,131, 81, 20, 71,253, 88,183,137,135, 89, 58, 90, 66,221,163,165, + 77,176, 87,103,112,250,244,233,150,133,253,193,179,249,208,109,190, 40,165,250,248,248,248, 24, 47,119,174,245, 41,165,167, 11, +152,183,191,199,185, 82,169,242, 34, 87,249,162, 57, 26, 13, 56,173, 22,240, 98, 92,188,105,186,251,112, 20,236,220, 46, 22,139, +145,157,157, 13,137, 68,130, 57,115,230, 32, 32, 32, 0, 86,171,213, 39, 77,119,191, 46,211,141, 92, 92,255,224, 52,228,170,171, +168,213, 57, 0, 26,201, 21,212,216,247, 7,156, 78, 59,224,209,100,232,139,102,213,170, 85,241,246,219,111, 23, 58, 14,150,103, +196,142, 82,138, 38, 77,154, 20,171, 89, 6,209, 5,166,233, 66, 42,149,154, 28, 14,135,204,110,183,243,118,187,221, 42,104,181, + 70, 4, 7,103,229,218,108, 90,139,205,102,161,148, 26, 40,165, 57, 38,147,201, 98, 48, 24,108, 60,207,231,212,174, 93, 59,167, + 8, 77, 10, 32, 75, 16,132, 20, 0, 90, 20,222,231, 42,223,124,193,215,238,252,155,143,145,187,201,187, 92,185,114, 80,169, 84, +224,121, 62, 47,114,165, 80, 40,224,112, 56,224,116, 58, 11,189,153, 96,229,147,105, 50,205,255,142,230, 67, 50, 99, 15, 12,177, +191,127,112, 55, 31, 30, 58,116, 8, 90,173, 22,129,129,129,126, 53, 29,218,108, 54,232,116, 58, 8,130, 0,249,231,159,223,139, +222, 0, 48, 73,165,127,191, 54,167, 67, 7, 80,142, 67,166,193, 0,187,221, 94,108,132,200,108, 54,123, 53, 87,158,243, 70,163, + 17, 86,171,213,231, 38, 66,147,201, 4,145, 72,148,167, 67, 4,138,107,219, 87,221,215, 23,203,159,145,220,121,158, 71, 88, 88, + 88, 94, 83,160,219,104,138,197,247,247,225,114,205,179, 38,194,127, 54,210,162,188,117,235,150, 16, 22, 22,150,200,113,156,225, + 54, 33, 85,114, 45,150,128, 42, 77,155, 30,172, 84,174,220,157,109,219,182,213, 54, 26,141,142, 46, 93,186,108, 86,171,213, 89, +159,125,246, 89,219,179,103,207,214, 61,123,246,236,236, 66,222, 27,200, 1, 80, 74,165, 82, 53,165,116,187, 43,114,213,196, 21, +185, 58,225, 58,206, 85, 61, 34, 87,132, 16, 18,232,154, 55, 61, 46,249,234,238,228, 46,147,201,240,201, 39,159, 64, 42,149,230, +141,123,245,213, 87, 95,129, 82,202, 58,185, 51, 24,140,199, 14,191, 13,150,187,249,240,248,241,227,158, 17, 44,159,154, 14, 37, + 18, 73, 90,239,222,189,253,122,225,177, 68, 34, 41,234, 85, 36, 32,132, 36,239,218,181,203,175, 23, 51,139, 68,162,204, 27, 55, +110, 20,169,121,232,208, 33,191, 52, 57,142, 43, 82, 83, 34,145,164,117,237,218,213,175,125,151,203,229,169,172,136,254,115, 88, + 44,150, 91,111,191,253,118,136, 86,171, 77,145,201,100, 57, 38,147, 73,194,113,156,173,242,185,115,215,180, 90,237,221,179,103, +207, 6, 81, 74,237,177,177,177,167,149, 74,165,241,196,137, 19,117,210,211,211, 29, 69,121,106,220, 11, 81,191, 68, 8,137, 1, + 96, 4, 16, 8, 32,135, 16,162,194,189,190, 92, 26, 0,153,132, 16,226, 26, 59,202,137,199,232, 93,124, 98,177, 56,249,141, 55, +222,240,233, 92,146, 74,165,153, 96,239, 33,100, 48, 24,255, 85,131, 85, 84,243, 97,113, 28, 58,116, 40,162,172,119, 32, 41, 41, +169,210,191, 65,243, 65,236, 59,163,204,143,123,135, 98, 86,249,205,115,230,226,197,139, 95, 21,181, 50,165,212, 1, 96,168, 63, +105,160,148,230, 62, 78,121,186,122,245,234, 74,172,100, 49, 24,140,255, 34,108, 60, 0, 6,131,193, 96, 48, 24, 12,102,176, 24, + 12, 6,131,193, 96, 48, 30,109, 8,128,250,222,126,240,231,233, 0, 66, 72,125,127, 55, 92,156, 62,211,100,154, 76,147,105, 50, + 77,166,201, 52, 31, 63,205,226,180, 31,225,167, 19,253, 51, 88, 15,114,172, 37,246, 8, 43,211,100,154, 76,147,105, 50, 77,166, +201, 52,255,139,176, 38, 66, 6,131,193, 96, 48, 24, 12,102,176, 30, 63, 42, 86,172, 24,201,114,129,193, 96, 48, 24,140,199,135, + 66,135,105,104,218,180,105, 42,207,243,254,142, 89,149,230,235,112, 4,132, 16,113,100,100,228, 64,181, 90,221, 65, 36, 18,181, + 2, 0,158,231,247,231,230,230,238, 76, 78, 78, 94, 73, 41, 45,209,120, 56, 17, 17, 17, 85, 68, 34,209,139, 0,158,117, 45,250, +141,231,249,197,169,169,169,215, 31,181,204, 39,132,112, 21, 42, 84, 88, 82,167, 78,157,206, 21, 42, 84, 56, 29, 16, 16,208,237, +236,217,179,246, 82,232, 89,189, 45,167,148,150,248,101,111,229,203,151,143,230, 56,174, 5,165, 52,198,181,141, 4, 65, 16, 14, +166,164,164,220, 96,167,207,227, 65, 73,206,117, 0,144, 74,165,105, 7, 15, 30,140, 40, 75, 77,153, 76,118,235,192,129, 3,149, + 10,209,188,201,243,124,197,127, 65, 58,255, 21,249, 89, 24,177,177,177, 27, 0,184,223, 83,182, 49, 62, 62,190, 39, 59, 75, 24, +140, 50, 52, 88, 60,207,135,239,222,189, 27,106,181,218,125,145, 6,207,243,224,121, 62,111,196,117, 65, 16, 64, 41, 5,165, 20, + 78,167, 19, 93,186,116,241,169, 2,168, 80,161, 66,253, 90,181,106,173,122,253,245,215, 43,245,238,221, 91, 22, 17, 17, 1, 66, + 8, 82, 82, 82,106,174, 95,191,126,232,156, 57,115, 38, 87,168, 80, 97,192,237,219,183,125,106,223, 13, 11, 11, 83, 75, 36,146, + 1, 0, 94,106,216,176, 97,235,241,227,199,147, 86,173, 90,129,231,121,236,216,177,227,163,217,179,103,127,168,211,233,246, 1, + 88,228,112, 56, 86,165,167,167, 63,180,177,134, 8, 33, 36, 60, 60, 60, 58, 45, 45,237, 38, 0, 18, 19, 19,211,102,214,172, 89, +161,171, 87,175,110,255,245,215, 95, 47, 0,240, 82, 41,228,101,101,149,206,234,213,171,203,204,102,243,167, 28,199,189, 5,128, +243, 28,105,158,227, 56, 65,167,211,205, 86, 42,149, 31, 92,185,114,197,198, 78,163,127, 55,158,231,186,251,157,152, 78,167,211, +235,121,238, 46, 7,148, 82,116,234,212, 41,220, 31, 77,111,122,158,125, 64,121,158, 71,215,174, 93, 11,141,230, 82, 74, 35,183, +111,223,142,192,192,192, 34, 53, 11,252, 7, 79, 61,245, 84,137,210,233,126, 71,168, 91,199,141,211,233, 68,215,174, 93,117,190, +106,122,234, 22,166, 73, 41, 69,135, 14, 29, 30, 68, 58,139,141,142, 55,105,210, 36, 66, 16,132,249,132, 16, 25,199,113,111, 2, +232,177,121,243,102,240, 60,143,158, 61,123,246,104,218,180,105, 13, 65, 16,190, 86, 42,149,130,197, 98, 25,126,244,232, 81, 54, + 0, 50,131, 81, 26,131, 5, 0,106,181, 26,203,150, 45,243,250,250,153,130,223,163,163,163,125,141,136, 52,174, 92,185,242,238, + 53,107,214, 40,195,195,255,174, 79,236,118, 59, 2, 2, 2,240,242,203, 47,203, 58,117,234, 84, 99,232,208,161,135,202,151, 47, +223, 46, 37, 37,229, 88, 81,122, 58,157,238,245,136,136,136,207,199,141, 27,167,124,250,233,167, 17, 28, 28,156,239,247, 94,189, +122,161, 71,143, 30,228,218,181,107,109, 86,174, 92,217,230,151, 95,126,153,163,211,233, 38,232,245,250,111,139, 75,107, 84, 84, + 84,136, 82,169, 92, 16, 17, 17,209,240,250,245,235,123, 37, 18,201, 56,187,221, 62, 54, 50, 50,242, 5,131,193,112,195, 98,177, +140,188,117,235,214, 53,127,204, 85,100,100,228,246,186,117,235, 54,186,116,233,210, 53,139,197, 50,232,244,233,211,199,174, 94, +189, 26,245,252,243,207,147,211,167, 79,247,139,140,140,220,150,156,156,188,180, 36,145, 43,167,211,121,164,168,223,125,141,100, +233,116, 58, 37,128, 3, 0, 26,246,236,217, 51,117,202,148, 41,182,144,144, 16, 53, 33,132, 75, 75, 75,203,154, 49, 99,134,250, +247,223,127,127,199,108, 54, 63,165,211,233, 90,234,245,122, 51, 59,149,254,221,168,213,106, 44, 95,190, 28, 18,137, 4, 82,169, + 52,239,211,243,187,231,103, 72, 72,200, 3,209,164,148, 22,249,122, 40,141, 70,131, 85,171, 86,129,227, 56,175, 58, 5,151,149, + 43, 87, 14, 28,199,193, 61, 82,126, 89,164, 51, 52, 52,180,204,247, 61, 44, 44,172,204, 53, 67, 67, 67,139,205, 79, 0, 16, 4, + 97,254,140, 25, 51,158,214,106,181,120,247,221,119, 47, 70, 71, 71, 35, 32, 32, 0,223,127,255, 61,130,130,130, 32, 8,194,197, + 47,190,248,130,220,186,117, 11, 95,127,253,245,143, 30,209, 45, 6,131, 81, 82,131, 5,160,208,247,251, 21,252, 94,200, 29,103, +190, 8, 84,229,202,149,229, 26,141,102,245,159,127,254,169,244,172,164,108, 54, 27, 12, 6, 3,140, 70, 35, 12, 6, 3,212,106, + 53,230,205,155,167,124,246,217,103, 87, 87,174, 92,185,102, 98, 98,162,181, 48, 77, 0,179, 79,156, 56, 33,113, 58,157,144,201, +188, 7,112, 56,142, 67,245,234,213,241,198, 27,111,160,117,235,214,170, 33, 67,134,204, 6,240,109, 17,154,238,255,253,182,119, +239,222,214,225,225,225,138, 53,107,214, 40,230,206,157,123,179, 71,143, 30,198, 23, 95,124, 81,151,153,153,169,235,213,171,215, + 86, 0, 85,125,217,119,151, 97, 11,122,242,201, 39, 27,204,154, 53, 43,240,236,217,179, 49, 83,166, 76,217,150,153,153,249,209, +212,169, 83,235, 45, 93,186,180,218, 39,159,124,162, 62,125,250,244, 71,132,144,229,222,222,109, 87,196, 19, 27, 50, 87,122,197, +254, 70,182, 10,209,156, 14,160,225,143, 63,254,120,177, 75,151, 46,229, 1,228, 2,208,187,205,215,215, 95,127, 45,106,211,166, +205,185, 55,223,124,179,161,107,221, 55,124, 76,103,137, 97,154, 15, 86, 83, 16, 4, 72, 36, 18,244,239,223, 31,132,144,124,239, +225,116,127,238,221,187, 23,157, 59,119,134, 68, 34,193,136, 17, 35,124,214, 28, 50,100, 8,156, 78,231,125,154,219,183,111,207, + 87,191,112, 28,231,147,166, 88, 44,134, 72, 36,202,247,223,194, 38,142,227,188, 69,181,188,166,211,215,169,224,123, 67, 31,134, +102,191,126,253,176,121,243,230, 82,107,186,150, 73, 79,158, 60,137,134, 13, 27, 98,233,210,165, 68, 36, 18,225,240,225,195, 80, + 42,149,120,249,229,151, 81,191,126,125,162, 80, 40,112,237,218, 53,228,228,228, 16,118, 30, 49,205, 7,165, 89,156, 29, 1,240, + 36,128, 48,220,123, 13,153, 1, 64, 16, 0,155,235, 26,119, 7,128,210, 53, 89,113,239,213,100,229, 92,255,205,192,189, 97,169, + 60,239,142,210,145,255,165,208, 77, 92,218,233,174,121,207,187, 30, 91,129,235,168,123,190,224,103, 62,109,206, 21,225,160,174, +169, 93,129, 12,244,201, 92, 21,118, 50,123, 57, 32,175, 79,156, 56, 49,194,211, 92, 89,173, 86,228,228,228,192, 96, 48,228,125, + 94,186,116, 9, 82,169, 20, 3, 7, 14,140,160,148,190, 94, 92,166,139, 68, 34, 36, 36, 36, 96,205,154, 53,184,126,253,254,174, + 86, 87,175, 94,197,215, 95,127,141, 47,190,248, 2, 57, 57, 57,238, 3, 85, 88,132,173, 92,221,186,117,227,234,215,175,127,171, +105,211,166,157,210,211,211, 21, 39, 79,158, 68,116,116,116,249, 63,254,248, 67, 27, 27, 27,171,139,143,143,199,197,139, 23,165, + 45, 91,182,140,126,226,137, 39,210, 26, 52,104,176, 32, 34, 34,162, 74,113,209, 43,135,195, 17,112,250,244,233,189, 27, 55,110, +228, 27, 55,110,140, 95,126,249,165,114,141, 26, 53,190, 76, 76, 76, 92, 58,127,254,124,115, 88, 88, 24,186,117,235, 86, 37, 50, + 50,210,167, 62, 15,132, 16, 43, 33,196,234,116, 58,143,120,139, 94, 81, 74,145,147,147,131, 27, 55,110, 28, 57,121,242,228, 49, +215,250,217,197, 68,175,158, 4,240,122,255,254,253,111,185,204, 85, 34,238,189, 51,207, 1,192,193,243,124, 78,118,118,246,173, +206,157, 59,135,180,107,215,238, 6,128,215, 93,255, 97,252,139,113, 58,157,144, 72, 36,216,180,105, 19,182,109,219,134, 29, 59, +118, 96,215,174, 93,216,189,123, 55,246,236,217,131,189,123,247, 66, 34,145, 96,255,254,253,216,191,127, 63,198,140, 25,227,179, +230,186,117,235,188,106,170, 84,170, 98, 13, 65, 65,120,158, 47,212, 80,252,252,243,207,224, 56,238, 62, 77, 66, 8, 69, 17, 47, + 78,119,167,211,219,212, 40, 38,198,171,105, 19, 4,129,248,146,206,141, 27, 55,194,233,116, 98,229,202,149,200,201,201,193, 79, + 63,253,132,228,228,100,204,153, 51, 7, 87,174, 92,193,244,233,211,113,242,228, 73,175,230,178,176,116,246,239,223, 31, 14,135, + 35, 47, 61, 25, 25, 25,248,254,251,239,113,227,198, 13,204,158, 61, 27,231,206,157,195, 39,159,124,226,147, 38, 0,136, 68,162, +215,151, 45, 91,230,220,185,115, 39,150, 44, 89,130, 21, 43, 86,224,202,149, 43, 80, 42,149, 80, 42,149, 72, 73, 73,193,197,139, + 23,177, 98,197, 10, 39, 33,100, 12, 59, 91, 24,101, 77, 97, 30,164, 0,109, 39, 78,156,216,145, 16,178,190,101,203,150,207, 3, + 8, 34,132,172, 7, 32,115,125,134, 78,156, 56,177, 41, 33,100,253,196,137, 19, 27, 3, 40, 71, 8, 89,239,154,239, 0, 32,212, + 61,239, 90, 63,172,128,121, 11,243, 88, 30, 86, 96, 93,153,183,249,130,159, 5,181,197, 30, 23, 99, 82,176, 34,242,172,204,202, +194, 96,105, 52,154, 30,221,186,117,147,122,154, 43,207,200,149,251,211, 96, 48,224,194,133, 11,168, 95,191,190, 84,163,209,244, + 0,240, 69,177,161, 56,177, 24, 58,157, 14, 25, 25, 25, 56,125,250, 52,162,163,163,225,112, 56,176,101,203, 22,100,101,101,229, +133,210,109,182,162,187, 12, 69, 68, 68,124, 63,116,232,208,222,163, 70,141, 18,253,245,215, 95,168, 83,167, 14,170, 84,169,130, + 3, 7, 14,192,110,183,163, 98,197,138,104,209,162, 5, 86,173, 90,133, 39,159,124,146, 27, 53,106, 84,216,153, 51,103, 70,124, +253,245,215, 45, 1, 60, 81,152,110,100,100,228,182, 6, 13, 26,196,156, 59,119,238,202,140, 25, 51,150, 38, 38, 38,246,157, 52, +105,146, 58, 46, 46, 46,180,127,255,254,221,182,108,217,114,225,163,143, 62,138,233,221,187,183,248,215, 95,127, 29, 1, 96,157, + 15,229,178,208,200,149,211,233,244,204, 83,113, 78, 78, 14, 7, 31,250,104, 17, 66, 58, 80, 74,201, 7, 31,124, 96,115,221, 17, +228, 69,210,236,118,187, 91, 83,224,121, 62,243,245,215, 95,183,236,222,189, 59,154, 16,210, 1,192, 9, 86, 77,252,123,113,159, +235,253,250,245,131, 88, 44,206, 59,175,183,111,223,142, 94,189,122,221,215, 4,213,189,123,119,159, 53, 7, 15, 30, 12, 74,105, +190,232,149,183,232,139, 47,134,192,173,233, 45,130,229,109,153, 47,154, 69, 69,155, 10, 70,241,253, 53,130, 3, 6, 12,128, 84, + 42,197, 75, 47,189, 4,169, 84,138,215, 95,127, 29, 18,137, 4,239,189,247, 30, 36, 18, 9, 26, 55,110,236,119, 58,215,174, 93, +139, 30, 61,122,228,165,167, 82,165, 74, 24, 55,110, 28,164, 82, 41, 26, 52,104, 0,169, 84,138, 22, 45, 90,248,148, 78,119,135, +246,250,245,235, 99,244,232,209,248,227,143, 63,176,120,241,226,188,223, 7, 12, 24,128,103,158,121, 6,185,185,185,136,136,136, + 16,235,245,250,171,177,177,177,172,227, 59,163,204,241,230, 65, 10, 32,159, 62,125,250, 52, 74,105,175,194, 52,220,191, 19, 66, +214,199,197,197,245,114,233,222, 55,239, 17,101,242, 52,111,245, 60, 35, 80,238,255,121,110,175,168,109, 23, 88, 63, 61,159,193, +114,237, 88,251,194,238, 22, 11, 54, 23, 20,252,238,203,201,108,177, 88,158,116, 71,175, 44, 22, 75, 62, 67,101, 52, 26,243, 25, + 45,155,205,134,170, 85,171,194, 98,177,248, 21, 29, 33,132, 32, 50, 50, 18,118,187, 29, 11, 23, 46,204, 51, 86,158, 38,161,152, +131,172,235,216,177,163,232,198,141, 27,208,235,245, 16, 4, 1, 7, 15, 30,132, 68, 34,129,217,108,134,205,102,195,170, 85,171, + 32, 18,137,112,245,234, 85, 40, 20, 10, 52,108,216,144,240, 60, 31, 92,132,105, 83, 53,111,222,188,222,156, 57,115, 2, 79,157, + 58,213,120,210,164, 73,129,171, 87,175, 94, 29, 29, 29,253,220,168, 81,163, 36,195,135, 15,143, 89,176, 96, 65,234,177, 99,199, +208,178,101, 75,104,181,218,202,165, 41,168, 86,171, 53, 95,222,186,163,131, 62, 22,242, 39, 1, 32, 56, 56, 56, 20, 64,146,123, +185,217,108,206, 59, 70, 70,163, 17, 22,139,197,174, 80, 40,100,158,255, 97,252,251, 13,214,230,205,155,243,245,235,145, 72, 36, +216,177, 99,199,125,253,123,228,114, 57, 54,108,216,224,147, 33,248,243,207, 63,189,246, 21,242,102,144,138,235, 51,228,214, 20, +137, 68, 88,186,244, 94, 87,197, 87, 95,125, 53,207,164,120,214, 73, 30,154, 24, 48, 96, 0,241, 37, 42,214,246,219,123,125,203, + 78,125,192, 23,106,176, 68, 34,145,207,102,104,213,170, 85,232,213,171, 23,214,175, 95, 95,228,103,215,174, 93,253,138,222, 1, +200,203,199,155, 55,111,122,213,157, 51,103,142, 47,125,176,122,108,222,188, 25, 1, 1, 1,121,205,130, 0,208,189,123,247, 49, +129,129,129,237, 44, 22, 75,191, 13, 27, 54, 32, 43, 43, 11, 85,171, 86, 69,120,120, 56, 14, 31, 62,204,250, 96, 49, 30, 72, 20, +171,160, 7, 41,128,121,194,132, 9,147, 8, 33,235, 39, 76,152, 48, 41, 46, 46,238,140,235,127,235, 11,232,172, 47,102, 59,110, + 19,228,110, 30,108, 82,192,188,185,155, 14,123, 22,241, 95, 91, 1, 67, 85,176,137,240,104,177, 17, 44,119, 37, 81, 92,244,202, +143, 59, 48, 49, 33,228, 62, 3,224, 45,130,229,112, 56,112,231,206, 29, 8,130, 32, 46,203,131, 88,156,193,186,115,231,206,155, +175,191,254,250,230, 47,191,252, 50,112,240,224,193,216,187,119, 47,234,214,173, 11,171,213,138,208,208, 80, 92,191,126, 29, 34, +145, 8, 23, 47, 94, 68,116,116, 52,212,106, 53, 62,250,232, 35,131,205,102,155, 88,152,102,106,106,170,169, 82,165, 74,187,255, +252,243,207,126,131, 6, 13, 18, 45, 95,190,188,250,255,254,247, 63,237,220,185,115,147,134, 12, 25, 82,121,240,224,193,162, 5, + 11, 22,136,175, 95,191,142,214,173, 91, 35, 40, 40, 72, 93,210,253, 51,153, 76,249,140,149,103,158,250,136,212, 85,144, 4,247, + 2, 79, 99,229,214,180, 88, 44,212,110,183, 19,207,255, 48,254,189,184,207,245,129, 3, 7,222,103, 82,164, 82, 41,182,108,217, +130,126,253,250, 65, 38,147, 65, 42,149, 34, 54, 54,214,103,205,103,159,125, 54,207,168,172, 91,183,174,208,104,145, 63,198, 69, + 36, 18, 97,228,200,145,144, 72, 36,248,233,167,159,240,191,255,253, 15, 34,145, 8,115,231,206, 5,199,113,152, 48, 97,130,167, + 38,245, 53,130,117,236, 93,203,189, 72,208,167, 34, 92,141,187,103,100, 42, 84,188, 55, 50,132,209, 96, 40,178,207,169, 55,205, + 23, 95,124, 17, 82,169, 20,175,189,246, 26, 36, 18, 9,222,125,247, 93, 72, 36, 18,196,198,198,222, 51,116,109,219,250,189,239, + 18,137, 4, 7, 14, 28,200,251, 94,187,118,109,212,175, 95, 31, 82,169, 20,205,155, 55,135, 84, 42,197, 83, 79, 61,229, 83, 58, +221,198,237,251,239,191,207,107, 18, 4, 0,153, 76,214,234,173,183,222,234,231,109,253,186,117,235,178, 19,134,241, 48, 34, 88, +214,184,184,184, 51,113,113,113, 94, 35, 84, 5, 35, 73, 69, 69,154, 60,140,213, 81,184,154, 3, 39, 76,152, 48, 9,247,250,110, + 29,245,225,191, 50,183,185, 42, 24,229,242,164, 96, 4,235, 99,111, 39,116,113, 6, 75, 44, 22,251,100,176, 84, 42,213,169,140, +140,140, 22,114,185, 28, 57, 57, 57,247, 93,180, 61, 77,129, 72, 36, 66, 90, 90, 26, 84, 42,213,169,178, 60,136,197, 53, 17, 38, + 37, 37, 29,142,138,138, 26, 58,114,228,200,247,236,118,123,125,177, 88, 44,179, 90,173,178, 63,255,252,147,108,217,178, 5,229, +203,151,199,155,111,190, 73, 13, 6,131,157, 16, 98,147, 74,165, 87, 77, 38,211,183,215,174, 93, 91, 84,148,238,205,155, 55, 7, + 69, 69, 69, 77, 75, 76, 76,124,109,242,228,201,218,113,227,198,133,255,239,127,255,203,137,143,143, 71,247,238,221, 17, 18, 18, + 2,163,209, 8, 0, 80,171,213,242,114,229,202,105, 50, 50, 50,140,126, 20,206, 66,141, 85,110,110, 46,178,178,178,124,213, 57, + 65, 8, 25, 96, 52, 26, 13, 26,141, 70,153,147,147, 99,247,140, 48, 26,141, 70,228,230,230, 66, 16, 4,241,173, 91,183,146, 1, + 60, 65, 41,101,205,131,143,137,193,218,176, 97, 67,161,209, 38,119,116,203,125, 67,181,101,203, 22,159, 52,215,174, 93,123, 95, + 84,204,215, 78,217,222, 52,221, 77,152,139, 22,221, 59,229,220, 77,131, 34,145, 8,227,198,141,131, 66,161,192,236,217,179, 49, +113,226,223,247, 60, 25, 25, 25,196, 23,227,210,120,134, 34,111,185, 59, 82,116,247,206, 29, 72, 36, 18,104,181, 90,240,206,188, +225,249,124,138,180,249, 58,249,115,140,138,138, 2,250,171, 9, 96, 93,207,158, 61,159, 14, 10, 10,194,176, 97,195,160, 84, 42, +209,183,111, 95, 88, 44,150, 65, 0, 48,125,250,244,188,124,156, 60,121, 50,166, 76,153,130,220,220, 92, 43, 59, 99, 24, 15, 40, +130,245,113, 17,171, 4,187,141,147,203, 12,249,170,187,222,115,125,183, 70, 65, 83,228,138,136,237, 41, 78,203,219,127, 11, 67, +236,118,142,133, 93,180,125,137, 94,185,159,234, 41, 14,179,217,188,125,215,174, 93, 77,158,121,230, 25,113, 81,205,131, 6,131, + 1,229,203,151,199,213,171, 87,157,102,179,121,187, 47,119, 96,101, 21,193,114,153,172,141, 0, 54,186,231, 67, 66, 66, 86, 27, +141,198,222,225,225,225, 18,155,205,134,172,172,172, 43, 87,175, 94,173,233,111, 1, 74, 74, 74,154, 20, 21, 21, 85,179, 67,135, + 14,125,123,244,232,129,176,176, 48,217,233,211,167,209,163, 71, 15,212,170, 85, 43,208, 29,101,210,104, 52,114,145, 72, 20,138, +123, 79, 65, 20,139,195,225, 40,212, 88,185,141,172,175, 77,132, 0,246, 3,192,103,159,125,102,253,236,179,207, 34,114,114,114, +140, 57, 57, 57,188,219, 88,229,228,228,192,100, 50, 17,181, 90, 45, 94,181,106, 85,152,231,127, 24,255,126,131,229,235,147,121, +190,154,126,119, 4,203,211, 24,120, 78,171, 86,173, 42,248,180, 31,241, 69,115,209,162, 69,120,229,149, 87, 32,151,203,177, 96, +193,130, 60, 13,207,104,152, 59,157,132, 16, 24,141, 70, 82,156,102,147,153, 74,156,155, 66, 32,149, 74, 81,125,146,237,190, 38, + 66, 0, 94,159, 74, 44, 74,243,135, 31,126,240,169,137,176, 71,143, 30, 62,107, 54,105,210, 4, 0,240,229,151, 95,226,153,103, +158,193,233,211,167,189,234,206,155, 55,175,216,252,140,143,143,239,243,228,147, 79, 86,119, 58,157,231,235,215,175, 47, 78, 73, + 73,193,128, 1, 3,176,124,249,114,184, 46,100,152, 48, 97, 66,190,255,228,230,230, 90,216, 25,195, 40,235,232,149, 15,171,165, + 23,232, 63, 69, 60,155,235,138,248, 44,184, 62, 60,150,121,234,166,227,222,195, 92,240,178,188,160,169, 42,184, 13,207,117,210, +239,139, 96,249, 82,233,150,214, 96, 9,130,240,229,228,201,147, 95,107,221,186,117, 72, 64, 64, 0,146,146,146,188, 70,176,180, + 90, 45,236,118, 59,118,237,218,149, 35, 8,194,151,197,200, 58, 29, 14,135, 56, 60, 60, 28, 25, 25, 25,121, 3,238, 21,132,227, + 56, 40,149, 74,119,148,200,175, 81,226, 57,142,179,230,228,228, 56,158,123,238, 57,201,156, 57,115, 96,177, 88, 44,165, 40, 72, + 27, 78,156, 56,241, 76,215,174, 93, 73,116,116,180,216,109,124,148, 74,165,216, 29,193, 82,169, 84, 74, 66, 72, 40,238, 61,193, + 87, 20, 10,151, 33,203, 6,128,131, 7, 15,158,117,155, 85,183,177, 50, 24, 12,120,255,253,247,235,186, 46, 10, 10, 20,211, 92, +146,156,156,188, 79,167,211,173, 88,186,116,233,160, 54,109,218, 36, 52,109,218, 84,151,149,149,149,101, 52, 26,109, 38,147,137, + 10,130, 32, 86,169, 84,146,173, 91,183,234, 47, 95,190,220, 17,192,138,228,228,228,125,172,138,248,247, 83,150,230,202,211, 16, + 20,140, 96, 21,252, 44,137,230,232,209,163,241,195, 15, 63,220, 23,193,154, 61,123, 54, 68, 34, 17, 62,248,224,131,188, 38,178, +226, 12,145, 91,243,236,100,224,137, 41, 20,247,186, 83,252, 29,193,210, 6, 4,220, 91,175,144,186,165, 40,205, 55,222,120, 3, + 82,169, 20,245,234,213,131, 68, 34, 65,179,102,205, 32,145, 72,208,177, 99, 71, 72, 36, 18,159,140,213,125,233, 60,123, 22, 82, +169, 20, 53,106,212,192,192,129, 3,209,172, 89, 51,180,110,221, 26, 82,169, 20, 93,187,118,133, 72, 36, 66,143, 30, 61,124, 50, +130, 0, 32, 22,139,191,153, 49, 99,134, 88,161, 80,192,110,183,195,104, 52,226,206,157, 59, 40, 44,130,101, 50,153, 20,236,108, + 97, 60, 4,142,254,195,186,165,222,158,216,151, 19,186,164, 79, 17, 22,124,219,118, 98, 98, 98,118,100,100,228,115,131, 7, 15, +254, 99,254,252,249,202,234,213,171,227,194,133, 11,200,204,204,132,221,110,135, 84, 42,133, 78,167,131,209,104,196,234,213,171, + 77, 38,147,233,185,228,228,228,236,162, 52, 1,124,216,173, 91,183, 79, 63,252,240, 67, 81,189,122,245,112,247,238, 93, 24,141, +198,188,202,133, 16,130,128,128, 0,168, 84, 42,156, 57,115, 6, 7, 14, 28,224, 1,124, 88,140,102, 62, 68, 34,209,205, 27, 55, +110,240,223,124,243, 13, 44, 22,139,149,231,249, 91, 62,132, 37,189,106, 18, 66,182, 37, 38, 38, 26, 0, 4,168,213,106, 33, 53, + 53,213, 2, 64, 33, 8, 2,159,158,158,110,195,189, 49, 60,168,200,139, 99, 45,168, 73, 41,181,186,150,203, 0, 32, 59, 59, 59, +159,177,114,127,242, 60, 47,243, 92,191,184,116, 18, 66, 94,163,148,182,120,229,149, 87, 98,186,117,235,118,249,185,231,158, 51, + 6, 7, 7, 7,114, 28,103,185,114,229, 74,246,138, 21, 43,130,175, 95,191,222, 17,192,109, 66,200,107,190,238,123, 41,195,199, + 76,243, 1,106,122,158,235, 37,237, 35, 85,152,166,187, 31,146,231,180,114,229, 74,175,154, 5, 77, 65, 97,154, 98,177, 24,111, +190,249,102,190,168,216,196,137, 19, 11,237, 35,101,181, 90, 73, 81,249,233,222,199,196, 25,249,155, 50,205, 38, 19,164, 82,169, +183,116,146,226,142,145, 68, 34,193, 55,223,124, 83,226, 8, 86, 81,233,236,211,167, 15,146,146,146, 32,145, 72,112,248,240,225, + 66, 35, 88,197,229,167,107, 95, 44, 91,182,108,129, 92, 46,199,234,213,171,157, 17, 17, 17,226,160,160,160, 66, 35, 88, 86,171, + 85,206,206, 35,166,249, 32, 52, 31, 55,138, 52, 88, 78,167, 19, 21, 43, 86,204, 51, 79,132, 16,247,168,200,121, 33,120,145, 72, +228, 83,223, 9,143, 8,201, 95,145,145,145,253,250,246,237,251,235, 75, 47,189,164,173, 83,167,142, 36, 58, 58, 26,102,179, 25, +137,137,137, 72, 76, 76,116,238,216,177, 35,199,100, 50, 13, 77, 78, 78,254,171, 56, 61,189, 94, 63, 61, 50, 50,114,221,243,207, + 63, 63,253,201, 39,159,236,253,214, 91,111,161,106,213,170,200,206,206, 70,112,112, 48,194,194,194,112,253,250,117,172, 94,189, + 26, 89, 89, 89,127, 82, 74, 39, 36, 39, 39, 95,240, 39,147, 20, 10,197,204,233,211,167,119,136,136,136,120, 34, 35, 35,227,150, + 72, 36, 26, 95,210, 12,215,235,245,169,155, 55,111,190,244,236,179,207, 70,236,219,183, 47,149, 16, 98, 29, 52,104, 80,244,193, +131, 7, 83, 9, 33,214,193,131, 7, 71, 31, 56,112, 32, 85,175,215, 31,241, 39,137, 0,208,181,107, 87, 75,193,139,148, 71,228, +202,103,146,146,146,238,234,116,186, 70,148,210,121,155, 55,111,238,191,121,243,102,111,230,123, 53, 33,100,116, 82, 82,210, 93, +118, 26, 61, 62, 17,172,162,158,240, 43,169,230,234,213,171,189, 70,174, 10,106,250, 90,143, 20,188,201, 43, 24,101,247,114, 33, +160,101,185,239,254,164,211,109,250,154, 54,109, 10,137, 68,130, 14, 29, 58,228,139, 92,249, 19,193,114,107,214,172,121,175,119, + 66, 84, 84, 20,178,178,178,208,161, 67, 7,116,233,210, 5, 98,177,184, 68,186,130, 32,188,178,110,221, 58, 39, 0, 21,128, 55, +244,122,253, 85,119, 84,209, 91, 4,139,193, 96,148,210, 96, 73, 36,146, 52, 95,223, 45,232, 70, 38,147,165,249,104,178,182, 84, +173, 90,181,234,194,133, 11,223, 84,171,213,157, 44, 22, 75, 3,151,145, 57,149,155,155,187,141,227,184,175,147,147,147,125,238, + 52,228, 50, 76, 79,235,116,186, 86,207, 63,255,252,231, 45, 91,182,108, 49,114,228, 72,136,197, 98,172, 92,185, 18, 73, 73, 73, + 7, 1,188,167,215,235, 75,212, 87, 40, 49, 49, 49, 27, 64,243,178,200,112,215, 75,172,155,150,229, 65,244,136,100, 21,249,187, +159, 70,240, 14,128, 1,145,145,145,173, 1,180,230, 56, 46,198, 85, 25, 39, 0,216,199,154, 5, 31, 47, 4, 65,200,123,173,140, +123,114,143,188, 94, 82,115, 37, 8, 2,194,194,194,242,233,185,135, 82, 40,162, 89,176,216, 1, 60,195,194,194,242,110,246, 60, +211, 89,152, 38,165, 20, 54,155,173,200, 78,238,225,225,225,247,221, 60,250,250,240, 78, 97,233,116,107,122,166,211,179,111, 88, + 73,242, 51, 60, 60, 28, 6,131,193,159,116, 22,235, 6,143, 31, 63,158, 1, 96,160,123, 62, 54, 54,118,221,249,243,231,159, 46, + 44,130,197, 96, 48, 74,105,176, 14, 29, 58, 20,241, 32, 55,124,237,218,181, 28, 0, 83, 93, 83,153,224, 50, 80, 45,117, 58, 93, +159, 3, 7, 14,124,224, 90,252,169, 94,175, 95,251, 95, 56,152, 62,118, 20,244, 11,151,145, 98,102,234,241,142, 92,165,117,235, +214, 45,220,223,255, 21,117, 67, 37,145, 72,210,186,118,237,234,183,166, 92, 46, 79, 45, 66, 51,185, 71,143, 30, 21, 75,144,206, +204,168,168, 40,190,172,110, 36,125, 72,103,137, 52,139,203,207,178, 78,103, 97,196,199,199,247,209,233,116, 9,161,161,161,213, + 45, 22,139,204, 98,177, 72, 61,163,226, 74,165, 50,157,157, 53, 12, 70, 41, 12,214,191, 25,151,161, 90,203, 14, 47,131, 81, 60, + 15,226,102,234, 65,104, 30, 56,112,160,210,127,117,223, 31,244, 13,175,151, 58, 52,134,157, 25, 12, 70,233,224, 88, 22, 48, 24, + 12, 6,131,193, 96,148, 45, 4, 64,125,111, 63,248,243,116, 0, 33,164,190,191, 27, 46, 78,159,105, 50, 77,166,201, 52,153, 38, +211,100,154,143,159,102,113,218,143,203,211,137,196,215,177, 82, 74, 36,206, 30, 97,101,154, 76,147,105, 50, 77,166,201, 52,153, +230,127, 16,214, 68,200, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, + 96, 49, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193,120,100,120,160, 79, 17, 50, 24, 12, 6,131,193, 96,252, + 23,201,139, 96, 17, 66,118, 19, 66,118,179, 44, 97, 48, 24, 12, 6,131,241, 79,242, 56,122, 16,177,107,199, 40,128,246,236, 16, + 51, 24, 12, 6,131,193,248,135,205,213, 99,233, 65, 8,165, 20,132, 16,250, 32, 94, 20,204, 96, 48, 24, 12, 6,131, 81,156,193, +122, 28, 61, 8,235,228,206, 96, 48, 24, 12, 6,131,241,128, 12,214,199,172, 15, 22,131,193, 96, 48, 24,140,135,192, 99,233, 65, +242,158, 34, 36,132,180, 3, 0, 74, 41, 51, 89, 12, 6,131,193, 96, 48,254, 57, 51,242, 24,122, 16, 54, 76, 3,131,193, 96, 48, + 24, 12, 70, 25,243, 64,251, 96, 17, 66,234, 51, 77,166,201, 52,153, 38,211,100,154, 76,147,105, 50,131,197, 96, 48, 24, 12, 6, +131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48, 24,204, + 96, 49, 24, 12, 6,131,193, 96, 60, 36, 8, 0,175, 79, 2, 80, 74, 79,251, 44, 82,130,167, 9,138,211,103,154, 76,147,105, 50, + 77,166,201, 52,153,230,227,167, 89,156,182, 63,254,227,145, 54, 88,190,140,131, 69, 92, 47, 10,242, 91,156,144,250,101,157, 81, + 69,105, 18, 66,136,235,224,208,178, 76,103, 73,246,255,159,222,119,166,201, 52,153, 38,211,100,154, 76,243,223,172,249,184, 33, + 46, 38, 3, 57,220,107, 70, 36,132, 16, 1,128, 64,203, 96,100, 82, 15, 93, 0, 16, 92,158,136,150, 66,143, 0, 16,185,247,135, + 16,226, 4,192,151, 54,173, 15,106,255,255, 21,206,251, 94,158,186, 95,190, 73, 75,224, 91, 25, 12, 6,131,193, 96, 6,171,224, +197,245,137, 39,158,144,180,110,221,250, 84, 96, 96, 96, 45,207,223,122,247,238, 13, 0,176,219,237,252,150, 45, 91,196,254,110, +176,110,221,186,210,162,116,121,158,231, 55,110,220,232,179, 46, 33,132, 68, 71, 71,203, 42, 84,168,112, 50, 48, 48,176,166, 55, + 77, 65, 16,248, 13, 27, 54,248,165, 89,220,254,251,155,206,127, 19, 58,157, 78, 92,179,102,205,193,106,181, 90,233,185, 60, 54, + 54,214,157, 63,244,216,177, 99, 11,217,233,195, 96, 48, 24, 12,134, 31, 6,171,122,245,234,210,176,176,176, 35,209,209,209, 53, + 23, 46, 92,136,147, 39, 79, 34, 38, 38, 6, 14,135, 3, 78,167, 19,130, 32, 96,200,144, 33,162,146,152,171,176,176,176,163,110, +221,212,212, 84, 40,149,127, 95,195,121,158,199,176, 97,195,124,214,117,155,171,232,232,232, 35, 85,170, 84,169,177, 96,193, 2, + 92,188,120, 17, 85,170, 84,129, 88, 44,134,221,110, 71,110,110, 46, 70,142, 28,233, 87, 90, 11,219,127, 65, 16,224,112, 56,192, +243, 60, 6, 15, 30,236,247,254, 55,109,218, 52,149,231,249,112, 95,214,149, 72, 36,105,135, 14, 29,138, 40,110,189,102,205,154, +165, 58,157, 78,159, 52,165, 82,105,218,193,131, 7, 35,138, 51, 87, 90,173,118, 72,157, 58,117, 20, 43, 87,174,196,237,219,183, +161, 82,169, 32, 8, 2, 4, 65,128,221,110, 71,191,126,253, 8, 59,117, 24,140,135, 15, 33,132, 40, 20,138,111, 45, 22,203,235, + 37, 9, 49,251, 83,127,248, 83,143, 16, 66, 42, 3,232, 45, 18,137,106, 72, 36,146,218,148,210,202, 78,167, 51,194,245,255, 84, +145, 72,148,232,112, 56, 46,216,108,182,203, 0,254,164,148, 38,178,163,201,120,236, 13, 22, 33,132,107,223,190,253,142, 74,149, + 42,213, 95,184,112, 33, 17,137, 68, 56,112,224, 0,146,146,146, 16, 25, 25, 9,173, 86, 11,133, 66, 81,146,138,128,107,223,190, +253, 78, 79,221,245,235,215, 35, 42, 42, 10, 17, 17, 17,208,104, 52, 37,209, 21, 69, 71, 71,239,172, 92,185,114,189, 5, 11, 22, +228,165,213, 96, 48, 32, 48, 48, 16,185,185,185, 72, 75, 75, 43, 73, 58,203,124,255, 93, 6, 50,124,207,158, 61, 80,169, 84, 69, +174,151,153,153,137,206,157, 59,251, 84,233, 57,157,206,240,189,123,247,230, 51,170,122,189, 30, 63,252,240, 3,222,121,231,157, +188,109,165,164,164,160, 87,175, 94,225,197, 85,214, 53,107,214, 28,236, 54, 87, 34,145, 8,203,150, 45, 67,100,100, 36, 66, 66, + 66,136, 66,161, 32,114,185, 28,148, 82, 90,210,126,121, 12, 6,163, 12, 43,112,177,184,163, 72, 36, 26, 38, 22,139,215, 0,216, +238,239,255,189,213, 31, 0, 32, 8, 2,120,158,207,187,177, 18, 4, 33,111,121,199,142, 29,139,171, 71,122,148, 43, 87,110,117, +243,230,205,197, 97, 97, 97, 98,165, 82, 9,181, 90,141,160,160, 32, 40, 20, 10, 8,130, 16,237,116, 58,163,173, 86,107,251,180, +180, 52,231, 31,127,252,241, 57, 33,164, 31,165,116, 35, 59,162,140,199,214, 96,185,250,221,112,106,181,186,229, 15, 63,252, 0, +145, 72,228,190, 99,129, 66,161,128, 82,169,132, 66,161,128, 66,161, 0,207,243,232,221,187,119,190, 11,108, 97,205,134, 69,233, + 42,149,202,124,186, 0,242,233,218,108, 54,254,175,191,254, 42, 76, 83,172,209,104,154, 47, 92,184, 48, 79,147,231,121,100,101, +101,193,110,183,195, 96, 48, 32, 61, 61,221,175,187, 65, 95,247,191,164, 72,165, 82,172, 89,179, 6, 82,169,244,190, 73, 38,147, +229,125,247, 87,115,231,206,157,249,180, 0, 64,165, 82, 97,251,246,237, 8, 10, 10, 66, 96, 96, 96,113,251, 14, 0, 68,173, 86, + 43,221,230,202,173,237,116, 58, 37,179,102,205,250, 84,163,209, 4,186,162, 92,208,233,116,243, 75,218, 4,203, 96, 48,202,134, +160,160,160,247, 87,173, 90, 37,239,223,191,255,164,146, 24, 44, 0, 80, 42,149,216,178,101, 11,196, 98, 49, 36, 18,137,215,201, +253, 91,112,112,176,187,174, 40,170, 62,250,120,229,202,149,242,165, 75,151,226,202,149, 43, 0, 0,153, 76, 6,181, 90, 13,173, + 86,139,144,144, 16, 4, 7, 7, 35, 52, 52, 20, 79, 62,249,164,120,196,136, 17,226,150, 45, 91,126, 12,128, 25, 44,198,227, 29, +193,130,171, 99,243,201,147, 39,113,224,192, 1, 72,165, 82,132,133,133, 33, 40, 40, 40,207, 96,200,229,114, 12, 26, 52, 8, 47, +188,240, 2,172, 86, 43,108, 54, 27,156, 78, 39, 94,126,249,229,124,205,102,222,158, 48,200,200,200,192,218,181,107, 33,147,201, + 16, 26, 26,154, 23, 17,114,235,182,111,223, 30,227,198,141, 3,165, 20,153,153,153,197,105, 18, 0,184,116,233, 18,246,239,223, + 15,167,211, 9,165, 82, 9,135,195,129,212,212, 84,156, 61,123, 22,137,137,137,200,205,205, 69,183,110,221,126, 20,139,197, 31, +173, 95,191, 94, 95, 48, 77,222, 52,139,219,255,226, 40,236,233, 10,135,195,129,190,125,251,130,227,184,188,202, 75, 42,149, 66, + 34,145,228, 25,172,221,187,119,251,173,217,177, 99, 71,136,197, 98,136,197, 98, 36, 36, 36,228,253,214,191,127,127, 72, 36, 18, +156, 60,121,210,103,205,148,148, 20, 44, 89,178,196,109,250, 36,191,254,250,235,180, 26, 53,106,104,230,206,157,235,181,201,112, +204,152, 49, 34, 95,210, 89, 26,152, 38,211,100,154,247,221, 20,149, 27, 61,122,116,189,170, 85,171, 34, 34, 34,162, 6, 33,164, + 28,165, 52,163, 36,154, 98,177, 24,148, 82,252,245,215, 95,184,124,249, 50,182,110,221, 10,155,205,134,160,160, 32, 4, 5, 5, +161,113,227,198, 24, 49, 98, 4, 66, 66, 66, 80, 48,112, 93, 80,147, 82,186, 24, 64,163,161, 67,135,146,141, 27, 55, 34, 35, 35, + 3, 6,131, 1,118,187, 29, 14,135, 3, 98,177, 24, 42,149, 10, 26,141, 6, 81, 81, 81,224, 56,142,218,108,182,197,236,184, 51, +205, 98,104, 2, 32,204, 99,222, 6, 64,230,241,153, 14,224,168,151,245,220,203, 37, 0,158,116,253,198, 3, 48, 0, 8,242,162, + 87,152, 78, 6,238, 61,240, 21, 86, 96,253,130,219,201,111,176, 8, 33,238, 51,166, 61,128,125, 0, 16, 19, 19, 3,189, 94, 15, +185, 92,142,160,160, 32, 52,105,210, 4, 0, 96, 48, 24, 32,151,203,177,102,205, 26, 72, 36, 18,168,213,234,188,169,136, 3, 65, + 93, 79,225, 65,165, 82,161, 66,133, 10, 80, 40, 20,232,216,177, 35,174, 94,189,138, 42, 85,170,228,233,158, 60,121, 18, 75,151, + 46, 69, 64, 64, 64,145, 81, 23,151,166, 3, 0,170, 86,173,138,172,172, 44,100,103,103,195,225,112,224,232,209,163,232,218,181, + 43,186,119,239, 14,181, 90,141,140,140, 12, 28, 59,118,172,215,244,233,211,251,247,234,213,107,200,250,245,235, 55, 21,151,206, +130,251,239, 54, 88,114,185,220, 39,131, 85, 24, 14,135, 3,127,253,245,151,215, 8, 86,193, 8,148, 63,154, 71,143, 30,245,250, +255,109,219,182, 33, 48, 48, 16, 50,153,172,184,147, 37,175, 28,168,213,106, 68, 70, 70, 66, 42,149,146,239,191,255,254,211,154, + 53,107,106,230,206,157, 75, 60,155, 12,195,195,195,161, 86,171, 75, 21,205, 99, 48, 24, 37, 39, 32, 32,224,205, 97,195,134, 5, +223,188,121, 19,125,250,244, 41,159,150,150,246, 38,128, 15, 74,116,167, 45, 22,227,189,247,222,195, 43,175,188,130,126,253,250, + 97,239,222,189, 24, 62,124, 56, 94,127,253,245,124, 17,172,226,162, 87,174,250,104,193,243,207, 63,255,202,170, 85,171,106,191, +245,214, 91, 28, 0,200,229,114,168, 84, 42, 16, 66, 96,177, 88,242,166,243,231,207, 11,163, 70,141,186,104,179,217, 22,176, 35, +250,223,197,211,131, 80, 74,119, 23,178, 90, 24, 33,100,189,199, 53,171, 23, 33,100,189,231,103, 97,235,185,190,182,157, 56,113, + 98,227,233,211,167, 79,107,209,162,197,178, 3, 7, 14,252, 86,152, 94, 97, 58, 19, 39, 78,172, 55,125,250,244,105,158,235,123, +217,206,253, 17, 44,119,183, 26,120,140,238, 30, 25, 25,153,215, 52,150,150,150, 6,165, 82, 9,141, 70, 3, 65, 16,160,209,104, +160,209,104,160, 86,171,161, 82,169,138, 52, 88,238, 77,184,191, 68, 68, 68, 64,161, 80,224,183,223,126, 67,181,106,213,176,105, +211, 38, 40, 20, 10,136, 68,162,188, 59, 27,247, 84, 12, 60, 0,136, 68, 34, 4, 6, 6,194,225,112, 96,199,142, 29,120,235,173, +183, 32, 8, 2,174, 94,189,138,121,243,230, 97,236,216,177,104,216,176, 97,185,159,126,250, 41,229,229,151, 95, 94,222,167, 79, +159, 39,214,174, 93,123,187, 16, 77,193,219,254,171, 84,170, 60,131,229,110, 62, 43, 9, 60,207,163, 79,159, 62,121, 81,171,130, + 77,132, 50,153, 12,219,182,109,243, 91,179, 91,183,110, 16,139,197,144, 74,165, 56,112,224, 64,222,111,131, 6, 13,130, 84, 42, +197,177, 99,199,124,186, 41, 1,238,245,179, 40, 87,174, 28, 17,137, 68, 68,171,213, 6,206,157, 59,247,190,230, 82,183,209, 44, +141,217,100, 48, 24,190, 33,149, 74,103, 73, 36,146, 65,181,107,215,182, 85,171, 86, 77,194,113, 28,250,245,235,167,170, 87,175, + 30,249,235,175,191,208,178,101, 75,238,218,181,107,175,140, 28, 57,242, 5,142,227,144,148,148,228, 56,115,230,140,204,102,179, +173, 72, 75, 75,123,187, 56,125,155,205,134,180,180, 52, 84,171, 86, 13,231,206,157, 67, 70, 70, 70, 94,157,226, 57,113, 28,135, +226,186, 94, 82, 74,109,132,144, 86,189,122,245, 58, 58,123,246,236,106,117,235,214, 37,185,185,185,200,205,205,133,201,100,130, +251,251,233,211,167,233,111,191,253,118,205,100, 50,181,164,148,218,216, 81,254,111,227,225, 65, 72, 49,235,245,242, 81,207,189, + 94,170,235, 83, 62,125,250,244,105, 5,255, 95,156,158,231,239, 5,254,111, 43, 96,202, 82, 11, 53, 88,158, 81,156,222,189,123, +131,231,121, 4, 4, 4, 64, 46,151, 67,161, 80,160, 92,185,114,249,214,211,106,181,249,162, 87,197, 25, 44,183, 46,165, 20, 90, +173, 22, 53,106,212,200,251,173,123,247,238,112, 95,216,221, 6, 75,171,213, 22,107,176,220,154,118,187, 29, 70,163, 17,201,201, +201,232,218,181, 43, 40,165,184,116,233, 18,164, 82, 41,126,252,241, 71,188,241,198, 27,176, 88, 44, 80,171,213,229, 95,122,233, +165,171, 43, 86,172,248, 10, 64,191,162, 52, 93,119,136,121,251,239, 54, 19,110,163, 33, 22,139,243,245, 21, 19,139,197,105,127, +252,241, 71,177, 79,253,241, 60,143,109,219,182, 21, 25,189,146, 72, 36,126, 27,172,253,251,247,123,141, 96,109,222,188, 25, 65, + 65, 65,197, 70,176,220, 81,172,216,216, 88,240, 60, 15,181, 90, 13,142,187,231,181, 61,155, 12, 67, 66, 66,160,213,106,253,106, + 46,101, 48, 24,165,195,225,112,124, 42,147,201, 98, 94,125,245,213,102,157, 59,119,150,137, 68, 34,136, 68, 34, 92,189,122, 21, +114,185, 28, 90,173, 22,243,230,205, 11,117,215, 81,251,247,239,183,189,240,194, 11,135,211,211,211, 63,245, 49, 26,134, 85,171, + 86, 65, 42,149, 98,243,230,205,208,106,181, 24, 60,120, 48, 2, 3, 3,241,214, 91,111,225,217,103,159,205, 51, 88, 62, 94,220, +178, 9, 33,173,198,141, 27,119,116,198,140, 25,149, 42, 85,170, 4,187,221, 14,155,205, 6,187,221,142,171, 87,175,226,183,223, +126,187,101, 50,153, 90, 81, 74,179,217, 17,102,248, 17,237, 90,239,139,201,242, 88, 47,222,181,200, 60, 97,194,132, 73,132,144, +245, 19, 38, 76,152, 20, 23, 23,119,198, 23,189, 66,126,223,224,250,236,233,177, 44,190, 88,131,229,121,209,118, 95, 64,203,149, + 43, 7,135,195, 1,145, 72,148,119,130,125,247,221,119,248,238,187,239,242,214,207,206,206,246, 53,115,160, 80, 40,220,205,118, +232,222,189, 59,118,238,220,137,118,237,218, 1,128,191, 17,172,123,185,102, 54, 35, 61, 61, 29,199,143, 31, 71,207,158, 61,145, +152,152,152,215,159,137,227,184,188,200, 14, 33, 4, 93,186,116,193,143, 63,254,216,218, 23,211, 82, 48, 82,227, 25,185,138,142, +142,198,236,217,179,243,230,123,247,238,237,211, 83,127, 60,207,163,111,223,190,247, 69,173,100, 50, 25,228,114, 57,100, 50, 25, + 54,108,216,224,119,161,123,230,153,103,242,244,182,110,221,154,183,124,232,208,161,144,203,229,216,187,119,175, 63,119, 18, 80, + 42,149,212,109,244,220, 77,134, 10,133, 2, 90,173, 22, 1, 1, 1,249,242,134,193, 96, 60,240,187,251, 44, 0,237, 2, 2, 2, + 62, 44, 95,190,252,235,111,188,241, 70, 88, 68, 68, 68,222,249,168,213,106, 97, 52, 26,145,157,157,141, 17, 35, 70,164, 95,184, +112, 97, 78, 82, 82,210,167,190,234,187,155, 0,157, 78, 39, 54,110,220,136, 57,115,230,160, 99,199,142,247,117,116,247, 37,130, +229,145,230,116, 66, 72,235,119,223,125,247,208, 39,159,124,162, 11, 13, 13,133,221,110,199,141, 27, 55,240,211, 79, 63,233, 77, + 38, 83,107, 74,105, 58, 59,186, 12, 63,207, 5,119,180,200, 91, 64,163,167,151,200, 83, 19,220,235, 27,101,141,139,139, 59, 19, + 23, 23,215,139, 16,178, 62, 46, 46,174, 87, 17, 17,172,158,197, 68,184,122,226, 94,159,171,162,207, 43, 15,227, 67,113,175, 15, + 86,222, 69,214,125, 1,117, 56, 28,247, 69, 85,166, 77,155,134,190,125,251, 66,173, 86, 35, 42, 42,202,151, 38,194, 60,131, 85, +161, 66, 5, 24,141, 70,116,239,222, 29,130, 32,128,227,184,188,199,128, 61, 13,150, 86,171,245, 73,211, 96, 48, 32, 53, 53, 21, +137,137,137,144, 74,165,224,121, 30,131, 6, 13, 66, 98, 98, 34, 2, 3, 3,243,140,139, 84, 42,133, 70,163,137,112, 56, 28,170, +238,221,187,203, 54,109,218, 84,104, 88, 90, 16,132, 66,205, 21, 0, 40, 20, 10,236,218,181,203,239,167, 10,221, 29, 73,139,138, + 96,137,197,254, 63,144, 87, 48, 42,230,102,253,250,245,197, 62, 65,232, 13,185, 92,158,167, 35, 8, 2,194,195,195, 33,151,203, +243, 61,245,201, 12, 22,131,241,207,146,147,147,243,137, 84, 42,221,250,227,143, 63,254,185,123,247,238,176,139, 23, 47,230,171, + 47,187,117,235,150,118,252,248,241,167,205,102,243, 17,127,116,121,158,207,139, 94, 69, 71, 71,163, 67,135, 14,247, 53, 15,250, + 19,193,242,168,239,110, 19, 66,218,127,243,205, 55,135,103,207,158, 29,108, 52, 26,177,104,209,162,108,163,209,216,158, 82,122, +155, 29, 81, 70, 97, 30,164, 24,226, 11, 68,143,224,238, 15,229, 54, 68, 5,231, 1, 4,187,151, 77,152, 48, 97,146,175,255,243, +156,119, 71,192,138, 48, 94,247, 27, 44, 74, 41, 41, 44,210, 36,147,201, 32, 18,137,242, 12,144, 27,119, 19,158, 78,167, 3,207, +243, 62,117,126,116,235,230,230,230, 66, 38,147,229, 27, 91,197,141, 74,165,202,211,246,181,179,119,118,118,118,222,120, 87,169, +169,169, 80,169, 84,216,180,105,147, 87,243, 98,183,219, 83,164, 82,105,112, 81,230,202,211, 68,185,247,223,219,111,110,163, 81, +112, 12,153,226, 12,150,183,199,160, 75,218, 60,232,206, 83,207, 33, 30,220,249,150,149,149,149, 23, 29,243,183,178,117,153, 39, +234,158, 87,171,213,247, 53,151, 50,131,197, 96, 60,148, 59,120,245,176, 97,195,212,130, 32, 64,171,213,230,213,151, 42,149, 10, +157, 59,119,150, 39, 36, 36,168,253,212,195, 31,127,252,129,243,231,207,195, 98,177,224,243,207, 63,247,106,174, 74,114,227,231, +210,191, 18, 19, 19, 35,116,235,214, 13, 7, 15, 30,132, 92, 46,119, 80, 74,175,176, 35,201,240, 40, 35,190, 24,136,140, 2,125, +157,220,243,182, 2,102,167,224,124,193,245, 1, 32, 13,128,168,152,255, 21,156,207,136,139,139,219,229,142,124,185,116, 69,133, +245,191,202, 23,193, 42, 16,189,225,251,247,239,159,207, 85, 72, 36, 18,188,252,242,203, 56,127,254, 60,212,106, 53,194,194,194, +252, 54, 87,130, 32,240,158, 35,192,139, 68, 34,244,236,217, 19, 55,111,222,204,235, 40, 31, 26, 26,234,239,160,163,252,148, 41, + 83, 68, 0,224,116, 58,177,107,215, 46,116,233,210, 5, 54,155,205,171,193,250,227,143, 63,120,165, 82,121,160,184,116,246,235, +215,207,107, 79,118,137, 68,130,134, 13, 27, 34, 36, 36, 36, 95, 52,199, 87,174, 28,253, 12, 63,175, 53,149,105,225,140,223,246, + 30,150,109,113,222,183,124,220,184,113,126,107,137,197, 98,218,171, 87,175,188, 3, 26, 25, 25,153, 23,205,244,102,174,152,193, + 98, 48,254, 89, 34, 34, 34,222,239,211,167,143,210,102,179,225,218,181,107,194,148, 41, 83,238,204,153, 51, 39,180, 73,147, 38, +220, 43,175,188, 18,176,116,233,210,247, 1,236,240, 85,207,102,179,225,211, 79, 63, 5,165, 52,223,205, 46, 33, 4,132,144,124, + 93, 67, 74,113, 1,101, 7,142, 81, 90,142, 20, 51,239,239,255, 31, 56, 94, 13,150,183, 65, 35,123,247,238, 77,219,181,107,135, +154, 53,107,230,245,201,113,155,164,130, 81, 40,143, 19, 52,223,219,182, 11,234,246,238,221,155,246,235,215, 15,167, 79,159, 70, + 96, 96, 32, 2, 3, 3, 17, 16, 16, 80,228, 72,231, 5, 53,255,252,243,207, 60,205,126,253,250,149,255,225,135, 31, 46, 52,109, +218, 52, 39, 56, 56,184,162,187,239,149, 59, 50,148,153,153,121,225,187,239,190,139, 10, 9, 9,233,225, 79, 58, 11,166,249,195, + 15, 63,196,217,179,103,139,140, 96,121,123,211,184, 92, 46, 79,108, 91, 63,163,114, 98,118,247, 98, 15,204,245,235,215,111,248, +162,169, 80, 40, 18,187, 52, 49, 84, 78,177,250,164,153, 88,156,230,225,195,135, 23, 22,216,223,239, 93,105,207,235, 39,230,158, +100, 50,153,215,138,151,189, 97,158,105, 50,205, 7,163, 73, 8, 41,215,162, 69,139, 26,132, 16,252,240,195, 15,185,243,230,205, + 75, 72, 74, 74,122,121,192,128, 1, 63,191,246,218,107,141,222,125,247, 93, 77,149, 42, 85, 10, 29, 19,203,155,230,150,101,195, +176,102,183,228,129,238,187,167,193,242,197,108,177,227,254,223,212,124,220, 16,251,153,161,121, 67, 51,120, 51, 84, 37,193,100, + 50,229,235,212,238,107,199,118,111,252,254,251,239, 41,189,122,245,122,118,212,168, 81,203,135, 12, 25,114,189, 79,159, 62, 80, +171,213,225, 22,139, 37,117,229,202,149,252,247,223,127, 95, 33, 52, 52,116,196,250,245,235,175,151, 54,221, 42,149, 42, 95, 51, +161, 47,216,237,246, 22,173, 95, 76, 57,104,177,124, 91,185,168,245,228,114,185,222,233,116,182,246, 69,211,102,179,181,104,243, + 82,234, 65,179,185,104, 77,165, 82,153,104,181, 90, 91,148,100, 95, 61,154, 12,243,117,198, 47,205,112, 21, 12, 6,195,127,194, +195,195,199, 62,251,236,179,229,159,125,246,217,244, 75,151, 46,125,151,146,146, 50,213,245, 83, 59,157, 78,247,209,142, 29, 59, + 94, 27, 57,114,100,249,115,231,206,141, 5,240,126,113,122,114,185, 60,177, 79, 91,103,229, 44,116,242, 57, 13,137,137,137,165, +122,111, 32,139,102, 49,152,193, 42, 64,193,230, 61,111, 72,165, 82,222,207, 11, 55, 63,122,244,232, 34, 53, 37, 18,137, 95,154, +235,215,175,223,212,167, 79,159, 39,214,175, 95,255,197,242,229,203,219,218,237,118,165, 68, 34,209,170, 84,170,131,161,161,161, + 61,214,173, 91,119,181, 52, 25, 38,145, 72,210,188, 61, 49, 40,149, 74,139,125,233,225,209,163, 71, 83, 1, 84, 41,203, 3,248, + 32, 52, 11, 30,166, 87, 94,121,165,200, 99,164, 86,171,121,118, 42, 49, 24,255, 64,133, 45, 22, 87,255,226,139, 47, 46,166,165, +165,141, 48,155,205,135, 60,127,211,235,245, 83,149, 74,229,182,235,215,175,255, 32, 18,137,170,251,119,211,247, 93,101, 95,214, + 47,233,141, 26,207,243, 36, 57, 57, 25, 51,102,204,200,205,200,200,216,199,142, 36,131, 25, 44, 15, 30,196,187,230, 54,110,220, +248, 64,222, 95,231, 26, 68,116, 16, 0, 20,247,180,160,191,252,254,251,239, 17,255,165, 2,226,217, 4,203, 96, 48, 30, 46, 73, + 73, 73, 3,139,250,221,101,186,158,120,132,110,208, 0, 0,201,201,201, 39,234,214,173,123, 41, 43, 43,107, 6,165,244, 22, 59, +146, 12,102,176, 30, 3,202,210, 92, 49, 24, 12, 6,195,127,238,220,185,211,137,229, 2,227,191, 6,199,178,128,193, 96, 48, 24, + 12, 6,163,108, 33, 0,234,123,251,193,159,167, 3, 8, 33,245,253,221,176, 15,111,138,103,154, 76,147,105, 50, 77,166,201, 52, +153,230, 99,166, 89,156,246,227,242,116, 34,121,144, 79,116,176, 71, 88,153, 38,211,100,154, 76,147,105, 50, 77,166,249, 95,132, + 53, 17, 50, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6, +131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48, 30, 25, 8,123, 47, 20,131,193, 96, 48, 24, 12, 70,217,194, 34, 88, + 12, 6,131,193, 96, 48, 24,101,140, 24, 0, 8, 33,121, 97, 44, 74, 41, 97,217,194, 96, 48, 24, 12, 6,227,159,224,113,245, 32, + 98,102,172, 24, 12, 6,131,193, 96, 60, 76, 30, 71, 15,194,121,115,144, 12, 6,131,193, 96, 48, 24,255, 20,143,163, 7,225, 30, +103,247,200, 96, 48, 24, 12, 6,227,209,231,177,143, 96,177, 40, 22,131,193, 96, 48, 24,140,127,154,199,209,131,176, 97, 26, 24, + 12, 6,131,193, 96, 48,202,152, 7, 58, 76, 3, 33,164, 62,211,100,154, 76,147,105, 50, 77,166,201, 52,153, 38, 51, 88, 12, 6, +131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, + 6,131,193, 12, 22,131,193, 96, 48, 24, 12,198, 67,130, 0,240,250, 36, 0,165,244,180,207, 34, 37,120,154,160, 56,125,166,201, + 52,153, 38,211,100,154, 76,147,105, 62,126,154,197,105,251,227, 63, 30,105,131,245, 32,199,193, 34,132,212, 47,235,140, 98,154, + 76,147,105, 50, 77,166,201, 52,153,230,227,167,249,184,193,154, 8, 25, 12, 6,131,193, 96, 48,202, 24, 49,203, 2, 6,195, 55, +170, 87,175,174,141,140,140,236,179,103,207, 30,217,197,139, 23,145,144,144,128, 5, 11, 22,216,146,147,147,215, 94,185,114,197, +192,114,232,241, 32, 38, 38,166, 43, 33,228, 61, 0,160,148,126,158,144,144,176,165, 20,119,249,164, 74,149, 42,111,168, 84,170, + 30, 98,177, 88,199,243, 60,177, 88, 44,122,139,197,178, 53, 41, 41,105, 22,165, 84, 40,129,102,147,114,229,202,189, 90,175, 94, +189,154, 87,175, 94,189,117,235,214,173, 37, 0,182, 0,232, 90,177, 98,197,231,171, 85,171, 86,241,204,153, 51,151, 50, 50, 50, +230, 83, 74,143, 62,172,116, 50, 24,204, 96,249,118,242,113, 26,141,166,147, 76, 38,251,159,197, 98,137, 81, 40, 20,167, 40,165, +243,239,222,189,187,145,157,120,143, 47, 58,157, 78, 4,160,115,120,120,248,219, 57, 57, 57, 45,131,130,130, 14,167,165,165,125, + 33, 8,194, 22,189, 94,207,151,240,130,195,169, 84,170,167,196, 98,241, 43, 54,155,173,137, 76, 38, 59, 1,224,251,156,156,156, +205, 15,179, 44, 53,111,222, 60,213,225,112,132, 23,181, 78,104,104, 40,118,239,222,141,121,243,230,209,213,171, 87,223, 29, 52, +104,144,124,248,240,225,138,133, 11, 23,182, 4,240, 74, 73, 52,221, 72, 36,146,180, 67,135, 14, 69, 60,172,253,215,104, 70,229, +235, 43, 96, 52, 46,240,235,197,171,167,178,247, 0, 0, 78,231,236, 1, 40, 80, 63,176,109,153,105,158,202,222,115,175,179,104, + 96, 91,144, 17,247,222, 85, 70,127,160,196,243,123, 89,230, 5, 33,228,189,225,211,119,181, 21, 40,176,104, 82, 7,226, 50, 47, + 37,162, 81,163, 70,139,159,121,230,153, 33,181,106,213, 18, 11,130, 0,135,195, 1,139,197, 82,251,248,241,227,237,183,110,221, +218, 24,192, 64, 63,211,214,107,194,132, 9, 11,167, 78,157, 26, 38,145, 72,136,195,225,104,190, 98,197,138,110,175,190,250,234, +137,249,243,231, 63, 57,104,208, 32,173,123,249,228,201,147,187, 19, 66,198, 81, 74,151,253,211,233,100, 48, 24,197, 24, 44,141, + 70, 83, 67,163,209,188,174,213,106,123,212,172, 89,243,214,176, 97,195, 14, 59, 28,142,139, 34,145,136,254,242,203, 47,111, 57, + 28,142,111,162,162,162, 54,155, 76,166,111,179,178,178,206,251, 89, 81,212, 0, 48, 10, 64,119, 0, 21, 0,232, 1,108, 2,176, +144, 82,122,161,132,134,160,129, 90,173,126,151,227,184,230, 38,147,169,130, 74,165,210, 83, 74, 15, 27,141,198,153,122,189, 62, +161,132,154,213,196, 98,241, 24,137, 68,210,198,233,116, 86, 17,139,197, 55,156, 78,231, 94,135,195,241,173, 94,175,191, 84,162, +139,121, 37,109,111,162,210,206,114,136,148, 21,141, 86, 94,170,145,139, 28, 18,222,114,139,154,114, 38, 28,186,105, 88,253, 8, + 24,171, 58,229,203,151, 31,167, 86,171, 7, 87,174, 92, 89,250,220,115,207, 73,219,181,107,135,221,187,119,183, 91,186,116,105, +139, 27, 55,110,216,155, 54,109,186, 34, 41, 41,105,182, 94,175,247,233,184,203,100,178,234, 26,141,230,127, 42,149,170, 71,237, +218,181,147,198,140, 25,115, 33, 62, 62,254, 92,131, 6, 13,110,205,159, 63,127,220,133, 11, 23,190, 14, 11, 11,219,100, 54,155, +231,229,230,230, 94, 40,105,218,155, 52,105, 18, 39, 8,194,232,192,192, 64,109,118,118,118,182, 32, 8, 95, 30, 63,126,252,147, +226,254,231,112, 56,194, 15, 30, 60, 8,169, 84,234,245,119,158,231,209,175, 95, 63, 16, 66,176, 98,197, 10,114,240,224,193, 9, +148,210,105,243,231,207, 87,253,240,195, 15,189,188, 25,172,162, 52,157, 78, 39,236,118, 59,236,118, 59,204,102, 51,122,247,238, + 29,254, 48,143,185,219,252, 20, 52, 69,126,156,207,184, 23,241,185,247,228, 76, 89,104,230,223,192, 63,123, 10, 80, 0,155, 78, + 90, 64, 41, 13, 42,141,144, 82,169,172,211,183,111, 95,113,122,122, 58, 36, 18, 9,236,118, 59, 82, 82, 82, 80,173, 90, 53,209, +186,117,235,106,249,171, 87,187,118,237, 87,227,226,226,194, 55,110,220,104,255,245,215, 95,173,157, 58,117,146, 14, 27, 54, 44, +160,109,219,182,109, 42, 84,168,192,253,244,211, 79,214,109,219,182,217,135, 14, 29, 42,159, 54,109, 90,248,166, 77,155,134, 0, + 88,246, 79,167,147,193, 96, 20, 97,176,148, 74,229,118,133, 66, 81,121,192,128, 1, 59, 63,250,232,163,217, 33, 33, 33, 14, 0, + 88,186,116,105,212,144, 33, 67,244,255,251,223,255,174,103,101,101,137,167, 78,157,218,224,215, 95,127,253, 83,169, 84,166,152, +205,230,214, 62, 84,196, 4,192,155, 28,199,141,105,220,184,241,159, 60,207, 95,222,177, 99,199,167,157, 59,119,238, 39, 8, 2, + 77, 72, 72, 88, 79, 8, 89, 0,224, 11, 95, 35, 26, 58,157, 78,164, 80, 40,166, 84,172, 88,241,157,121,243,230,201,171, 84,169, + 2,149, 74, 5,131,193, 80,233,210,165, 75, 21,223,124,243,205,167,171, 87,175,254,141,217,108,254, 64,175,215, 59,124,212, 36, + 34,145,104,108, 72, 72,200,167, 51,103,206, 84,212,170, 85,139,168,213,106, 36, 37, 37,213, 63,122,244,104,189,175,190,250,106, + 88,165, 74,149, 62,118, 58,157, 95,232,245,122,159,210,217,165,178, 92,108,144, 4,108, 9,170,213,172,195,188, 5, 11, 73,121, +149, 10, 18,142,131,195,110,151,220,202,205,173, 58,230,181, 87, 87, 54,175, 25,113, 64, 97, 51,116,220,121,195,108,127, 24, 5, +162, 90,181,106,151, 3, 2, 2,162,251,246,237, 43, 25, 56,112, 32,170, 85,171,150,247,219,243,207, 63,143,231,159,127, 94,122, +245,234, 85,233,202,149, 43,135,255,250,235,175, 47, 84,173, 90,245,230,181,107,215,170, 23,165, 41,151,203,183,170, 84,170, 42, +175,188,242,202,241, 9, 19, 38,236,212,104, 52,118, 0, 73, 39, 79,158,228,135, 14, 29,122,113,248,240,225, 55,115,114,114,240, +225,135, 31, 70,255,250,235,175,107,101, 50, 89,170,205,102,107, 91,130,104,193,236, 86,173, 90,142,125,247,189,241, 36, 60,172, + 60,174, 93,191, 18,244,249,231, 51, 62,110,210,164,137,229,232,209,163, 95, 20,247,127,169, 84,138,132,132,132,251,140,208,157, + 59,119,144,145,145, 1,179,217,140, 59,119,238,192,243,193, 16, 65, 16, 0,128,250,163,233, 50, 95,176, 88, 44,176,219,237, 16, + 40,133, 88,174, 64,155,167, 58,223, 38, 4,107,179,179,115,102,157, 58,118,228,198,195,138, 98,249, 27,105,186,103,172,104,158, + 15,162,101,164,233,242,108,174, 79,151,129,243,136, 92, 61,136,232,149,139,203,235,246, 92,169, 6,192, 78, 41, 61, 95, 26, 33, +119, 29,182,119,239, 94,164,166,166, 34, 61, 61, 29,233,233,233,168, 88,177, 34, 74, 18,177,189,112,225,194,215,141, 26, 53, 34, + 39, 78,156,248, 19,192,194,229,203,151,247,205,204,204,156,247,206, 59,239,132,124,241,197, 23,119,199,143, 31, 63, 26,192, 31, +203,151, 47,127,185, 65,131, 6,189, 79,157, 58,245,213,195, 72, 39,131,193, 40,162,147, 59,165, 84, 87,177, 98,197,196, 95,126, +249,165,195,168, 81,163,234,222,189,123, 87, 2, 0, 97, 97, 97, 86, 0,200,202,202, 18,143, 26, 53,170,193,143, 63,254,216, 81, + 46,151,223, 18, 4, 33,220,139,134,183, 39, 12,198,168, 84,170,158,103,206,156,249,172,122,245,234,138,105,211,166,109,215,106, +181,244,219,111,191,221, 26, 29, 29, 29,120,225,194,133,143, 85, 42, 85, 59, 0,239, 20,146,174,211, 94, 46,224,147,251,247,239, +255,206,254,253,251,229, 13, 27, 54,132, 86,171,133, 72, 36, 66, 80, 80, 16,154, 53,107, 70,246,236,217, 35,239,222,189,251, 27, + 10,133, 98,166,175,154, 98,177,248,157, 30, 61,122,124,118,244,232, 81,101,203,150, 45,137, 68, 34, 65,118,118, 54,164, 82, 41, + 90,180,104, 65,150,253,250,171,178,113,163, 70,147,197, 98,241, 84, 95, 53,141, 18,237,214, 65,175,190,219, 97,253,166,205, 36, + 60, 60, 28,214,143, 63, 70,118,189,122,176,190,247, 30,202,151, 47,143, 63, 55,108, 38,189, 94,120,173,165, 69,166,221,225,171, +102,105, 41,168,105,177, 88,170, 55,106,212, 72,116,224,192, 1,235,229,203,151,205, 5,159, 50,165,148,226,236,217,179,166, 77, +155, 54, 25,131,131,131, 97,181, 90,171, 21,167, 73, 41,213,181,109,219,214,190,120,241,226, 86,163, 70,141,146,164,166,166,238, + 3,112, 62, 40, 40,232, 22,128,219,233,233,233, 87,135, 14, 29, 90, 97,241,226,197, 93, 66, 67, 67,111, 83, 74,139, 45, 75,177, +177,177,113,177,177,177,217, 79, 61,245,148, 16, 27, 27,155, 25, 27, 27,251, 33,199,113, 35,222,126,231,109, 50,237,179,233, 56, +120,100, 31,190,249,250, 91, 12, 27,254, 50, 4, 65,120,175,164,249, 73, 8, 1, 33, 4, 34,145, 8, 58,157, 14,127,254,249, 39, + 6, 14, 28,136,214,173, 91, 79, 31, 60,120,176,242,192,129, 3, 60,165,116,149, 63,154,130, 32,192, 98,177,192,108, 54, 67,159, +156,140, 57,243,190,199,225,253,251,176, 98,201,226,168, 49,163, 71,143, 14, 14, 14, 78,104,208,184,105,244, 63,121,220, 93, 75, + 75, 30, 96, 34, 4, 39,179,118,159,246, 52, 70,101,129, 91,179, 96,218, 60, 77, 86,217,236,123, 62,110, 3,176, 3,200, 5,112, +189,164,154,207, 62,251,108,253,170, 85,171, 70,172, 56, 19,140, 76, 73,109,240,226, 64, 8,210, 32,240,161, 77,112, 89,218, 13, + 58,157, 46,188, 90,181,106, 45,252,209,164,148,110, 61,126,252,120,119, 74,233,124, 74, 41, 79, 41, 93, 53,126,252,248, 17,132, +144,213,227,199,143,127,133, 82,186,202,181,252,135,147, 39, 79,246,166,148,238,124, 24,233,124, 48,229,147,105, 62,238,154,197, +208, 4, 64, 79,215,212, 20, 64,179, 2,243,178, 2,235,117, 42,228,179,103,129,249, 38, 5,254,215,164, 76, 13, 22, 33,132,186, + 39,143, 10,211, 49,127,254,252,149, 11, 22, 44,152,147,145,145, 17, 81,181,106,213,119,219,180,105,211,230,218,181,107,170, 54, +109,218,180,141,138,138,122, 47, 62, 62, 62,162, 95,191,126,223,189,248,226,139,203, 9, 33, 14, 31, 42,225,106, 28,199,141, 61, +112,224,192,175,117,234,212,177,164,166,166, 6,119,232,208, 33,211,117,193, 52,100,102,102,106, 35, 34, 34,156,107,215,174, 93, + 65, 8, 25, 73, 8,169,237, 67,164,169, 81,104,104,232, 59,159,125,246,153, 92, 36, 18, 21, 22, 65,193,167,159,126, 42, 15, 12, + 12, 28,169,211,233,154,251,160, 89, 39, 32, 32, 96,202, 87, 95,125,165,176, 88, 44,112, 58,157, 8, 11, 11,131, 74,165,194,157, +140, 12,164,221,188,137, 44,253,109, 76, 28,251,134, 82,173, 84,142,211,233,116, 79, 22,167,217,178,146,166,143,186,226, 19,237, +198,188, 57,150, 88,134, 15,135, 73,161,128,233,237,183, 97,141,143,135,105,250,116, 88,131,131, 97,233,210, 5,227,198,190, 69, +100,225, 85, 91,182,172,164, 25,252,176, 92,247, 71, 31,125,196,141, 27, 55, 78,190, 97,195, 6, 69,187,118,237,108, 63,255,252, +115,142,209,104,196,119,223,125,151, 19, 27, 27,107,249,254,251,239, 21,205,154, 53,211, 60,245,212, 83, 18, 31, 47,190,246, 95, +126,249,229,196,188,121,243,166, 92,186,116, 73, 82,173, 90,181,233,141, 26, 53,234,109, 48, 24, 36, 77,155, 54,237, 93,177, 98, +197, 89, 9, 9, 9,193, 61,123,246,252,112,210,164, 73, 75, 8, 33, 69, 70,239, 98, 99, 99,103,183,104,209,252,189,181,235,254, + 8,216,180,105, 19, 89,242,235,226,192,122,245,235,126, 28, 26, 26,162,137,210, 85,192,224,231, 6,192,110,183, 97,208,144,126, + 80,171, 85, 68,163,209,132,148, 52, 47, 68, 34, 17,196, 98, 49, 36, 18, 9,234,214,173,139,101,203,150,129,227, 56,204,154, 53, + 43,132, 82, 42, 91,188,120,113,118, 86, 86,214,108,127, 52,109, 54, 27,172, 86, 43,204,102, 51,142, 29, 63,129, 77,235,214,224, +151, 95,151,226,197, 17,163,238, 58,156, 14,235,255, 70,141, 12, 8, 12, 12,120,251,159,143, 94,145, 18, 69,154,220,198,219,109, +172,220,158, 92,163, 25, 69, 9, 65,137, 53,255,214,254, 91, 51, 95,212,234, 1, 53, 27, 82, 74,121, 0,185,160, 48, 18, 66,108, +174, 58, 65,166,211,233,154,235,116, 58,153,175, 58,119,239,222,253,126,214,172, 89, 21, 56,121, 16,246,217,123, 96, 57,157,138, +173,193,223, 33,189,242,120, 68, 84,172,129,110,221,186, 69,240, 60,255,109, 25,164,119, 45,165,116, 0,165,244,247,146,252,255, + 65,167,179, 73,147, 38,109, 26, 55,110,124, 44, 54, 54, 54,185,113,227,198,199,154, 52,105,210,166,180,251,252,253,251,164,211, +143, 31,201,110,207,155, 72,232,143, 31,201,110,127,255, 62,233,196,226, 37,255, 94,188,121, 16, 47,132, 17, 66,214, 19, 66,214, + 79,156, 56,177, 3,128,208, 2,243, 45, 61,215, 3, 32,243,246,233,158, 60,150,135,185,140, 85,152,199,124,153, 32,246, 56, 73, +189, 86, 87, 21, 43, 86, 52,207,156, 57,115,179,209,104,220,246,205, 55,223, 52, 27, 55,110,220,203, 81, 81, 81, 59,251,247,239, + 63, 35, 48, 48,208, 33,145, 72,252,217,222,240,230,205,155,175,136,138,138, 18,110,223,190, 45,179,217,108,210,196,196, 68,185, +195,225, 32, 18,137,132, 90,173, 86,201,233,211,167,101,130, 32,240,117,235,214, 93,122,230,204,153, 81, 0,198, 21, 37,168, 82, +169, 94, 91,176, 96,129,162, 48,115,197,243, 60,140, 70, 35,156, 78, 39, 38, 79,158,172, 24, 63,126,252,155, 0, 14, 21,165, 41, +145, 72,222,248,238,187,239, 20, 14,135, 3, 98,241,189, 44,186,120,241, 34,178, 51, 51,225, 48, 26, 97, 55,230,192,105,204,134, +216, 28,128, 55,134, 62,171,248,252,199,159,223, 2,240,124, 81,154,188, 66, 59,125,254,130, 31,136,195,225,128,109,153,247, 46, + 17,142, 93,187, 0,155, 13,159,197,125, 78,222, 30,241,108, 28,128,229, 15,163,176, 11,130, 0,145, 72,132,151, 95,126,153, 88, +173, 86,217,250,245,235,101, 13, 27, 54,228, 27, 53,106, 20,240,204, 51,207,192,225,112, 32, 59, 59,219,221, 60,230, 43,124,181, +106,213, 76,243,231,207, 95,153,149,149,181,102,250,244,233,237,191,249,230,155,255,133,135,135,255, 57,112,224,192,119,180, 90, +173, 93, 38,147,193,225,112, 4,250,160,149, 23,169, 26,244,108, 63,172,248,237,119, 50,100,200, 96, 76,154,248, 1,206, 95, 56, +139,229, 75, 87,161,223,192, 62, 88,190,108, 53,218,182,107, 5,163,209,120,183, 52,249, 33,149, 74,161, 80, 40, 80,190,124,121, + 12, 30, 60, 24,243,230,205,195,210,165, 75,111, 2, 88,109, 54,155,191, 60,123,246,108,178, 63,122,118,187, 29, 86,171, 21, 22, +139, 5, 55,110,222,130,195,225,192,162, 37, 75,176,127,215,206,247, 4, 42,196, 45,251,101,177,234,187,239, 23,244, 3, 48,230, +159, 62,246, 37,109,210, 35,132,252,221, 76, 72,242,155, 35,173,118, 20,165,180,228, 70,139, 20, 18, 91,163, 11,203,190,121,112, +224,192,129, 34, 66, 72, 80,245,242,138, 92,142, 67,238,126, 65, 8,137,138,138,122, 9, 64,151,232,232,232,114, 55,110,220,200, +208,233,116, 91, 0,252,174,215,235,115,139, 75,186,211,233,196, 43, 77,179, 48,186, 57, 7,167,211,137,172,172, 44,220,188,121, + 19,103,206,156,193,225,195,103, 74,148,198,232,232,232,225,106,181,186,139, 84, 42,173,236,116, 58, 57,179,217,124,195, 98,177, +108, 3,240,189, 94,175, 47, 73,100,239,129,164,211,227,218, 50,171,111,223,190,186,192,192, 64, 28, 63,126, 92,119,242,228,201, + 89, 0, 26,151,234,194, 37,146,254, 52,248,127, 59,163, 84,218, 8,164, 93, 92, 30,181, 97,237,212,159,112,175, 47, 47,227, 95, + 74, 97, 30,196,131,116, 74,105, 47, 87,125,179, 62, 46, 46,174,151,235,127,189, 60,231,125,216, 78, 47, 47,245,215,122,111,203, +203,204, 96, 17, 66,104, 81, 59,168,209,104,156,239,191,255,254,254,221,187,119, 55,109,211,166,205, 94, 63,141,149,155, 86, 53, +107,214, 60,178,117,235,214,114,145,145,145, 22, 74, 41,209,106,181, 78,173, 86,203,103,101,101,193,225,112,208, 27, 55,110, 72, +174, 94,189,170, 9, 13, 13,229, 61, 28,105,225, 59, 32, 22,183,168, 82,165, 74,161,145, 2,163,209, 8,131,193, 0,171,213,138, +242,229,203, 19,142,227,154,249,160,217,186,122,245,234,196, 96, 48, 32, 34, 34, 2, 39, 79,158,132,197,104,128, 35,215, 8,167, +193, 0,222,144, 13,154,147,133,220,236, 44, 84,139, 8, 35, 28,199,181, 40, 78,211, 41, 86, 70,235, 84,106,216, 38, 76,128,253, +242,101, 64, 42,133, 52, 58, 26,176,223, 11,214,216, 19, 19, 1,153, 12,220,240,225,168, 49, 98, 4,156,156, 60,234, 33, 22,116, +216,108, 54,152, 76, 38, 72,165, 82,244,239,223, 31,123,246,236,177, 55,105,210, 68,113,251,246,109,216,108, 54,112, 28, 7,158, +231,253,209,228,169,235, 10, 28, 20, 20,228,248,252,243,207,183,182,111,223,190,227, 83, 79, 61,181, 89, 38,251, 59, 40,224,112, + 56,120, 20,211, 86,229, 25,169,178,217,172, 24, 56,164, 31,180, 26, 45, 90,180,104,129,205,155,183,224,197,151,159,135, 76, 38, + 69,207, 94, 93,177,232,231, 37,224, 56,238,243,210,228,135, 92, 46,135,201,100,114,151, 13,152,205,102,196,199,199, 87, 46,137, + 22,207,243,176,219,237,121, 81, 44, 65, 16,112,232,232, 65, 40,148, 10, 52,107,221,118,178, 32, 80,165, 68, 44,134,136,227,254, +209, 49,234, 74, 31,101,114, 69,176, 60,162, 77,165,213, 4,245,232,127,229, 17,194, 42, 77,243, 96, 49,145,150,198,114,194,207, + 28, 29,229,140,238,222,191,162, 81,174,144,228,246,223, 96,235, 88,189,122,139,254,211,166,197,105,171, 84,169,162, 62,117,234, +148, 97,234,212,169, 21,142, 28, 57, 2, 0,139,139,210, 75, 74, 74, 90,253,249,231,159,135,180,111,223,190,170, 88, 44, 38, 89, + 89, 89, 72, 79, 79, 71,106,106, 42,110,221,186, 69, 19, 19, 19,175, 58,157,206,149,254,164,177, 81,163, 70, 63, 60,255,252,243, + 47,212,173, 91, 87, 66, 41,133,195,225,128,201,100,106,116,228,200,145,167,247,238,221,219, 6,192,179,254,238,183, 94,175, 95, + 57, 99,198, 12,117,187,118,237,106,139,197, 98,174, 44,210, 89,160,108,232, 52, 26, 13,182,109,219,134,128,128, 0, 80, 74,117, +165, 61, 86,118,135, 61, 74, 21,160, 3, 18,191, 68,120, 80, 37,216, 29,246,135, 86, 95, 50,202, 46,138, 85,140,201, 58, 10,160, +103,105,205,208,131, 50, 83, 37,138, 96,185, 43,207,148,148, 20,133,201,100, 18, 83, 74, 69, 54,155, 77,204,243, 60,145,201,100, + 14, 63,183, 87,119,192,128, 1,203,187,118,237,154,233,138, 12, 56,194,194,194, 28, 89, 89, 89,200,205,205, 5,207,243,188, 90, +173,206, 45, 95,190,124,110,221,186,117,115,118,237,218, 85,108, 19,161,197, 98,169,164, 84, 42,239, 91,110, 50,153, 96, 52, 26, +243, 12,150,201,100, 66, 64, 64, 0,114,115,115,139, 61,185,237,118,123,101,165, 82,137,244,244,116,100,100,100,192, 98,200,129, +221,104,132,211,152, 3,103, 78, 54, 4, 67, 54,168,209, 0, 42,240, 8, 14, 11,131,205,102,171, 88,156,166,193,202,203, 36, 0, +204,191,255, 14,140, 29, 91,120,101,180,115, 39, 84,181,107,195,108,182, 63,180, 49,202, 60,251, 93,217,237,118, 56,157, 78, 80, + 74,169,205,102,131,205,102,203, 23,233,242,199, 96,185,181, 79,156, 56, 17,152,145,145,161,160,148,138,141, 70,163,220,108, 54, +115, 33, 33, 33,102, 15,131, 85, 36,119,238,220, 53, 94,185,122, 73,227,142, 84,173, 88,182, 26, 45, 91, 53,195,193,131, 7,161, + 82,169,240,215,150,173, 8, 14, 14,134, 78,167,195,141,196,155,160,148,210, 38, 77,154, 80,142,227,156,135, 15, 31,246,251,206, +192,225,112,228, 61,241,103,181, 90,253, 50,150, 5,215,117, 58,157,112, 58,157,112, 56, 28,184,151,159, 86,124,245,205, 92,172, + 89,177, 2,231,206,157,173,240,225,212,207,224,112, 58,193, 11,252,163, 83,241,249, 58, 52, 2,197,125, 17,172,210,109,216,245, + 84, 98, 1, 63,181,160,233,130,246, 35, 71,142,220, 93, 86,251,215,168, 81,163,110, 28,199,205,109, 17,192,107, 95,143,178, 27, +195,228,212,120,126,206,152,220,211, 21,149, 38,171,217, 17, 53,253,219,184,114,130, 0,188,255,254,251, 41,131, 7, 15,214,142, + 27, 55,174,254,224,193,131,187,234,116,186,101,122,189,222, 94, 72, 37, 46, 29, 62,124,248,225,192,192,192,106, 75,150, 44, 73, +213,235,245, 33, 14,135, 67,229,112, 56,236, 38,147,233,138,221,110,223,231,112, 56,182, 37, 39, 39,199,251,147, 86,149, 74,213, +112,240,224,193,146,204,204, 76,136,197, 98,216,237,118,164,167,167,163, 81,163, 70,162,173, 91,183,214, 45,201,254,159, 61,123, +118,182, 78,167,219,181,110,221,186, 46,106,181, 58, 86, 38,147,149, 23, 4,129,207,205,205, 77,181, 88, 44, 39, 74,146,206, 2, +121,161, 79, 72, 72,208,105,181, 90, 36, 37, 37,129, 16,162, 47,237, 49,147, 74,164,183,210, 46, 45,175, 24, 30, 88, 21, 87,207, +109,128, 84, 34,189,197, 44,202, 99, 31,193,106,226, 25,177, 42,194, 36,153, 39, 76,152, 48,137, 16,178,126,194,132, 9,147,138, +136, 96,241,158,235,121,172,111, 45,115,131,229,213, 20, 24, 12,226,248,248,248,114,169,169,169,154,176,176,176,220, 39,158,120, + 34,211, 85,141,146,236,236,108,117, 74, 74,138, 74,163,209, 88,163,163,163,179,125,220,222,165,113,227,198,245, 77, 73, 73,249, +107,200,144, 33,122, 0,200,202,202, 66, 90, 90, 26,238,220,185, 3,187,221,142,164,164, 36,110,239,222,189,229,183,111,223,222, + 9,192,181,226, 4, 21, 10,197, 77,131,193, 80, 43, 40, 40, 40,207, 28,184, 77,149,231,167,221,110,135,193, 96,128, 90,173, 46, +246,228,150, 72, 36, 73, 25, 25, 25,213,109, 86, 43,210,111,223,134,195,152, 3,167,209, 0, 62, 39, 11,124, 78, 54, 72,174, 1, + 82,135, 3,114,137, 4,134, 59, 25,144, 74,165, 41,197,105,106,229, 34,155,205,233,148,137,158,126,186,200, 43, 16,109,217, 18, +119,235,213,131, 98,157,212,241, 16, 11,250,125,243,148,210,251, 12,149, 63, 6, 43, 51, 51,147,251,230,155,111,234,158, 63,127, + 62, 64,167,211,165,117,232,208,225, 26, 0, 65, 36, 18, 9,105,105,105,161, 23, 47, 94,172, 21, 24, 24,104, 84, 40, 20,233, 62, +200,253,240,229,151, 95,141,125,246,185, 33, 68,171,213,160,109,187,150,248,125,245, 90, 40,149, 74, 52,108,216, 16, 53,239, 30, +194,255, 84, 59,177, 71,219, 7,241, 50, 25,134, 15, 31,254, 69,255,254,253,209,161, 67, 7,113,113, 70,202,219,178,220,220,220, +188, 38,189, 59,119,238, 64,161, 80,160, 85,171, 86,137,112, 53, 17, 30, 63,126, 60,185, 8,179,126, 95,158, 9,130,144,103,178, + 68, 34, 17,254, 88,177, 2,223,126,255, 45, 86,255,190,158, 14,234,223, 23,187,247,236, 37,130, 64,111,255,187,238, 62,221,101, + 5,165,233, 43, 95,160,220,185,154, 7,105,254, 83,166, 44,205, 21, 0,112, 28, 55,115,223,248,126, 90, 8,188, 49,107,219,178, +220,111,111, 73,115,215,159, 56,189,199,100,182,136,170, 85,175, 90, 55,186, 82, 21,201, 7, 31,189,151,122,242,220,161,235,119, +190,189, 19,249,238,187,239, 86,174, 81,163, 70,249,203,151, 47,215, 0,112,214,155,102, 64, 64, 64,229,151, 94,122,233,229,187, +119,239, 74,126,252,241,199, 69,183,111,223,222, 67, 41,189, 90,192,120,196, 16, 66,102, 2,144, 0,136, 0,224, 4,176,149, 82, +250, 75, 17,201, 21, 8, 33,216,181,107,215,125, 79,251, 9,126,182,217,123,146,156,156,156,217,172, 89,179,134,151, 46, 93, 90, +155,153,153,249,171, 23, 99,247,116,189,122,245,134, 28, 57,114,228, 67, 74,233, 21, 63,235,147,113,231,206,157,155, 33, 8, 66, + 52,199,113, 55, 40,165,239,150,246,152, 57,121,251,136, 13,127, 76, 89,104,119,216, 42, 73, 37,178,155, 78,222, 62,146, 89,148, +199, 30,119, 31, 41,120, 26, 39, 47,198,232, 64, 92, 92,156,114,250,244,233,136,139,139, 59,227, 45,130,229, 54, 90,113,113,113, +103,220,235,121,172,191,167, 76, 13,150, 55,231, 40, 8,130, 98,230,204,153,109,234,212,169,115,187, 85,171, 86, 73, 21, 43, 86, + 52,187,127,147,201,100, 14,181, 90,157,101,183,219,205, 41, 41, 41, 97,123,246,236,169, 34, 8,130,220,135,237,237,208,104, 52, +210,163, 71,143,234,150, 47, 95,222,232,194,133, 11,181,187,119,239,222,207,110,183,195,225,112,224,246,237,219,181,191,250,234, + 43, 94, 46,151,167, 19, 66,142, 2, 80, 22,123,162, 57,157, 7, 47, 94,188, 88,179,121,243,230,196,225,112,228, 51, 85,158,223, +101, 50, 25,146,146,146,168, 32, 8,135,125,168, 16, 14,157, 72, 72,168, 94,175,118,109, 56,141, 57,224, 13,217,224,115,178,193, +103,103,129,152,140,144, 58,236, 80,171, 4,200,101, 42,156, 73, 74,114,135, 46,139, 68,228, 52, 39,222, 48,228,212,170, 52, 99, + 6,164, 65, 65,128,221,158,215, 44, 8, 32,175,185,144, 38, 39,227,216,161,131, 16, 83,107,210,195, 42,197, 78,167, 19, 33, 33, + 33,200,201,201,129,213,106,189,207, 96,201,100, 50,200,100, 50, 56,157, 78, 95,163, 56, 65,125,250,244,105,215,180,105,211,115, + 35, 70,140,216, 90,171, 86,173, 68,119, 89, 87, 42,149,246, 90,181,106, 37,153, 76, 38,227,141, 27, 55,234, 44, 94,188,184,141, + 32, 8,218,162,244,226,227,227,223,138,141,141,197,201, 19,167,198,117,237,218, 21, 27, 55,110,132, 82,169,132, 70,163, 65,213, +170, 85,113,204, 96,192, 27,178,102,168, 25, 94, 19,157, 58,221, 65,189,122,245,112,225, 66,241, 67,107,121, 70,231, 10, 70,175, +172, 86, 43, 50, 50, 50,176,123,247,110, 28, 57,114, 4, 23, 46, 92,168,116,228,200,145, 55,151, 46, 93,250, 82,221,186,117, 99, +206,158, 61,123,203, 23,131,229,206, 75,183,217,114,127, 95,187,110, 19,122,246,108, 75, 12,185, 57,216,184,249,175, 50,105, 70, +241, 23,141,102, 20,245,214,172,231,203,208, 8,110, 79,238, 49,162, 66,145,154,239,104, 52, 20, 0,190, 48, 26, 9, 0,140,215, +104, 40,245,152,255, 91,139,128,120,121,130,208, 91, 26,198,187, 52,103,186, 52, 10,110,163, 8,114,193,243,185,182,221,191,229, + 14,191,160,200,202,112,144,143,226,227,227,119,245,236,217,115, 95,149,202, 53, 2, 1,192,102,225, 67, 84,178,114, 74,177, 88, + 44, 7,128,138, 21, 43, 54,161,148,206, 3,224,117,104,154,222,189,123,183, 12, 15, 15,111,180,105,211,166,227,183,111,223,222, + 91,208, 92, 1, 64,205,154, 53, 63, 62,115,230, 76,119,137, 68, 66, 60, 42,127, 10,192,171,193,234,215,175, 95,173, 10, 21, 42, +132,110,188, 28,136,108, 73, 53, 8, 92, 22,168, 72, 14, 62,184, 33,110, 72,234,162,124,249,243,161,149, 43, 87,126, 50, 49, 49, +241,132,159, 17,166, 74,131, 6, 13,218,240,195, 15, 63,212,233,214,173,155, 12,192,125, 6,171, 78,157, 58,253,182,111,223, 62, + 96,244,232,209, 13, 9, 33,189, 41,165,151,125,213,143,143,143,223, 15,160, 69, 89,150,213, 87, 62,163,219, 0, 68, 51,207,241, +159,137, 94, 1, 30,125,176, 0,164,227,222,187,148, 61,231,221,229,222,230,177,110,186, 71,212,202, 86, 32,234,229,237,183,116, + 0,101, 22,220, 16, 23,113,145,221,113,248,240,225,152,152,152,152,203,158,230,202,179,250,212,104, 52,182,212,212, 84,122,254, +252,249,250, 78,167,115,175, 15,219, 91, 24, 31, 31,191, 99,238,220,185,159, 69, 71, 71, 91,122,245,234,197, 77,155, 54,109,109, +102,102, 38, 77, 75, 75,195,172, 89,179,250,118,239,222,125,237,229,203,151,185,115,231,206,125,140,123,131,144, 22,137,201,100, +250,238,245,215, 95, 31,178,119,239, 94,133,205,102, 67, 86, 86,214,125,209, 43,119,164, 96,238,220,185, 86,163,209,248,181, 15, + 23,218,239,167, 79,159, 62, 96,217,162,159, 21, 34,135, 13,150,172, 76, 8, 57, 89,224, 76,185, 16, 59,108,144,139,121, 68,214, +208,192,144, 38,197,119,127,237, 50, 91,173,214,239,138, 53, 88, 22,195,248,215, 94, 29,245,231,150,109, 59,137,164, 99, 71, 56, + 54,111,190,255, 78, 58, 34, 2, 22,187, 29,113,159,125, 66,197,166,236,247, 30, 70, 65,151, 72, 36,103, 71,141, 26, 85,126,212, +168, 81, 33, 13, 26, 52,128,219,252, 82, 74,193,243, 60, 66, 67, 67, 1, 0,183,110,221, 66,124,124,124,150, 72, 36, 42, 54,122, + 39, 8,194,142,235,215,175,215,127,233,165,151, 46,117,235,214, 45,194,106,181,138,179,179,179,245, 0,160, 86,171,197, 21, 43, + 86, 84,137,197, 98,146,153,153,121, 55, 35, 35, 35, 66, 16,132,125, 62, 36,117, 42, 33,100, 92,211,166, 77,113,238,220, 57, 68, + 69, 69,161,114,229,202,208,233,116,184,124,249, 50,180, 90, 45,164, 82, 41,182,109,219,134,219,183,111,163,122,245,234,121,131, + 97, 22,198,205, 43,123, 48,127,254, 90,112, 28,151, 55, 57,157,206,188,254, 82,119,239,222,197,230,205,155,241,251,239,191, 99, +217,178,101, 25,131, 6, 13,210,188,248,226,139,129,139, 22, 45,122, 11,192, 88,111,154, 55, 46,239,198,252, 5, 27,242,105,122, + 78, 98,177, 24, 73, 73, 73,112, 56,157,248,253,247,173, 73, 98,177, 56,248,203,207, 63, 87,142,159,244, 62,121,212, 42,193,162, +250, 62,121,118,149,242, 37,225, 95, 24,141,100,188, 70, 67,221, 38,200,171, 17, 34, 0, 64,239,139, 96, 21,198, 76, 95, 52,189, +151,207,247, 91,207, 94, 59,150, 16,149, 93, 16,132,175, 18, 18,226,247,185,162, 54,225,179,103,207,150, 1,192, 23, 95,204,146, + 80, 74, 37,238,242,240,233,167,159, 42, 70,141, 26, 85,232,224,176,171, 86,173,202,252,228,147, 79,202, 13, 31, 62,188,251,206, +157, 59, 85,132,144, 77,174, 27,177, 12, 0, 60,128,114, 0,246,135,133,133, 69, 46, 95,190,188,122,151, 46, 93,212,197,165,211, +108, 54,255, 56,127,254,252,202,179,118,107,177, 41,183, 31,110,209, 65,160, 33, 20, 33, 82, 3,158,208,220, 68,135, 10, 73,186, + 37, 75,150, 44, 4, 16,235,135,185,170,219,191,127,255, 53, 63,252,240, 67,149, 81,163, 70,221,222,191,127,255, 45, 66,200,199, + 94, 86,189,243,210, 75, 47,221, 88,180,104, 81,117,158,231,183, 16, 66,186, 81, 74, 47,129,193,248,231, 56,250,128,214,125, 96, +112, 69, 24,172, 87,141, 70,227,176,153, 51,103,198,246,238,221,123,224,161, 67,135, 66, 60,171,189,219,183,111,135, 46, 90,180, +104,208, 95,127,253,213,212,108, 54,143,226,121,254,101, 47, 39,111,253, 2, 46,245, 6,165,116,102,171, 86,173,158,223,190,125, +187, 76,171,213,222,221,182,109, 91, 72, 90, 90, 26,226,227,227, 3, 57,142,203,185,124,249,178,100,219,182,109, 47, 0,248,214, +219, 93, 82, 65, 77,189, 94,127, 60, 59, 59,251,139,183,223,126,219,226,238, 52,108, 54,155, 97, 48, 24, 96,177, 88, 32, 22,139, + 33,149, 74,241,219,111,191, 89,173, 86,235, 2,189, 94,127,200, 7,205,131,119, 50, 51,231,127,241,197, 23,182,128,224, 16,104, + 85, 74,200,156, 78, 72,236, 86, 40, 69, 4,209,177,193,176,231,202, 49,247,175,125,182,116,179,101,185, 94,175,223, 85,156,230, +193,155,198, 13,150,148,203,219, 63,157, 58,133,138, 86,173,130, 36, 39, 7,242,113,227, 32,171, 81, 3,178,126,253, 64,245,122, + 88, 18, 18,240,254,228, 15,168, 56, 55,109,223,161,155,134, 85,197,105,150,201, 69,179,128,166,195,225,104,152,148,148,244,222, +212,169, 83,211, 38, 76,152,144,121,227,198, 13, 72,165, 82, 8,130, 0,169, 84,138, 59,119,238, 96,227,198,141,217,187,119,239, + 78, 55, 24, 12,239,240, 60, 95,191, 56, 77,158,231,135,231,230,230, 14, 27, 63,126,124,237, 58,117,234, 52,222,181,107,151, 38, + 56, 56,184,162, 76, 38,147,213,175, 95, 63,252,252,249,243, 97, 31,126,248,225,208,205,155, 55,119,182,217,108,163,121,158,127, +193,135,125,183, 58,157, 78,236,222,189, 27,207, 63,255, 60, 90,182,108,137,176,176, 48, 88, 44, 22, 52,105,210, 4, 53,106,212, +128, 94,175,135,195,225,160, 39, 79,158,124,231,143, 63,254,128, 72, 36,114, 22,166, 41,151,203, 19,159,136,136, 71,191,126,253, +240,212, 83, 79,161, 73,147, 38,168, 93,187, 54, 26, 52,104,128,102,205,154,161, 67,135, 14, 16,137, 68,144,201,100,248,245,215, + 95,177,109,219,182, 79,126,254,249,103, 99,203,150, 45, 69,132,144, 1,133,105, 54,136, 58,137,190,125,251,162, 83,167, 78,104, +218,180, 41,234,212,169,131,218,181,107,231, 77, 28, 39,130,221,110,135, 74,161, 66,194,161,131, 83,164, 18,169, 41, 56, 56, 8, +130, 32,208,127,242,184, 23,123,135,233,195,128,158, 13, 2,219,249,165, 57,211,104,204,243, 77,222,140, 16,165, 37,211,116, 87, + 82,133,153,171,130,251,126,252,248,241, 29,241,241,241,189,142, 29, 59,214, 47, 33, 33, 97,159,151,187,107, 80, 74,239,141, 91, +166,215,227,194,133, 11,176, 90,173,238, 65,147,189,106, 90,173,214, 19,239,189,247,222,177,208,208,208,160, 3, 7, 14, 12,220, +190,125,251,183, 19, 38, 76,216, 51,120,240,224,211,253,250,245, 59, 59,102,204,152,125, 43, 87,174,156,168,215,235, 27,116,234, +212, 73,253,254,251,239,103,184,141, 76, 17,245,167, 72, 16, 4,188,213, 54, 7, 7,223, 54,225,234,251,233,136,127,253, 50,126, +234, 30,143,206,129, 59,113,246,236,217, 34,235,244, 66,142,251,215,191,254,250,107, 85,181, 90,205,253,246,219,111,149, 40,165, +111, 80, 74, 63,242, 50,141, 91,189,122,117, 21,181, 90,205, 45, 89,178, 36, 26,192, 92, 66, 8,247,168,148, 79,166,249,120,104, + 62,110,136,139, 9,219,157, 1,208,157, 16,210,122,252,248,241,113, 21, 43, 86,204,224,121, 94,186,118,237,218,158, 57, 57, 57, +161, 60,207, 79,164,148,250,213, 94, 73, 41,157, 79, 8,193,179,207, 62,251, 81, 84, 84,212,186,179,103,207,118,234,215,175,223, +210, 63,255,252,179,179,211,233, 76,188,122,245,234,100, 0, 95, 3,152,227,171,166,213,106,253,120,251,246,237,228,200,145, 35, +111,191,251,238,187,242,240,240,112, 18, 20, 20, 4,179,217,140, 91,183,110,209, 69,139, 22, 89,109, 54,219, 28,139,197,242,129, +175,154, 14,135,227,189,173,251,246,203, 78,158, 62,253,242,184,103, 7, 42,162, 43, 84,132,150, 84,132,225,238, 29,236,223,175, +199,151, 91,247, 88,238, 88,109, 75, 29, 14,135,207,143,210, 43,236,185,221,182,174,252,105,227,174,157, 59, 59,127, 50,109, 58, +169, 51, 98, 4, 84, 85,171, 34,187,122,117, 28,217,187, 7,113,159,126, 66, 69,166,180, 61, 82,155,161,243,195, 42, 16,174,119, + 12,254,168,211,233,150, 94,184,112,225,245,137, 19, 39,126, 16, 19, 19, 67,109, 54,155,108,227,198,141, 70,189, 94, 47, 8,130, + 48, 13,192, 28,189, 94,111,245,227,184,159, 1,208,131, 16,210,122,216,176, 97,211,162,162,162, 82,237,118,187,120,194,132, 9, +157,178,178,178,202, 11,130, 48,201,159,178, 20, 31, 31,111,141,141,141,125,103,231,206,157, 95,236,220,185,211,123,212, 80, 36, +162, 60,207,143,136,143,143,255, 9,192,172,162,244,236,118,123,139, 86, 3,182, 29,180, 90,215, 23,250,116,160, 66,161, 64,102, +102, 38,204,102,179,221,233,116, 26,120,158,135,235, 97, 63, 82, 72,185, 44, 86, 83,170, 80, 98,223,129,131,232,251,116,111,222, +238,176,127,254,220,160, 65,242, 3,135, 14,243, 37, 29,211,168, 52,228,230, 46, 4, 25,177,176,232,166,192, 98,140, 22,241,162, +249,142,102, 89,222,159,102,122,152,158,241, 26,205,189, 71, 15, 41,197, 59, 26, 13, 45,104,136,220,254,197, 21,200,250,155, 31, +129,241, 43,238, 69,169, 10, 54, 43,142,215,104,242,182,229, 77,179,140,154, 51, 96, 50,153, 64, 11,118, 86,204,191,206, 77, 66, +200,187,241,241,241,138, 87, 95,125, 53,118,232,208,161, 1, 29, 59,118,212, 20,136, 72, 9,127,254,249,103,238,252,249,243,239, +236,217,179,231,232,176, 97,195,250,186,154, 55,188,114,251,246,237, 13,223,126,251,109, 96,187,118,237,106,242, 60,143,140,140, +140,188, 62, 88,183,110,221,194,205,155, 55,111,240, 60,191,206,207,221,121,237,185,231,158,219,184,104,209,162,232, 81,163, 70, +221, 94,182,108,217, 58, 0,217, 94,214,211,244,235,215,239,105,215,122, 55, 1,188,193, 70,120,103, 48,124,168, 44,124,157, 0, +244,225, 56,110, 31,128, 62, 62,174, 95,191,136,223,162, 1,124,138,123,237,166,217, 0, 78, 3,152, 6,160, 90, 73, 53, 35, 35, + 35, 27,212,168, 81, 99,105,173, 90,181,174, 87,168, 80,193, 81,171, 86,173, 27, 53,107,214, 92, 30, 25, 25, 25, 83, 10,205, 86, + 85,171, 86,221, 18, 29, 29,157, 81, 41, 74, 71,163,163,163,239, 86,173, 90,117, 91,100,100,100,187,146,106, 54,171,168,233,213, +172, 86,212,133,216,186,213,173, 53,171, 85, 17, 98,235,214,176, 54,171, 93,225, 98,179,138,154,126, 37,213, 44,233, 84,156,102, +100,100,100, 64, 84, 84, 84, 92, 84, 84, 84,174, 78,167,139,139,140,140, 12, 40,173,102, 89,151,165, 7,181,239, 5,167, 86,173, + 90,125,191,104,209, 34,231,215, 95,127,157,211,186,117,235, 59, 95,127,253,117,206,226,197,139,157,173, 90,181,250,190,164,154, +245, 99,155, 68,183,237,212,249,238, 47,191, 46,117, 94,186,116,137,254,242,235, 82,103,219, 78,157,239,214,143,109, 18,253, 40, +237, 59,134,131, 98,248, 61, 79,225,109, 58,149,181, 27, 0,234,159,202,222,131, 83, 89,187,139,213,123, 71,163,161,111,171,213, +121,122,239,168,213,249,230, 41,165, 56,149,237,161,153,237,131,166, 90, 77,223,201,167,169,185, 79,211,159,125, 31, 56,112,224, +101,234,129,205,102,163,233,233,233,244,226,197,139,116,239,222,189,180,115,231,206,151,139,211,116,221,196,118, 0, 48,187, 66, +133, 10, 91, 91,181,106,117,169, 77,155, 54, 87,170, 85,171,118, 64, 42,149,254, 10,224, 37, 0,161, 0, 34, 1,140, 7, 16, 81, +148,102,100,100,100,139,218,181,107, 79,107,212,168,209,186, 22, 45, 90,236,111,220,184,241,193, 90,181,106,173,143,142,142,158, + 30, 25, 25,217,178, 36,199, 29, 64,165, 65,131, 6,157, 49, 26,141,124,219,182,109,255,244,246,191,152,152,152, 69, 70,163,145, + 31, 58,116,232, 69, 0, 53, 30,181,115,147,105, 62, 30,154,143,219, 68,138,184, 9, 43,147, 16, 98, 89, 15,167,255, 48, 53,117, + 58,157,220,215,168,205,227,182,239, 76, 19,168, 94,189,186, 54, 50, 50,178,207,168, 81,163,100, 49, 49, 49, 72, 72, 72,192,130, + 5, 11,108,201,201,201,107,175, 92,185, 98, 40,105, 58, 27, 52,110, 26, 29,160,213,190, 77,129, 62, 4, 88,155, 99, 48,228,123, + 23, 33, 59, 70, 15, 71,243,233,167,159,222,164, 84, 42,171, 17,215, 0, 61,238,167, 63,221, 79,128, 90,173,214,171, 59,119,238, +236,254, 56,236, 59, 33,164, 82,147, 38, 77,166, 93,188,120,113,115, 78, 78,206,125,157,220,101, 50,217,211,177,177,177, 67, 15, + 30, 60, 56,169,224, 83,132,172, 44, 49, 77, 70, 9,154, 8, 25,247, 53,159, 89, 89, 46,252,119,113,153,168,188, 39,188,106,213, +170,133,231,158,123,174,212,186, 46, 51, 53, 6, 15, 97,228,118, 70,225,172, 91,183,174,251,127,101, 95, 41,165, 55, 1, 20, 90, +152,109, 54,219, 58, 0,235, 88,169, 96, 48,124,135, 99, 89,192, 96, 48, 24, 12, 6,131, 81,182, 16, 0,245, 11,185,163,241, 57, +244, 87,146,167, 9,138,211,103,154, 76,147,105, 50, 77,166,201, 52,153,230,227,167,233,161, 61,181,144,159,146, 92, 58, 11,254, +213, 6,139,245,193, 98,154, 76,147,105, 50, 77,166,201, 52,153,230,195,214, 44,160, 63,234,223,110,176, 88, 19, 33,131,193, 96, + 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,143, 54, 62, 61, 69, 40,147,201,234, 81, 74,135, 17, 66,202, 19, 66, 82, 40, +165, 63,217,108,182, 51,255,181,204,146,201,100,245, 8, 33,195, 40,165,229, 41,165, 41,132,144,135,154, 15,187, 62, 86, 17,252, + 61,182, 35, 5, 64,219, 79, 54,177, 82,205, 96, 48, 24, 12,198,163,106,176, 42, 87,172, 56,136, 19,145,111,236, 14, 62, 56, 40, + 40,136,251,246,219,111,185,222,189,123,227,207, 63,255,196, 27, 99,198,188, 17, 21,165, 19,164, 98,113, 38, 21,156,111, 36,222, +210,175,240,101, 99,253,250,245, 75,117, 56, 28,133,190,191, 75, 36, 18,165,173, 89,179, 38,162,180, 59, 21, 21, 59, 40,213, 97, +183, 23,186, 29,177, 88,146,166, 63,190,210,167,237, 84,172,168, 27, 36, 34,220, 55, 14, 94, 8, 14, 14, 14,230,230,204,153,147, +151, 15,175,191,254,250, 27, 21,162,162, 4,169, 68,148, 41,240,244,141,196, 91,183, 86,252, 83, 7,174,128,185, 66, 1,163,245, + 72,225,145, 86,102, 2, 25, 12, 6,131,241,223, 54, 88,132,195,220,101,223,207, 12,206,184,155,137,101,107,182,160, 78,157, 58, + 56,123,246, 44,234,212,169,131,214, 77, 27,114, 93, 91, 62,201,137, 8,194, 62,154,179,100, 46, 0,159,140,133,195,225, 8,255, +227,143, 63, 64, 8, 1,207,243,249, 6,237, 51, 24, 12,120,243,205, 55,195,203, 98,167, 28,118,123,248,213,163,191, 67, 34, 34, +112,240, 20, 14, 39,133,195, 41,192,206, 83,228,152,156,232,216,243, 57,159,183,195,129,155,251,211, 55, 51,131,179,178,178,241, +251,166,173,249,242,161, 99,171, 38,220,192, 30,237, 57,149, 82, 26, 54,234,189,207,125,206,135, 50,130, 20,178,140, 62,130,229, +140,120,124,146, 93, 31,171,192,204, 22,131,193, 96, 48,254,147, 6,203,230,224,131,195, 67, 2,241,211, 79, 63,225,221, 9,159, +160,118,237,218,247,134,126, 39, 4,147, 62,156,138, 47, 63,153,128,193,221,219,194,225, 20,130, 11,211, 40,100,196, 96, 92,191, +126, 29,102,179, 57,223, 84,175, 94, 61,159, 18,236,235, 83, 11, 18, 17,193,134, 4, 3,236, 14, 1,118,167,107,114, 8,232, 80, + 95,235,151,166,131, 23,130,131, 2, 52, 88,248,253, 60,188, 59,117,102,190,124,120,111,210,135,248,110,250, 7, 24, 55,250, 69, +216, 28,124,112, 73,210,233, 15,143,153,166,219,108,249,100,180, 88,126, 50, 77,166,201, 52,153,230,227,173,249, 88, 26, 44, 66, + 72, 59, 0,187, 92,153,150, 23, 25,113,216, 44,168, 91, 49, 20,243,102,125, 10, 10, 14, 2,165, 0, 5,168,224, 64,149,114, 42, +152, 77,254, 71, 31, 4, 65,128,221,110,135,195,225,192,130, 5, 11,144,155,155, 11,158,231, 81,167, 78, 29, 0, 64,108,108,172, +103, 4,230,102,124,124,124,116,113,154,225, 13,158,185, 1,138, 74,158,203, 38,207,252, 17,251, 19,174,130, 82, 64,174, 80, 98, +192,243,175,130, 23, 40,236, 14,255,223, 79,106, 49,153, 16,169,145,224,203,207, 62, 4, 39,145,130, 3, 1,199, 17,112, 68, 64, +237, 10,193,176,154,205, 15,227,216, 81,220, 31,197,162,255,194, 50, 72,254,197,105,103, 48, 24, 12, 70,105, 47, 2,133,120,144, +199,194, 96, 1,216,229,109,167,108, 22, 51, 42, 4, 75, 81, 94, 19, 8,167,147,199,105,123, 36,140, 38, 11,236,118, 7,110,218, +237,184,114, 60, 25, 45, 91,182,196, 51,207, 60,195,219,237,118, 72,165,210,236, 53,107,214,132, 20,103,176, 28, 14, 7,236,118, + 59, 76, 38, 19,150, 44, 89, 2,177, 88, 12, 65, 16,220,174, 56,239,179, 85,171, 86,149,124,180, 26,149,174, 28, 89, 13,173, 66, + 4,167, 64,225,116, 82, 56,120,128, 23, 40, 76, 54, 1,125,135,127, 0,167, 32,192, 41, 8,176,249, 96,176,242, 25,182,144, 38, +232, 51,113, 25, 0, 77,222,239, 1, 50,224,221,214, 4, 82,153, 28, 50,169, 8, 86,243, 63,223,204,213,126,178,137,186,154,218, +242,117,114,255, 23,148, 57,193,149,230,130,253,199,152,193, 98, 48, 24,140,255, 38,187, 30, 39, 99, 85,208, 96,229,185, 72, 74, +233,238,191, 13,150, 9, 78, 7, 15,135,147,135,211,225, 68,142,209,140, 25, 51,102, 64, 46,151,131, 16, 2,247,203, 79,121,158, +231, 28, 14, 7,122,244,232, 17, 92,220, 6,121,158,135,221,110,135,221,110,135, 32, 8, 16,137, 68,104,214,172,217,125,235, 29, + 58,116,200,175, 29,209, 42, 68,168,210,105,226,125,203, 15,175,254, 20,148, 2, 60, 79,193,243,212, 39,131, 85,156, 97,107,212, +110, 32,172, 54, 7,168,203,210, 88, 76, 15,167, 31, 81,251,201,166,127,139,169,242, 76, 51, 0, 80, 87,211, 32, 27, 38,132,193, + 96, 48, 24, 94, 61,200, 99,101,176,112, 47, 68,151,231, 34,173,102, 51, 28, 14, 39,156, 78, 30, 14,199, 61, 99,164, 84, 42,209, +166, 77,155,252,126,132, 82,108,217,178, 5,118,187,189,216, 13,186, 59,181, 59, 28, 14, 80, 74, 65, 41,197,178,101,203, 32,145, + 72,242, 38,169, 84,234,247,142, 56,121,138,137,239,189, 5,169,152,131, 68,204,229,125,242,148, 2,148,130, 23,238, 77, 86,135, +111,126,164, 40,195, 6, 0, 54,171, 29,160, 20, 20, 20,230,220, 92,118,102,148,192,104,185, 34,112, 12, 6,131,193, 96,220,231, + 65, 30, 23,131,213,158, 16,114,159,243,176,153,115, 93,209, 43, 30, 14,167, 51,207, 64,205,154, 53, 11, 18,137, 4, 50,153, 12, + 98,177, 24, 18,137, 4, 0,124, 50, 88, 22,139, 5, 85,171, 86,133,205,102,203,235, 48, 62,100,200,144,251,214, 59,114,228,136, + 95, 59,226,224, 41,226, 62,159,125,223,242,125, 43, 63, 65,195, 39,170,160,105, 13, 53, 44,118, 1, 6,147,179,244,134, 13,184, + 23,193, 2, 64, 41, 96,206,101, 79,194, 49, 24, 12, 6,131, 81,210,123,110,111, 30,228,177, 48, 88,174,144,220,125,174,209, 98, + 50,193,233,112,230,153, 44,155,205, 6, 65, 16, 48,102,204, 24, 16,146,127,245,237,219,183,195,102,179, 21,189, 49,177, 56,109, +228,200,145,249,134, 72,160,148,226,247,223,127,135, 76, 38,203, 23,197, 42,168,239,139,193,154,242,254, 59,144, 73, 68,249, 12, +145, 32, 0,235, 54,252,133,117, 27,254,202, 91, 87, 36,146,164,149,198,176, 1,128,205,230,138, 96, 81,138, 92,163,129,157, 30, +190,222,158,124,172, 34,174,166, 77, 6,131,193, 96, 48, 10,245, 32,143,133,193, 42, 12,139, 57, 23, 14,143, 62, 88,118,187, 29, + 78,167, 19, 11, 23, 46,204,103,134, 36, 18, 9, 56,142, 43, 54,130,245,199, 31,127,228, 27,220, 51, 54, 54,150, 82, 74,209,191, +127,255,188,206,237, 47,191,252, 50, 70,141, 26,229,183,193,114,242, 20, 31,127,246, 69, 94,135,164,238,157,218,224,153,238,237, + 32,184, 22,164,157, 94,227,151, 96, 81,134, 13, 0,108,214,123,125,176, 40, 0,147,129, 53, 17,250, 1,113, 13, 60, 42,176,172, + 96, 48, 24, 12,198,227, 74,161, 6, 75, 34,230,178, 47,223, 72, 14, 12, 83, 43,224, 20,172,112, 10,247,158,252,227,121, 30,163, + 70,141,202, 91,239,217,103,159,197, 11, 47,188,224,213, 96,249,242,182,109, 65, 16,176,111,223, 62, 16, 66,192,113, 92,222, 84, +232,213,185, 16,205, 92,171,128,253, 43, 63,129, 64, 41, 4, 10, 8,174, 7, 18,108,206,226,131, 37,222, 52,139, 51,108,114, 77, + 16, 68, 28, 5, 33,192,149,219,169, 16,139,184,108,127,247,221,111,103,242,239,213,244, 54,164, 4,247, 31,217,119,166,201, 52, +153, 38,211,100,154,204, 96,121, 92, 17,121,250,198,247,235, 15,127,227,224,133, 64,247,178,186,117,235,194,110,183, 99,243,230, +205,121, 17, 39,145, 72,228,115, 4,203, 11, 55,219,182,109, 91,212, 80, 12, 55,125, 59,210,184,217,184,195,160, 74, 69,253,238, +111,194,138, 51,108, 63,236,249,251, 21,132, 98,142,203, 6,165,111,176,226,228, 29,215,144, 18,110,147, 69, 88,142, 48, 24, 12, + 6,227, 63,107,176,110, 38, 37, 45, 1,176,196,115, 89,207,158, 61,141, 79, 63,253,180,210,253, 20,160,205,102,131,213,106,205, +251,174, 80, 40,252, 26,113,211,151, 65, 68,125, 33,237,212,154,232, 50,205, 21, 31, 12,155, 94,175,143,102,197,199, 47,147, 5, +252, 61, 60, 3, 51, 90, 12, 6,131,193,248,111, 26, 44,111,152, 76,166, 32, 66,136, 56, 57, 57,249,190,223, 92,203,156,143, 67, +166,148,185, 97, 99, 20,103,180, 88,167,119, 6,131,193, 96,252,119, 13,214,174, 93,187,156,143,139,137, 98, 60, 26, 70,139,153, + 43, 6,131,193, 96, 60,142,176,145,180, 25, 12, 6,131,193, 96, 48,202, 24, 2,160,190,183, 31,252,121, 58,128, 16, 82,223,223, + 13, 23,167,207, 52,153, 38,211,100,154, 76,147,105, 50,205,199, 79,179, 56,109, 74,233,105, 66,200, 40, 74,233,130,127,181,193, +114, 63, 13,248, 64,196,217, 35,172, 76,147,105, 50, 77,166,201, 52,153, 38,211,244, 95,255, 95,111,176, 88, 19, 33,227,161, 17, +251, 74,130,146,229, 2,131,193, 96, 48, 30, 71,196,143, 98,162, 26, 53,106, 20, 41, 18,137, 26, 3, 8,225,121,126,203,241,227, +199,147,217,161, 42,209, 29,128,152, 82,234,124, 20, 53, 43, 13, 90,185, 65,202, 27,187,235,250,156,187,217, 82,170,168,182,114, +229, 0,158, 29, 49, 6,131,193, 96, 48,131,229,162, 73,147, 38, 85, 4, 65,120, 17,192, 80, 74,233,137,132,132,132,254,254,106, +180,104,209, 66,225,112, 56,198, 80, 74,155,115, 34, 73,227,218,141,218,235, 26, 53,107,139, 44, 19,197,182, 21, 51,175,181,111, +223,190,238,174, 93,187,172,254,104,198,198,198,110, 0,208,163, 16,147,240,241,177, 99,199,166,248,163, 23, 19, 19,211, 21,192, + 4,215,236,244,132,132,132, 45,143,226, 1, 13, 11, 11, 83,107, 52,154,169, 53,107,214,236,242,220,115,207,213,104,217,178,101, + 70,114,114,242, 97,187,221,254,137, 94,175, 63, 81, 82,205,160,160,160,169,245,234,213,235, 54,108,216,176,106,173, 90,181,202, + 72, 74, 74, 58,236,112, 56, 74,164,217,116,252,209,202,130, 57,189,199,154,249,175, 97,244,199,203,162, 79, 59,148, 47, 2,248, +201,111, 35, 62,252,207, 72, 78,204,137,227,191,239,121, 11, 0,162,163,163, 43, 59, 28,142,142, 0,158,228, 56,238,132, 72, 36, +218,113,227,198,141,196,210,228,231,191, 69,147,193, 96, 48, 24,143,129,193,170, 91,183,174, 90, 38,147, 13,224, 56,238,165,134, +177, 45, 90, 63, 61,240, 37,226, 32, 42,124,246,206,179,126, 71, 54, 26, 53,106,212,156, 19, 75, 22,191, 48, 38,174,122,165,106, +117, 32, 87, 5, 32,215, 70,144,154,205, 67,102, 18, 80,161,225,165,170, 55,142,174,108, 3, 96,171,159,210, 61, 86,108, 60,140, +228, 44, 30,132, 0,132, 0, 28, 1,140, 22, 1,147,134,181,158, 12,192, 47,131,197,113,220, 71,195,226,118, 54, 23, 40,176,104, + 82, 7, 41,128, 71,206, 96,233,116,186, 86,205,155, 55, 95, 49,110,220,184,200,114,229,202, 65,173, 86, 67, 34,145,148, 79, 74, + 74,122,230,245,215, 95,239,165,211,233,198,233,245,250,111,253,213,236,218,181,235,170,119,222,121, 39,130, 16, 2,177, 88, 12, +169, 84, 90, 62, 41, 41,233,153,183,223,126,219,111, 77, 66, 8, 87,175,195, 75,163,180, 17,237,193, 17,130, 64,173, 2, 57, 87, + 79, 14,169, 92,249,245,223, 18, 19, 19,125, 54,209,141, 94,217, 56, 21, 98,241, 36, 1, 32,245, 7,205,219,112,119,255,167, 55, +106,214,172, 73, 70,140, 24,145,225,116, 58, 77,118,187, 61,124,209,162, 69,227,116, 58, 29, 5,176,221,106,181,238,185,123,247, +174,161,168,132,125, 60,229,222,224,167,139, 22, 5,106,237,118,101, 91, 0, 29,106,213,170, 69,134, 15, 31,158,225,116, 58, 77, + 86,171, 53,124,241,226,197,190,107,122, 16, 18, 18,162,149,203,229,237, 0,116, 44, 85, 58, 61, 24,216,137, 92, 88,185,141,214, + 46,233,239, 5,118, 63, 8,128,130, 82,154,236,195,186, 17, 0, 84,148,210,107,255,180,230,131, 32, 42, 42,202, 78, 41,149,248, +243, 31,169, 84,170,240,167,188, 50, 24, 12,102,176,138,170, 0, 73,108,108,108, 91, 74,233, 75,149,171, 86, 31,208,239,185, 87, +148,149,107,212,135, 81, 8,192,245, 12, 1, 9, 59,127, 3,128,229,190,234, 85,175, 94, 93, 22, 24, 24,248, 73,229, 58, 77,223, + 30, 57,118, 10,119, 38, 85,129,221,215,121,136, 57, 59, 68, 28, 96, 51,166, 35, 39,249, 2, 82, 47,238, 54, 59, 28,142, 3, 37, +217,185,219,153, 78,236,189, 96,131,136, 3, 56, 14, 16,113, 4,162, 18,142, 31, 78, 41,141,164, 0, 54,157,180,128, 82,170,123, +212, 14,100,133, 10, 21,186,247,238,221,123,221,155,111,190, 41, 54,153, 76,176, 88, 44,160,148, 66,161, 80, 64,167,211, 97,245, +234,213,226,193,131, 7,127, 21, 21, 21,149,144,148,148,116,200, 87,205,151, 94,122,105,221,235,175,191, 46, 62,127,254, 60,236, +118, 59,148, 74, 37, 20, 10, 5, 66, 66, 66,176,104,209, 34,241,136, 17, 35,124,210,172, 93,187,118, 11,185, 92,254,121,227,198, +141,155,214,170, 30, 33, 74, 11,169, 9, 0,168, 84,165, 6,180, 52,165,195,181,212,240,220,216,216,216,243, 38,147,105,202,133, + 11, 23,254, 40,210,224,143,248, 43, 88, 42, 34,239,205,123,171, 21, 39, 22,113,228,127, 95,238,239,189,100,237,238,175, 58, 52, +174,126, 23,128,113,195,134, 13,214,158, 61,123, 90, 71,140, 24, 97,191,112,225, 2,247,245,215, 95, 63,185,125,251,246,190, 81, + 81, 81,187,147,146,146, 22,123,211,252,120, 10,200,166,148,117,137, 54,187,179, 98,104, 7,135,165,123,212,249,217, 35, 71,142, +204,138,138,138,114,122,106,142, 26, 53,202,126,233,210, 37,238,171,175,190,106,184,125,251,246, 62, 46,205, 37, 69,154,193, 65, + 95,239, 41, 31, 59, 84,214, 35, 54,120,247,152,209,195,239,211,244, 39,157, 5,168, 85,202,223, 61, 17, 1,136, 35,132, 44,164, +148,238, 47,162, 30,136, 1,240, 44,128, 25, 15, 73,179, 72,148, 74,101,170,197, 98, 9, 7, 0,133, 66,145,102, 54,155, 35,124, + 56,183,201, 55,223,124, 3,169, 84, 10,142,227,192,243, 60,120,158,135, 32, 8,160,148,230,125,186, 31, 8,122,239,189,247, 88, +115, 54,131,193, 40, 59,131,213,168, 81,163,141,221,251,190,208,173,121,219, 46,112, 74,195,113, 33,141,224,214,117, 10,177,200, + 9, 14, 2,174, 29, 93, 75, 57,142, 91, 92,160,226, 58, 93, 88, 4, 44, 32, 48,240,224,128, 87, 62,174, 87,181, 94,107,108, 56, +235,128,192,219,144,113,126, 19,178,111, 30,133, 33,229,156,205,105, 53,158, 38,132,236, 21,139,197, 51, 79,157, 58,101, 42, 78, +211,123,197, 9, 8,148,130, 80, 2, 8, 0, 64,239,133,177,238,175, 96,125,209, 60,177,118,231,185, 74, 68,170, 6,165,244,178, + 15,149,118,153, 63, 93, 81,152,166, 78,167,235, 61,102,204,152, 53, 61,123,246,228, 50, 50, 50, 64, 41,197,154, 53,107,144,144, +144,128,168,168, 40,188,247,222,123,168, 84,169, 18, 62,254,248, 99,209, 75, 47,189, 52, 11, 64, 11, 95, 52, 63,124,241,197, 53, + 61,135, 15,231,142, 30, 61, 10,167,211,137,173, 91,183,226,204,153, 51,136,140,140,196,155,111,190,137, 74,149, 42,225,253,247, +223, 23,189,250,234,171, 69,106, 54,110,220,248, 90,149, 42, 85, 42,189,248,226,139, 92,175, 94,189, 72,154, 1,120,229,219, 11, +247, 10,160, 68,142, 65, 3, 7,112,221, 63, 31,133,173, 91,183,214,251,241,199, 31, 87,196,198,198,218,226,227,227,213,190,231, + 39,161,129, 1,193, 25, 0, 82, 1, 32, 48, 48, 80, 13,192, 4,192, 84,187,118,109,241,119,223,125,231, 60,127,254,252,213,238, +221,187,247, 4,176,184, 48, 77,135, 83,136,252,113, 82,103, 12,159,182, 85, 49,121,242, 7,105, 28, 39,113, 0,176, 3, 64,112, +112,112,158,102,205,154, 53,197,223,126,251,173,243,226,197,139, 87,187,118,237,218, 19, 30,175,148,242,150, 78, 94, 90,174,117, +131, 86,117,237,187,110,101, 54, 52, 44,191,186,251,245,190,202, 45, 79, 84, 9, 54,150, 52,157, 3, 59,145, 11,110,243, 52,176, + 19,161,197, 68,185, 40,128,139, 5, 35, 89, 5, 53, 41,165,119, 8, 33,243, 1,252, 65, 8, 25,224,205, 16, 17, 66, 90, 1, 88, + 5,160, 59,165, 52,173,184,242,233,169, 41,147,201,164,118,187, 61,184,160,241,241, 87,211, 35, 45, 52, 62, 62, 30,177,177,177, +240,252,116,223, 88,184,214, 9,247,245, 60, 18,137, 68,152, 55,111, 30, 56,142,131, 84, 42,133, 68, 34,129, 84, 42,189,111,106, +212,168, 17,188, 61,121, 93, 84,249, 36,132,136, 42, 85,170,244,158, 72, 36, 26, 97,179,217, 42,200,229,114, 61,207,243,139, 66, + 66, 66, 62,139,143,143,119, 60, 10,117, 8,211,100,154,143,130,102, 49, 52, 1, 16,230, 49,111, 3, 32,115,125,207,192,189, 97, +167, 66, 11, 44,247, 92,207,253,153,238, 90, 30,230,250, 31,245,208, 77, 7,112,180, 76, 13, 22, 33,132, 82, 74,137,251,179,144, +117, 3,110,155,131, 96,188, 94, 14, 98, 78,128, 88, 68, 32, 22, 1, 0,193,157,219,231, 96,203,189,179,239,216,177, 99,215,125, +217,168, 92, 46,255,124,208,232,105,245,248,208, 38,216,112,210, 14, 71,206, 45,220,218,253, 5, 53,167, 95,154,239,186,219, 61, +155,144,144,224, 40,237,206, 9, 20,224, 61,141,149, 0,144,146, 15, 28,126,211,163,194,212, 63, 42, 14, 57, 50, 50,178,239,196, +137, 19, 87, 55,106,212,136,252,250,235,175,168, 87,175, 30, 22, 46, 92, 72,175, 92,185, 50, 83, 16,132, 47,174, 93,187,214, 41, + 55, 55,119,233,111,191,253,134,102,205,154, 33, 32, 32, 32, 38, 54, 54, 86, 82, 84,197, 30, 25, 25,217,119,201,152, 49,171, 27, +182,110, 77,102,118,234,132,168, 33, 67,176,108,215, 46,122,227,198,141,153,130, 32,124,113,243,230,205, 78, 22,139,101,233,194, +133, 11,209,184,113,227, 98, 53, 69, 34, 81,197,101,203,150,137, 84, 42, 21, 68, 34, 17,162, 21, 64, 68,144, 20, 51, 86, 94, 64, +122,166, 5,227,251,234, 32, 22,139,209,169, 83, 39,232,116, 58,241,232,209,163,139,124,186,245,236, 15, 93, 50, 27,189,178,241, +243,209,179,246,125, 64, 8, 71,171,132,139,183, 5, 73, 12,103,128, 16, 49,128,160,114,229,202, 57, 0,192,110,183,103,173, 95, +191,222,153,144,144, 16, 90,189,122,245, 80,248, 49,106,252,241,227,199, 77, 33, 33, 97, 25,149, 43, 87, 22, 3, 8, 10, 9, 9, +241,166, 89,206, 87,189, 23,123, 52,146, 25,205, 54,236, 58,118,189,253, 75,211,118,180,171,174, 11, 56,222,179,113,224, 95, 0, +114,253, 77,167,219, 44, 13,236, 68,232,202, 85, 7,210,192, 11, 0,159,227,128, 61,219, 1,103,182, 3,142,108, 7, 28, 89,142, +129,111,206,106,184,114, 27, 37,126, 84,152,135, 8, 33, 3, 0,172, 42,104,178, 60,140,208, 0, 74,233, 9,127, 53,237,118,251, + 62,183, 49, 81, 40, 20,225,132,220, 51,134,114,185,220, 97,181, 90, 59,248,163, 9, 0,241,241,241,136,137,137, 17,185, 52,169, +251, 19, 37,124, 51,128,251,165,245, 34,145, 8, 49, 49, 49,232,221,187, 55,106,213,170,133,219,183,111, 99,215,174, 93,184,116, +233, 18,164, 82, 41, 8,241, 47, 4, 78, 8, 17, 85,174, 92,249, 64,231,206,157,235,191,241,198, 27,138, 74,149, 42,225,194,133, + 11,149,230,206,157, 59,126,223,190,125, 79,199,198,198, 54, 41,234, 92,100, 48,254, 11,248,232, 65,194, 8, 33,235, 61,234,150, + 94,238,249, 9, 19, 38, 76,138,139,139, 59, 67, 8, 89,239,185,220,115, 61,207, 79,215, 54,215, 83, 74,123, 77,156, 56,177,222, +244,233,211,167,185,215,125, 40, 17, 44,145, 72,212,239,244,230,175,226,107,216,169, 46,162, 94, 79, 87, 61,118,239, 53,114, 55, + 78,108,134, 32, 8,139,124,209,137,141,141,109, 31, 85,163,201,232,168, 90,205,176,225,132, 13,134, 43, 91,144,122,232,187,155, +130,211, 62, 44, 33, 33, 97,103, 89,236, 84,227,198,141,251, 7,133,150,135,213, 78, 93, 6, 43,191,201,122, 92,168, 88,177,226, +160,105,211,166, 45,171, 86,173, 26, 89,185,114, 37, 40,165, 88,189,122, 53,189,114,229,202,112,189, 94,255,179,107,181,223,106, +213,170,181, 80, 36, 18, 41, 57,142, 67,165, 74,149,164, 39, 78,156,136, 2,144, 88,152,230,138, 9, 19,150, 63, 89,171, 22,146, + 6, 14, 68,107,167, 19, 63,254,242, 11,189,193,243,249, 52,107,212,168,177, 80, 44, 22, 43,197, 98,113,177,154, 46, 99,130, 43, + 87,174, 64, 36, 18, 33, 52, 52, 20,159, 63, 95, 1,135, 47,102,162, 97,149,112,152, 51,111, 99,197,246,227,184,126,253, 58,130, +130,130,124, 51, 64,223,247,248, 40,186,118,108,221,197, 75,150, 37,201,249,204,147,233,233,233,229,210,211,211, 17, 20, 20,148, +197,113,156,253,139, 47,190,144, 94,190,124, 57, 72, 46,151, 67, 46,151,195,110,183,251,117,225,117, 58,157, 92, 89,107, 6,107, + 21,232,215,241, 9,105,183,150, 53,176,239,196,141, 38,179,255,184,214, 48,249,226,222,231, 74,163, 9, 94, 0, 14,181, 62,118, +223,242,168,151,194, 75,120, 87,186,223,101,178,118, 16, 66,164,174,197,169,174,207, 1, 69, 53,245, 21,163,153, 55,111,181, 90, + 61,163, 76,146,146,104,198,198,198,186, 53,242,157,209, 10,133, 34,205, 29,185, 82, 40, 20,105, 62,103, 35,207, 67, 38,147,161, +126,253,250,120,251,237,183,113,225,194, 5,236,219,183, 15,225,225,225,232,218,181, 43,196, 98, 49,110,221,186, 5,142,243,111, +100,155, 10, 21, 42,188,247,212, 83, 79,213,253,230,155,111, 20,137,137,137,184,112,225, 2, 2, 2, 2,240,201, 39,159, 40,223, +125,247,221,234,135, 14, 29,250, 8,192,135,236, 18,203, 96,248, 92,159,244, 42, 56, 79, 8, 89, 31, 23, 23,215,203,155,169,242, + 98,230,242, 45,159, 62,125,250, 52,143,249,204,178, 76, 43,231,233, 32,139,140, 6, 9, 66,171,160,114,186,240, 87,158,235, 10, + 65, 0,156, 2,224,228, 41,204,166, 92,164, 92,216,105,178,217,108,171,138,219, 88,221,186,117,213,224,196, 63,189, 60,230, 35, +178,254,184, 13,150, 59,137, 72, 57,248,237, 13,202, 59, 26,148,165,185, 10, 12,137, 88,246,225,140, 31,113,244,154, 13, 2,253, + 59,146,197, 11,247,190, 63, 14,148, 47, 95,190, 78,175, 94,189,150, 85,173, 90,149,172, 88,177, 2, 86,171, 21,183,110,221,162, +199,142, 29,123,217,195, 8, 65,167,211,141,232,222,189,187, 82, 36, 18,193,225,112,224,218,181,107,198,180,180,180,155,133,105, +142,108,219,118, 89,131, 10, 21,112,251,185,231,192,103,103,227,148, 66, 65,143, 10,194,125,154,125,251,246, 85, 74,165, 82, 80, + 74,139,212, 44, 80,176, 97,183,219,145,148,148,132, 83,199, 15,195,120, 99, 63,150,253,242, 61,150, 44, 89,130,235,215,175, 67, + 44, 22,195,233,244,253, 57, 9, 62, 55,205, 82, 67,167,206,241, 92,150,149,149, 21,116,248,240, 97,122,230,204,153, 32, 87,185, +117, 27,166, 18, 91,235,130,154, 30, 38,172, 68,154, 74,185, 4, 29, 26, 87, 21, 57,121, 65, 90,234,116, 10,217,118,175,203, 29, +119, 28,165,168,192,246, 3,144,122,244, 59,138, 40,169,185, 42, 96,124,252,142, 0, 21, 21,193,242, 22,173, 50,155,205, 17,148, + 82, 18, 31, 31, 15, 95,250, 95,121,212,111,144,201,100,232,221,187, 55,206,159, 63,143,164,164, 36,136, 68, 34, 88,173, 86, 88, +173, 86,196,196,196,148, 40,130, 37,147,201,158,127,227,141, 55, 84,215,175, 95,199,157, 59,119,192,113, 28,156, 78, 39,120,158, +199,168, 81,163, 84, 50,153,108, 40,187,100, 50, 24,222, 61, 8, 33,100, 20, 33,100, 84, 65,131, 84, 90,131,230, 77, 99,226,196, +137,245, 0,200, 31, 72, 4,203, 29,158, 43,228,110,177,127, 96,104,228,178,137,113, 63,136,255, 56, 41, 66,102,242, 69, 88,210, + 46,162, 98, 76, 31,164, 94,220, 15,202, 59,126, 63,123,246,108,110,113, 27,147,203,229,239,245, 27, 49, 37,122, 95,162, 28, 22, +155, 5,105, 7,190, 16, 4,167,253,197,227,199,143,231,148,149,185, 10, 8, 14, 95,246,254,231, 63,138,255, 60, 35,193, 29,253, + 69, 92, 88,251, 30,120,187,169,224,170, 27,253, 60,240, 36, 38, 38, 38,178, 70,164, 18,156, 76,142,131, 64,196,192,129, 3, 69, + 43, 87,174,124,104,157, 93, 83, 82, 82,206, 71, 69, 69, 77,182,219,237, 83, 57,142, 67,106,106, 42, 77, 72, 72,120, 41, 41, 41, +233, 23,143,187,231,238,205,154, 53,155, 59, 97,194, 4, 16, 66,176, 99,199, 14,152, 76,166,189,148, 82,161, 40,205,224,211,167, +167,182, 51,153,176, 54, 52,148,206,227,249,251, 52,187,118,237, 58,119,220,184,113, 32,132, 96,207,158, 61, 69,106,122,114, 45, +131,194,100, 1, 42,151,227, 16, 20, 20,132, 93,187,118, 65, 42,149, 66, 44, 22, 35,211,161,133,224,148, 33, 74, 98, 46,113,158, + 8,130, 64,114,114,114, 68,102,179, 89,228,112, 56, 56,169, 84,154,215,100,228,112, 56,132,178,210, 20, 4,161, 84,154,249,124, + 80,105,211,105,207,241,110,164,108,119,202,162,217,201,230,246, 9,165, 49, 87,110,227,227,238,128, 46,151,203,243,140,138, 63, + 81,166, 66, 34, 88, 37,250,221,155,193,146, 72, 36,168, 81,163, 6, 14, 30, 60,136,128,128, 0,104, 52, 26,168, 84, 42,200,229, +114, 4, 4, 4, 64, 38,147,129,227, 56,191, 76,150,221,110,175, 84,161, 66, 5, 92,190,124, 25, 10,133, 34,111,146,201,100,168, + 85,171, 22, 76, 38, 83, 20,187,180, 50, 24,222, 61,136,183,145,220,203,162, 25,207,155,201,154, 62,125,250, 52,207, 40, 88,153, + 26,172, 34, 42,170,254,129,161,145,203, 38, 76,251, 65,188, 50,129, 67, 86,242, 5,220,216, 60,201,201,219, 77,105,130,224,208, +101, 94,221, 7, 0,139,124,220, 94,187,242, 85, 26, 96,255, 9, 59, 44, 23, 86,195,158,121,237,171,227,199,143,239, 45, 75,115, + 53,105,250,143,226, 63, 78,138,113, 87,127, 17, 87, 55, 76,224,157,182,220, 23, 19, 18, 18,150,150, 84,183,105,211,166, 53, 90, + 54,142,249,105,104,132,163,229,211, 3,171, 66,166,144,226,189, 43,226, 46,103, 15, 36, 30,141,137,137,121, 57, 33, 33,225,244, +195, 42,144, 73, 73, 73,159,232,116, 58, 73, 84, 84,212, 7,183,111,223,126, 33, 57, 57,249, 87,143, 40, 83,239,254,253,251,175, +121,245,213, 87,185,128,128, 0,220,189,123, 23,147, 39, 79, 54,115, 28, 55,206, 23,205,237,161,161, 31, 28,113, 58,239,211,236, +240,204,171,107,222, 29,251, 34, 39,145, 72,144,145,145,129,169, 83,167, 22,171, 41,200,203,147,231,190,190, 5,181, 66, 2,133, + 84,129,155, 7,115, 17,215,231, 94, 83,145, 84, 42, 69,188,177, 1,136,166, 34,148, 82, 49,226,111,103,194,169, 61, 75, 98, 95, + 73,144,196,127, 31, 83,172, 73, 32,132,240,119,239,222,149, 36, 38, 38, 42, 44, 22, 11, 87,185,114,101, 11,199,113,212,233,116, +114,119,238,220,145,202,100, 50,148, 43, 87,206,206,243,188, 95,177,203, 59,119,238,138, 19, 19,111,202,109, 54, 91,153,105,122, +163,212,154,206, 66, 12,150, 61,221, 94,202,164,221, 36,132, 84,114,127, 47,139,242,106,177, 88,194, 61,154, 6, 81, 68, 95, 11, + 95, 35, 88, 37,254,221, 75,133, 11,153, 76,134, 43, 87,174, 32, 44, 44, 12, 78,167, 19,106,181, 26, 74,165, 18, 74,165, 18,102, +179, 25, 50,153, 12, 34,145,200, 47,227, 38,147,201,110, 94,184,112,161, 86,112,112, 48,120,158,207,103,178,174, 95,191, 14,181, + 90,157,196, 46,173, 12,134, 95, 1,143,245,158, 70,139, 16,178,126,194,132, 9,147, 74,170, 55, 97,194,132, 73,165,141,138, 21, +105,176,220, 21, 93,193, 10, 47, 54, 54,182,127, 96, 72,249,101,227, 63, 93, 40, 94,122,140, 67,118,242,121,232,183,190,239, 20, + 28,230, 33, 28,199,237,191,117, 96,193, 42, 0,166,132,132,132,221, 62,100, 10, 23,219,172,205,147, 34,185, 6,148,154, 97, 78, + 58, 8,142,227,102,150,165,185,154, 16,247,131,120,229,113, 49, 50,147, 47,224,198,166,137, 60,111, 55,149,216, 92,181,111,223, + 94,108, 52, 26,223,169,167,226, 63,126, 59,218, 46,141,146, 81,156,155,247, 30, 46, 84,210,162, 94,115, 21, 42,215, 17, 26, 29, +222,100, 73,136,141,141,157,110,181, 90, 63, 57,123,246,172,253, 97, 20, 54,189, 94,255, 81, 84, 84,212, 31,201,201,201, 39,221, +203, 34, 35, 35,251, 62,255,252,243,171,218,182,109,203,253,246,219,111,232,211,167, 15, 62,252,240, 67,154,158,158,254, 74,114, +114,242,149,146,106,246,125,115,209,234,193, 61, 91,144, 65,227,103,227,195,145, 29,241,195,156, 79,139,213, 12,233,245,203,201, +138, 81,189, 69, 53,130,205, 24, 61,168,213,189, 59,133,229,231,113, 33,245, 94,192,211, 33,136,144, 41,132, 99,254,176,134,224, + 56,130, 61,199, 46,227,231,148,122, 68,127,125,215, 21, 32, 38,186, 56,115,178,104,209,162,192,180,180, 52,174,118,237,218,119, +234,215,175,159, 43,149, 74, 5,179,217, 44, 40, 20, 10,167, 90,173, 22, 44, 22,139,236,250,245,235, 33, 73, 73, 73, 34,135,195, +225,243, 5,125,251,246,237,186, 58,117,234,102, 52,108,216,176, 80, 77,189, 94,207,249,162, 89,212,229,184,180,233,132, 35,171, + 16,131,149, 86,170, 8, 22,165, 52,186,152, 14,167, 15, 13, 87, 36, 12, 0,132,194,134, 98,240, 39,130,229,142, 72,201,100, 50, + 28, 56,112, 0,221,186,117,131, 32, 8,144,203,229,121,195,146, 28, 57,114, 4, 82,169, 20, 34,145,200,191, 0,163,221,190,100, +206,156, 57, 19,167, 79,159,174,118,155, 56,165, 82, 9,185, 92,142, 47,190,248, 34,215,106,181,254,202, 46,153, 12, 22,189,242, +238, 65, 10,144, 94, 32,122,101,243,152, 79,199,189,119, 43,247,114,125,135,151,239, 54, 47,203,238,196,197,197,237,244,136, 92, +165,255, 35, 17,172,216,216,216, 46,129, 33,229,151,189,253,233, 66,241,226,195, 34,100, 39,159, 67,198,206, 15,156,212,105, 25, + 18, 31, 31,191,218,181, 90,107, 95, 55,212,168, 81,163,154,149,159,104,174, 74,203, 17, 64, 5, 39,248,236,196,212, 99, 71,143, +166,150,118, 7, 98, 98, 98,186, 4,134, 68, 44,123,247,179, 31,196,191,197,139,145,165, 63, 15,253,214,247, 75,101,174, 98, 98, + 98,186, 74, 57,178,228,141, 10,246,208, 94,229,156,224, 41,176, 36, 69,130,101, 39, 14,237,113,128, 90,234, 54, 87,116,173,223, + 70,142,167,134,168,196,215, 78,219, 63, 56,186, 21, 99, 99, 98, 98,134, 36, 36, 36,108,120, 72,145,172, 60, 35, 20, 21, 21, 53, +112,248,240,225,203,219,183,111, 79, 54,111,222, 12, 65, 16, 48, 99,198, 12,122,242,228,201, 87, 61,163, 81,254,106,246, 27,187, +120,249,128,222,157,200,251, 43, 29,200, 52, 41, 49,126,202,108,106, 77, 58, 85,172,230, 19, 81,242,250,243, 63, 28, 8, 0, 56, +116, 54, 5,219, 79,101, 34, 41,221,132,225, 77,129,115, 0,196,196,137, 16, 46, 21, 31,254,124, 10, 13,171,104, 48,160,125, 13, +180,109, 92, 3,115, 22,111,170, 84,174,243,183,145, 25, 91, 95, 79, 46,226,164, 76,223,182,109,155,234,131, 15, 62, 48,232,116, + 58,177,193, 96,224,120,254,239,199, 26,228,114, 57,116, 58,157, 51, 43, 43,203,182,117,235,214,106, 0,238, 20,149, 86,137,152, + 75, 30, 62,109,107, 69,169,136,183, 60,243, 76, 63, 90,190,124,249, 66, 53, 51, 51, 51,237,219,182,109,171,230,203, 9, 41,226, + 13,233,179,150,236, 9, 30,216,185,161,164,138,238,254, 78,252,254,166, 51,191,193,202,116,160,194,139, 97,176,223,113,192,126, +199, 1, 91,134, 3,246, 52, 7,156,166, 71,238,113,142,146,118, 64, 47, 38, 18, 22, 94, 86, 17, 44,169, 84,138, 91,183,110, 97, +251,246,237,104,218,180, 41,180, 90, 45,114,115,115,113,240,224, 65,164,164,164,228, 69,176,252, 10, 3,222,188,249,185, 68, 34, +233, 61,102,204,152, 39, 94,125,245, 85,117,157, 58,117,144,152,152,136,217,179,103,155, 78,157, 58,117, 53, 56, 56,120, 42,187, +188, 50, 24, 62,113,244,223,150,224,162,154, 8, 39, 53,239,255,161,120,209, 33, 49, 50,147,206, 32,123,239, 71, 5,205,149, 47, +119,134,158,111,219,142,169,251,100,115, 92, 77,117,130,207,185, 1, 42, 56,227, 75,146, 96, 47,111,240,158,216,114,192,135,226, + 95,142,138,145,173, 63,135,244,157, 31,250,109,174,188,104,126,184,243,157,254,161, 16,156, 56,185, 97, 57,190,188, 37, 51, 94, +183,144,183, 18, 18, 18,126,164,148,210,152,152,152,161,183, 46, 57,230, 52,239,161, 8,236,247,204, 16, 60,211,199,169,126,103, +248, 47,239, 3,216, 80,132,102, 89,132, 70,139,212, 44, 95,190,124,157,122,245,234, 45,235,209,163, 7, 89,179,102, 13, 12, 6, + 3,178,178,178,112,224,192,129,145,201,201,201, 63,150, 84, 51,170, 65,159,101,125,123,117, 34, 31,174,226,113,241,240, 10,104, +108, 73,176,232, 15,251,164,121,230,150, 45,225,185,119,127,138,149,201,149,224, 85, 58,140,239, 19,133, 58,229, 8,204,230,191, +187,236, 53, 9,186, 8, 35,185,139,189,241, 58,172,219,178, 7, 34,222,132, 27,233,150, 91, 25,219,223, 77, 46, 42,157,105,105, +105, 99,197, 98,113,135, 97,195,134, 13,109,221,186,117,192, 43,175,188,146,170,213,106,141, 50,153, 76, 20, 26, 26, 42, 19, 4, + 65,182,117,235,214, 10, 41, 41, 41,193,130, 32,252,154,150,150,182,179,176,116, 78,158, 2,138, 41, 79, 87, 62,119, 14,228,200, +145,200,246, 47,109,151, 62,215,174, 93, 59,237,136, 17, 35,210, 2, 3, 3, 13, 5, 52, 43,166,164,164, 4, 9,130,176, 36, 45, + 45,109, 87,113,249,121,114, 89, 90,100,141, 46, 55, 62,153,155,105,120,171,106,133,112, 81,223,167,234, 74,130,181,247,222,115, +237,111, 58,129, 2,227, 96,189, 49,251,201,162,202, 76, 97,227, 96, 61,140,242,105, 54,155, 35,252,141,138,249,146,206,132,132, + 4, 90,112, 60,172,162, 34, 88,133,105,202,100, 50,136,197, 98,164,167,167,227,175,191,254,202, 55,254,149, 76, 38,203, 27,198, +193, 31, 77, 74, 41, 79, 8,105,201,243,252,123, 99,199,142, 29, 97, 50,153, 42,168,213,106,189,221,110, 95, 20, 20, 20, 84,228, + 56, 88, 15,227, 24, 49, 77,166,249, 48, 53, 31, 55,138, 50, 88,202,253, 9,151,192,201,211, 96, 56, 60,195,111,115,229,141,148, + 76, 11,110,203,157,112,220,189, 8, 66, 72, 66, 25, 29,100,237,190,132, 43, 16, 43,238, 32,251,208,231,188,224, 48,151,170,207, +149, 59, 46, 0,193, 9,219,174,223,240,230, 37,101,134, 0, 52,136,143,143, 79,241,168,208,127,109,208,160,193,214, 45,191, 8, +103,158,106,235, 12, 59,125,125, 29, 8, 33,246,135,125, 48, 93,157,212,167,172, 90,181,106,106,110,110, 46,238,222,189, 75, 15, + 31, 62, 60, 76,175,215, 47, 42,173,230,236,159,250, 77,189,124, 41, 27,138,156, 67,212,114, 99,173,231,144, 13, 69,146,181,241, +249,198, 79,140,252,171, 53,201, 62,213, 66,121,229,251,241,107, 51,202, 7,235, 94,123,141, 68, 70, 70, 34, 56, 56, 24,161,161, +161,200,205,205,197,229,195, 27,169, 57, 37,197, 42, 4, 52,254,198, 18,217,105,115,198,246, 94,123,124,136, 58, 80, 0, 59, 98, + 99, 99,247,238,218,181,171,231,129, 3, 7,250,118,234,212, 41,181, 69,139, 22,198,132,132,132,202,137,137,137, 17, 14,135, 99, + 77,100,100,228,134, 98,199, 26,162,148, 78,254,187, 53,111,123,108,108,236,158,237,219,183,247,220,183,111,223, 51, 79, 61,245, + 84, 90,139, 22, 45,114, 93,154,225, 78,167,243,143, 26, 53,106,108,220,181,107,151, 79,143, 60, 82, 58, 89, 0,240,126,131, 46, +227,167,157,207, 74,252,246,106, 82,198,115, 13,107, 70, 17, 10,202,249,157, 78, 20, 24, 7,171,136,113,174,138,251,253, 33,221, + 49,150, 90,179, 96, 36, 44, 38, 38, 38,194,109,166, 10,126,250, 81,143,160, 97,195,134,240,124,210,145,227,184,124,147, 72, 36, +130, 88,236,255,219,197, 40,165, 60,128,105,174,137,193, 96, 48,131,133, 55,141,241, 95, 79, 7, 16, 14,224,173,248,248,248,141, +165,217,144, 72, 36,218,147,176,229,135, 76, 89,212,249, 96,235,173, 61, 70, 74,233, 79,101,177, 3,130, 32,140,205, 77,248,102, + 58,165,180, 28,165,244,221,132,132,132, 53,101, 32, 59,189,213, 23,107,192,113, 42, 34, 80, 33, 46, 33, 33, 33,165,224, 10,167, + 78,157, 74,143,137,137,121,241,237, 97,139,243, 94, 0,253, 40, 28, 80,119, 39,245,232,232,232, 15,110,222,188,153,239, 9,192, +210,106, 42,194, 99, 63,176,167, 39,248,109,216,206, 45,236,178, 15,232,178, 15,120,247,243,218,181,107, 63, 59,113,226,196, 5, +117,234,212, 81,134,135,135,147, 67,135, 14,209,107,215,174, 57, 13, 6, 67,220,217,179,103, 39,151, 36,125, 46, 83,178, 70,167, +211,253,181,121,243,230, 1,155, 55,111,110,206,243,252, 33, 74,233,148,228,228,100,115, 89,105, 10,130,176, 31,192,239,122,189, +222, 82, 18,205, 83,127,205, 52, 1,120,185,110,251,119, 39, 38, 24,147,127, 22,201,212, 79, 94,189,122,245, 92, 41,210,121,177, +148,191, 23,199,234, 7, 80, 68, 75,173,233,207,240, 11,190,122,160,177, 99,199,250, 89,157,137,192, 96, 48, 24,197,221, 93, 61, +176, 9, 64,125,207,249,166, 77,155,106, 27, 53,106,212,183,126,253,250,170,178,210,124, 16,233,124, 28, 52,117, 58, 93,195, 71, + 89,179,118,237,218,227,155, 53,107,102,108,208,160,193,143, 0,196,236,184, 63,122,154, 0, 52, 15, 64,179, 60, 59, 70, 76,147, +105, 50, 77, 31,244, 71, 61, 72,253,127, 98, 18,255,147,102,238,240,225,195, 6, 0,127, 48, 91,251,143, 68,178, 78, 62,202,154, +231,207,159,159, 9, 96, 38, 59, 82,143,244,205,151,241, 1,104,166,176,156,101, 48, 24,255, 5, 56,150, 5, 12, 6,131,193, 96, + 48, 24,101, 11, 1, 80,191,144, 59, 77,159,159, 14, 32,132,212, 47,193,157,236,105,166,201, 52,153, 38,211,100,154, 76,147,105, +254,183, 52,139,211,166,148,158, 38,132,140,242, 54,146,251,191,202, 96,249,251,180,141, 95,226,236, 17, 86,166,201, 52,153, 38, +211,100,154, 76,147,105,250,175,255,175, 55, 88,172,137,144,193, 96, 48, 24, 12, 6,163,140, 17,179, 44, 96,248, 66,133, 10, 21, +226,154, 53,107,246,191,163, 71,143,206,186,121,243,102,137, 70,159,142,141,141,109,164,209,104, 62,115, 58,157, 77,156, 78,167, + 66,169, 84,158, 53, 24, 12,115,142, 29, 59,182,164,164,233,138,141,141,109,170,209,104, 62,113, 58,157, 49, 46,205,211,217,217, +217, 95, 38, 36, 36,172,120,148, 52, 25, 12, 6,131,193, 12, 86, 30,243, 38,146, 72, 0,226,209,113,244, 22, 0, 68, 69, 69, 85, + 22, 4,161, 35, 33,228, 73, 66,200, 9, 0, 59,146,146,146, 18, 75,147,128, 71, 89,115,254, 36, 17, 70, 14, 26, 1,163,201,248, +210,222, 99, 7,191, 74, 74, 77, 85,100,153,130,178,130, 84, 89,193, 81, 17, 17,230, 54,141, 91,140,213,168, 52,139, 22,174,248, + 1,175, 78,227, 31,137, 3, 74, 8, 41,175, 84, 42,135,113, 28,215, 77, 16,132,141,102,179,249,103, 74,105,169, 94, 73,164,211, +233,194,251,246,237, 59,225,155,111,190,193,176, 97,195, 62,208,233,116, 95,234,245,122,191,158, 48,107,221,186,245, 27,106,181, +122,218,152, 49, 99,148, 49, 49,177, 68,165, 82,225,210,165,139,141,103,205,154,245, 93,187,118,237, 6,239,217,179,167, 23,165, +212,175,215,187,180,105,211,230, 93,149, 74, 53,101,236,216,177,242, 70,141, 26, 17,169, 84,138, 19, 39, 78, 52,253,230,155,111, +126,108,215,174,221,192, 61,123,246,244,167,126,182,129, 23,212, 84, 40, 20, 56,125,250,116,211, 89,179,102,149, 72,179,243, 71, + 39, 37,148, 82,177,235,216, 56,183, 78,109,232,240,117, 25,171,158, 24, 12, 6,227, 49, 52, 88,243, 38,146,169, 0, 38, 1, 32, +147, 71, 73, 55,252,184, 41,236, 70,141, 26, 53,200,136, 17, 35, 50,156, 78,167,201,225,112,132,255,252,243,207,227,116, 58, 29, + 5,176, 29,192, 30,189, 94,111,240,241,130,173,165,148,182,227, 56,174, 67,141, 26, 53,200,200,145, 35,239, 56, 28, 14,147,205, +102,139, 88,180,104,209, 91, 58,157, 78,240, 85,115,215,199, 42, 2,128,140, 90, 20,160, 49,217,208,150,227,184,142,165, 77,167, + 91, 19, 64,165,125,241, 7,126,185,120,253, 74,139,192,128, 26,182, 17, 3, 59, 75,165, 18,113,184,221,225,196,242, 77,123, 45, +203, 54,172, 94, 88,173, 82,149,129, 0, 94,219,245,177,234, 38, 0,218,126,178,137,254,211, 7,145, 16, 34,147,203,229,207, 72, +165,210, 87, 66, 67, 67,195,186,117,235,118,188,124,249,242,103, 82, 82, 82,234,108,222,188,121,123, 64, 64, 64,154,221,110, 95, + 96,181, 90,215, 80, 74, 75, 50,226,124,101,142,227,144,148,148, 4,137, 68, 34, 1, 80, 5,192, 41, 95,255,220,164, 73,147,134, + 50,153,108,250,188, 31,151, 42,156, 92, 0,238, 56, 5,220,201, 1,164,161,181, 48, 37,238, 43,205,204, 79,223,111,219,162, 69, +139,241, 0, 62,247, 39,202,164, 82,169,166,172, 92,185, 82, 17, 30, 30, 14, 65, 16, 96, 48, 24, 80,167, 78, 29,124,250,233,167, +170,184,184,184, 46,205,154, 53,123, 29,192,156,146,106, 82, 74, 97,183,219, 81,175, 94, 61,204,156, 57, 83, 53,101,202, 20,191, + 52, 59,125,112, 92,146,161,191,212, 66,112,216, 63, 0, 0, 78, 34,253,180,211,135,194,145,140,164, 75, 77,139, 93,246,129,112, +112,219,167,141,152,201, 98,252,163,232,116,186, 86, 85,170, 84, 89,115,227,198,141, 3,130, 32, 12,214,235,245,214, 50,168,159, + 42,184,234,140, 96, 87,189,122, 23, 64, 34,165,247,110,220, 75, 66, 72,205,142,189, 69, 82,229,203,160,244, 73, 16,128, 35,220, + 9,167,221,244,243,157,139, 59,254, 44,157,166,106, 24,168,240, 36, 8, 4,142,112, 39,157,118,211,194, 59, 23,119,108, 98, 37, +131, 81,102, 6,107,222, 68, 18, 12,224,189, 81,131, 95,225, 68, 34,142, 44, 88,190,160,247,230,117,243,191,170, 23,211,243, 46, + 0,227,198,141, 27,173, 61,122,244,176, 14, 31, 62,220,126,241,226, 69,238,171,175,190,122,114,199,142, 29,125,117, 58,221,110, +189, 94,191,184,176,141, 45,248, 80,117,147,119,154, 43, 78,120, 94,105,205,148,143,155, 53,124,196,171,217, 81, 81, 81, 78, 79, +205,145, 35, 71,218, 46, 94,188,200,125,249,229,151, 79,238,220,185,179,159, 78,167,219, 85,148, 38, 0,114, 40,131,236,238,208, +216, 33, 45, 95,235,197, 61,195, 70,140,201,174, 88,161,162, 19,132, 24, 74,154, 78,151,230, 14,171, 67,219, 84,161, 22, 20, 67, +159,126, 14,106,165, 92,225,254, 81, 42, 17,227,133,167, 59, 68,228,154, 91,224,151,117,219,235,231,154, 21,167, 14, 25,144,208, +188, 28,237,136,191, 95,183,242,143,160,213,106,191, 82,169, 84,125, 26, 55,110,124,118,236,216,177, 59,159,126,250,233, 52, 0, +248,249,231,159, 43,126,254,249,231, 39, 0,236, 91,183,110, 93,248, 87, 95,125,245,252,177, 99,199, 62, 87,171,213,107,115,115, +115,199,250, 88,217,114, 0, 38,119,233,210,229,131,161, 67,135, 66,171,213,226,165,151, 94,130,197, 98,137,215,233,116, 31, 1, +152,174,215,235,139,221, 95,149, 74, 53,101,244,232,209,114, 65, 18,136, 15, 22, 95,193, 93,227, 61,143,167,146,114,120,237, 41, + 57, 6, 13, 26,164,250,236,179,207, 62,244,199, 96,105, 52,154, 79,198,142, 29, 43, 15, 15,191,247,174, 95,163,209, 8,163,209, + 8,131,193, 0,171,213,138,167,159,126, 90, 53,111,222,188, 79,252, 49, 88,158,154, 23, 47, 94,132,205,102,131,217,108,134,197, + 98,129, 86,171, 69,223,190,125, 85,115,230,204,241, 89,147,130, 72,120,187,227,187,241,255, 27, 28, 6, 0, 51,231,174,248, 14, + 32,205,124, 89, 70, 65,154, 0, 96, 6,171,232, 11,183, 8, 64, 95,177, 88,220,175, 70,141, 26,141, 47, 95,190,124,220,233,116, +254, 14,224,119, 74,169,163,148,218, 79, 69, 70, 70,126,150,156,156,252, 45,165,116,201,127, 37, 79,171, 87,175,254,199,210,165, + 75, 67, 55,108,216,240,244,212,169, 83, 7, 1, 88, 92,138, 60,148, 0,104,225, 50, 85,231, 93,198, 10, 46,163, 85,155, 16, 82, + 13,192,126,127,110,250,130,171,183,213,136,164,234,101,173,219,119,105, 61,160,127, 95,109, 88, 72, 32,114, 45, 60, 46,221, 72, +169,244,215,134, 63,218, 69,212,239,121,192,110, 49, 14,201,188,178,199,232,143, 38, 39, 85, 47,235,216,165,119,235,167, 58,117, +210, 6, 6, 6,226,142,193,129,171,137, 73,209,123,182,174,105, 19, 81,191,231, 30,187,197,248,124,230,149, 61, 38,118,214, 49, +252,129, 43,238, 18,225,254, 18, 18,172,201, 0,144, 12,192, 24, 24, 24,104, 3, 96, 2,112,183, 86,173, 90, 89,115,231,206, 77, + 90,179,102,205, 54, 66, 72,151,124,255, 46,240,132,129,192,219, 34, 95,125,110, 12,228, 82, 65,250,222,187,111,221,137,138,138, + 74, 45, 76,115,222,188,121, 73,107,214,172,217, 90,156, 38, 0, 4,105, 44,173,250,180, 11,108, 88,129,204,125,243,204,142, 81, +205,210,147,142,153,168,192,155, 2, 3, 3, 74,148, 78,151,102,219, 22, 13,203, 73, 57, 33, 25,250, 76, 51, 4, 34,207,247,187, + 64,228,208,103,154,161, 81, 24,116,245,107, 70,170,130, 52,150,182,197,105,150, 22,111,154, 54,155,173, 95, 72, 72, 72,214,157, + 59,119, 52, 54,155,141, 24,204, 78,201,133,219,166,192, 91,214,200,200, 11,183, 77,129, 6,179, 83, 98,179,217, 72, 74, 74,138, + 70,169, 84,102,217,108,182,126,126,164,243,147,105,211,166,125,244,211, 79, 63,113,141, 27, 55,134, 86,171, 69,139, 22, 45,176, +100,201, 18,241,228,201,147,167,185, 34,156,197,166, 83, 16,132,102, 49, 49, 49, 68,160, 20,153, 6, 7,118, 78,139,197,254, 25, + 77, 96,178,241,200,206, 49, 2,132, 64, 44, 22,147, 39,159,124,178,186,175,251,238,116, 58, 99, 26, 53,106, 68, 0,192, 96, 48, +220, 51, 87, 70, 35, 12,134,123,159, 50,153, 12,148, 82, 89,195,134, 13,117, 37,209,180,217,108,168, 92,185, 50,162,163,163, 97, + 48, 24,144,147,147, 3,169, 84,234,151, 38, 33, 32, 4, 52, 66, 33,151,149, 83,200,101,229, 8,104, 4, 0,248,178,140, 16,144, +127,186, 44, 21,184, 56,134,113, 28,247, 83,245,234,213,207,113, 28,183,152, 16, 82,190, 52,154,132,144, 38,132,144,105, 42,149, +106,219, 19, 79, 60,113, 75,173, 86,239, 32,132, 76, 39,132,180, 40,137, 38, 33, 68,166, 82,169,118, 76,155, 54,109,229,137, 19, + 39, 6,109,223,190,189,202,169, 83,167,250,207,152, 49, 99,153, 70,163,217, 67, 8, 81,150,116,223, 1,160, 74,149, 42, 63, 30, + 57,114,164, 73,203,150, 45,127, 32,164,192,201, 95, 66, 77, 66,136,136, 16,210,136,184, 95,118, 88, 6,154,101,121,220,117, 58, + 93,245, 39,159,124,178, 28,199,113,104,211,166, 13, 0,180, 41,165,102, 75, 0, 41,148,210,221,148,210,116, 74, 41,239,154, 50, + 40,165,123, 1,220, 44,108, 27,133,105,138,164,234,101,111,190, 53,190,219,219, 99, 70,106, 19,110,240, 88,248, 87, 50, 86,236, + 79, 71,146, 65,142,206,125,135, 5,182,239, 49,180,139, 76,169, 93,230,175,230,196,137,147,186,141, 28, 54, 84,123, 90,207, 97, +229,254, 59,216,119,222, 0, 51, 9, 70,187, 62,175, 4,215,105,218,189,167, 76,169, 93,244, 40, 28,163,199, 93,243, 63, 17,193, + 26, 29, 71, 51,231, 77, 36,159,127,191,108,193, 7,132, 16,170, 14,169,191,205, 41,170,124, 70, 16, 4, 49,199,113, 65,161,161, +161, 14,215, 69, 40,107,227,198,141,206, 99,199,142,133,214,168, 81, 35,212,159,232,205,201, 19,199,205,145, 21,106,164, 68, 69, + 69,149,137,102,231,150, 29,100,102,171, 25, 39, 47,156,110,191,126, 97,219,182,193,225,117, 78,132,213, 28,249, 23,104, 11,147, +205,238,200, 44,137,102,167, 22,237, 69,102,171, 25,167, 46,158,193,161,195, 27, 80,175,110, 75, 84,174,252, 36, 18, 19, 79,224, +204,217, 3,168, 86,185, 26,250,116,234, 5,165, 92,201, 45,184,117,141, 62,140, 3, 40, 18,137,204, 43, 87,174,156,183,117,235, + 86,221, 71, 31,127,218,237,211, 31,247, 69, 4,214, 27, 28,108, 23, 2,181, 59,190, 62,105,184,115,242,215,204,236,139,155, 83, + 99, 27,213,223, 90,191,126,125,253,204,153, 51,223,246, 33,114,165, 0, 80,187,103,207,158, 19, 94,124,241, 69, 36, 38, 38, 98, +252,248,241,230,227,199,143,223,105,220,184,113,232,204,153, 51,149,163, 70,141,194,193,131, 7,167,232,116,186, 63, 0,220, 40, +234,253,124, 78,167, 83,174, 80, 40, 96,118,197, 20,236, 78, 10,224, 94,119, 43, 99,174, 17,132,102, 65, 34,145,128,227,184, 90, +177,177,177, 87,227,227,227,139,205, 75,167,211,169, 80, 40, 20,200,205,205,133,209,104,196,237, 52, 3,110,164,230,194,104,178, +194,108,114,194,108,230, 33, 86,134, 66,108, 79,174, 27, 27, 27,155,236,143, 38,207,243, 48,155,205,200,205,205,133,217,108,134, +217,108,134, 32, 8,200,201,201,129, 68, 34,161, 18,137,164, 14, 0,125,177, 23, 84,192, 73, 69,162,105,243, 22,175,155, 2, 0, + 84, 36,154, 6, 10,193,151,101, 4,112, 62,172, 74,129, 16, 34, 15, 11, 11,219,185,114,229,202, 39,106,212,168,129,235,215,175, +215, 25, 48, 96, 64, 51, 66, 72, 35, 74,169,201, 79, 45, 21,199,113,159, 15, 27, 54,236,127, 67,134, 12, 33, 53,107,214,132, 88, + 44,134,211,233,172,112,229,202,149, 14, 43, 86,172,120, 79, 44, 22, 47,228,121,254,109, 95, 71,142, 39,132,112, 50,153,108,249, +247,223,127,223,182, 89,179,102, 88,188,120, 49, 14, 31, 62, 44, 52,109,218,148,123,225,133, 23, 16, 29, 29,221,252,197, 23, 95, + 92, 77, 8,233,229,122,209,178,191,251, 31, 61,116,232,208,138, 34,145, 8, 45, 91,182,148, 30, 56,112, 32, 6,192,129, 82,230, +169, 38, 42, 42,106,119,135, 14, 29, 26,109,219,182, 45,129, 16,210,222,159,145,242,117, 58, 93,159,240,240,240, 25, 1, 1, 1, +193,190,254,199,104, 52,154, 82, 82, 82,222,209,235,245,171,124,252, 75,203, 6, 13, 26,128,231,121, 4, 6, 6,162,124,249,242, +173,117, 58,221,219, 65, 65, 65,125,179,178,178,222,210,235,245, 71,252,216,223, 40, 0, 28,165,244,178,107,190, 50,128,218,174, +159, 47, 2,184, 78, 41,189, 70, 8,209, 17, 66, 42,250,210, 92, 24, 82,179, 99,239, 54, 29,186,181,110,211,172, 1, 23,183, 42, + 17,188, 32, 64, 12, 30, 98,145,128, 12, 94, 2,142, 16, 84,172,213, 88, 28,113,250, 72,243,114,181, 58,246,206,240,161,185, 48, +164,102,199,222, 61,122,245,105, 83,167, 86, 77,110,214, 31, 55,145,153,116,154, 79,189,176, 35,131, 35, 28,170, 62,217,169, 92, +116,237, 88, 81,141, 70, 79, 73, 82, 19,207,116, 8,169,209,190,211,221,203,187,182, 49,219,192,240,219, 96, 17, 66, 40,165,148, +120,152,172,143, 26, 60, 81,190,238,242,165, 63, 39, 25,108, 65, 39, 83, 82, 82,202,165,164,164, 32, 40, 40, 40,139, 82,234,152, + 53,107,150,228,226,197,139, 65, 10,133, 2,114,185, 28, 54,155,205, 47,131,193, 11, 60, 41,107, 77,141, 74,131,214,177, 45, 37, + 77,234,199,226,236,229,179,141,143,239,121,179,193,145, 83,198,161, 23, 46, 94, 46,149,102,171,152, 22,104, 92, 47, 6,231,174, +156,195,239,107,191, 68, 76,221, 39, 49,164,247, 32,200,164,178,123,251,194, 63,252, 14,238,157, 59,119,214, 87,143,233,178,238, +187,157,252,164, 47, 95,111,172,166,188,147,130, 19,107,198,124, 35,144,150,245, 43,126, 31, 44,201,206,228,184,226, 71,229,136, +142,142,254,172, 99,199,142,227, 37, 18,137,100,228,200,145, 0,128,177, 99,199,230,196,199,199,215,212,235,245,105, 58,157, 78, +247,246,219,111, 95, 90,181,106,149,106,248,240,225, 98,179,217,124, 94, 42,149, 82,157, 78, 55, 85,175,215, 79,241,166, 41,147, +201, 78,158, 59,119,174,109,128,174, 62,194, 2, 68,232,246, 97,194,189,188,149, 1,153,233,169,184,118,251, 36,162,163,163,149, + 0,214,164,167,167,211,230,205,155, 79,115, 56, 28, 83,227,227,227, 11,205, 88,165, 82,121,250,196,137, 19, 77,159,120,226,137, +123, 6, 43,195,132,159, 15, 18,152,237, 74, 80,170,132,136,106,161, 14,169, 32,151,194,252,135,201,100,226, 90,180,104,241,137, +221,110,255,188, 56,205,179,103,207, 54,173, 95,191, 62, 28, 14, 7,226,227,227, 97, 50,153, 96,179,217,144,149,149,133,107,215, +174,161, 90,181,106, 10, 65, 16, 54,247,232,209,131,191,123,247,238,251, 78,167,115, 86, 97,230,141, 88, 69,246,136, 74, 79,204, +205,205,210,175, 0,128,255,179,119,222,113, 81, 28,255, 27,127,102,175, 23,138,128,180, 3,197,130,138, 34, 54, 4,236, 37,246, +110, 76,108,209, 68, 99, 18,123, 98, 52,177, 39,106, 98,239, 37,213,216,107, 44,177,247,222, 43,118, 20, 21, 41, 2, 71,239, 92, +191,219,157,223, 31,128, 95, 98, 84, 14, 52,229,151,204,155,215,189,184,219,219,125,110,118,103,118,230,217,207,204,206,122, 86, +172,149,201,153,140,102,123,150, 17,147,200,242, 55, 22,167,193,147, 39, 79,174,229,234,234,138, 97,195,134, 97,198,140, 25,152, + 54,109, 90,181, 97,195,134,125, 2, 96, 73, 41, 26, 89,165,151,151,215,181,101,203,150,213,108,218,180, 41, 14, 30, 60,136, 45, + 91,182, 32, 58, 58,218, 86,185,114,101,113, 88, 88, 24,166, 77,155,134, 14, 29, 58,124, 60,122,244,232,150,132,144, 6,118,154, +142, 15,167, 77,155,214,163, 89,179,102, 24, 52,104,144,233,244,233,211,125, 0, 28, 61,126,252,248, 91,103,206,156,217,177,105, +211, 38,229,172, 89,179, 58,142, 29, 59,118, 56,128,239,202,176,255, 61, 91,180, 40, 8, 72, 55,107,214, 12,243,231,207,239,240, + 58, 6,139, 16, 34,115,115,115, 59,176, 97,195,134,250, 53,106,212,192,192,129, 3, 27,244,233,211,231, 0, 33,164, 29,165,212, +108,143,134,167,167,231,188, 95,126,249,197, 95,169, 84,218,253,187,102,179,217,117,232,208,161,115, 1,216,109,176,130,130,130, +112,234,212, 41,180,109,219, 22,181,107,215,246, 31, 58,116,232,194,142, 29, 59, 98,204,152, 49,231, 53, 26,141, 70,171,213,166, +219,169,229, 7, 32,178,112,255, 43, 2,168, 6,224, 66,225,119, 97,133,255, 99, 10,205, 86, 0,128, 18, 13,150, 72,166, 26,220, +173, 91, 55,199,223, 46,166,130, 23, 4,212,244, 81,160, 86, 69, 39,196,166, 26, 17,155,152, 1, 49, 44,112, 82,202, 81,167, 73, + 87,151,204,148,184,193, 0, 74, 52, 88, 34,169,114,112,207,238, 93, 29,118, 94, 74, 69,142,246, 30,141,187,182,253,164,205,172, +255, 24, 0, 34,206,110,254,201,211, 69,217,174,122,189, 96,145,190,121,119,151,211,123,146, 6, 3, 96, 6,235,207,187,176,251, +157, 7,249,215, 70,176,138,200,202, 19, 27,157, 61,234,228,230,197,255,175,236,103,103,103,151,139,138,138, 74,185,115,231, 78, + 57,153, 76, 6, 65, 16,138, 76,134, 80,214, 68,188,105, 77,153, 84,134,186, 1,117, 69,215,239,134, 75,239,220,185,235, 34,149, +201,133, 55,161, 89,167, 70, 29, 92,187,115, 29,117,106,212,129, 72, 36,250,199,101,230,253, 36, 84,180, 10,156,131, 66, 42,126, +150,181,148, 72, 29,178,137,119, 69, 23,228,100,217,113,149, 44,105,223,190,253,151,171, 87,175,150, 36, 37, 37,161, 92,185,114, + 69, 70, 35, 65,171,213,166, 2,128, 86,171,213,250,250,250,106,121,158,175, 86,179,102, 77, 12, 29, 58, 20, 1, 1, 1,100,220, +184,113, 19, 10, 77,214, 31,142,111, 94, 94,222,210, 69,139, 22, 5,207,152,189, 88, 53, 32, 12,200,207, 55, 67,167,211, 33, 49, +238, 17, 20,130,128,113,179,102, 65, 81, 48,196, 77,148,145,153,129,249,243,230, 77,189,121,243,102,251, 98, 21,241, 31,200,201, +201, 89,178,116,233,210,213,243,231,207, 87, 25, 12, 6,232,245, 6,228, 25,229,184,178, 56,180,160, 6, 31,123, 21,115,231,205, + 67,144,159, 90,153,152,152,136,105,211,166, 77,138,142,142,110, 10,160,211,171, 52, 23, 46, 92,184,122,241,226,197, 42, 7, 7, + 7, 8,130, 0, 65, 16,240,244,233, 83, 0,192,183, 51,103, 66,169, 80, 2,128, 40, 41, 57, 73, 52,123,214,172,121,247,239,223, +111, 11,160,253,139,244,142, 46, 8,162, 0, 76, 29,102,200,146, 34, 86,117,244,151,203, 36,211,141, 70,227,121,173, 86,187,161, +195, 12, 89, 18, 0, 28,153, 86,147,106, 52,154, 1, 50,153,172,153,197,202, 47, 13,252,232,240,195, 35,211,106,210,191,179, 28, +185,187,187,143,238,209,163, 7,230,206,157,139,125,251,246,141,117,117,117, 93, 60, 99,198, 12,104, 52,154, 81,132,144,165,165, +184,139,114,193,146, 37, 75,106,214,172, 89, 19, 31,124,240,129,249,248,241,227,147, 1,236, 6, 16,119,238,220,185,138,235,214, +173,235,246,235,175,191,206, 93,182,108,153, 98,197,138, 21,254,189,122,245, 90, 10, 96,136, 29,102,227,243,254,253,251, 99,225, +194,133, 56,125,250,244, 59,148,210,131,133, 95, 29, 34,132,116,155, 61,123,246,137,169, 83,167, 98,201,146, 37, 99, 74,107,176, + 8, 33, 14,181,106,213,250,170, 99,199,142, 56,119,238, 28,154, 55,111,142,198,141, 27,143, 37,132, 44,167,148,166,151,161,209, +224, 28, 28, 28,126, 93,187,118,109,243, 74,149, 42, 97,230,204,153,248,242,203, 47,177,122,245,234,230, 3, 7, 14,252,149, 16, +210,203,158,187,103,157,156,156, 28,148, 74, 37,230,206,157, 75,159, 62,125,106,207,185,236, 50,117,234, 84,226,236,236,236,108, +199,186, 34, 0,206, 94, 94, 94, 45,188,188,188,176,108,217, 50,120,120,120,224,243,207, 63, 71,249,242,229,161,211,233,208,171, + 87, 47,201,229,203,151,251, 1, 88,110,231,174,187, 1, 40,138,120,213, 66,193, 88,171,188,194, 99,114, 25, 64,179, 66,131,149, + 9,192,213, 46, 69, 74,131, 92,202, 57, 65,123, 39, 5, 98,216, 80,179,162, 35,174, 71,233, 96,225, 41, 84,106, 7,232,242,179, + 81,175,154, 59,242,244,190,160,148,218, 53,251,184, 68,204, 5,203,228, 74,164,229,230, 32,233,254,241, 12,155, 89, 63, 52, 43, +234,108, 60, 0,184,248,183, 24,122,247,242,225,235,189, 58, 53,247, 72,203,170, 8, 80, 26,202,108, 16,163, 52,148,106,162, 81, +158,231, 73, 86, 86,150, 88,175,215,139,120,158,231,138,187, 77,171,213, 90, 38,227,242,103,104, 62,175,255,166, 53,255,169, 84, +117,135, 86,204,225,119, 93,117, 4,130,209,145,166,105,237,217, 94,171,213, 90,207,156, 57,179,126,210,164, 73, 88,178,100, 9, +158, 60,121, 2,137, 68,130,154, 53,107,122,107, 52, 26,135,194,202,216,185, 78,157, 58, 30, 34,145, 8, 81, 81, 81,216,188,121, + 51,166, 77,155, 70,175, 95,191,190,250, 69,230, 10, 0,194,195,195,247,152, 76,166,189,243,103,125,165, 55,166, 61,132, 74, 72, + 3,205,139,129,146,232, 48,232,227,209,120,146,202,227,102, 76, 62,110,198,228, 35, 41, 79,134, 17,159, 79,225,170, 84,169,210, + 48, 36, 36,100,232,203,210,122,227,198,141,109,122,189,254,232, 55,223,124,163,143,142,142,134,209, 80,176,219, 22,155, 0,139, +237,247,201,240,241,241,193,220,185,115,213, 14, 14, 14,205, 27, 54,108,248,254,171, 52,117, 58,221,209,175,190,250, 74, 31, 21, + 21,133,220,220, 92,164,164,164,128, 16,130, 33,195,199, 33,186, 88, 58, 51,204, 14,248,108,252, 52,174, 98,197,138,111,133,132, +132,244,126,213,113,189,183,178,173,127,173,154, 53,182, 95,185,114,101, 80,181,106,213, 70, 20, 25,171, 34, 35, 85,169, 82,165, + 97,215,175, 95,255,176,110,157,218,219,239,173,108, 27,240, 55, 95, 69,182,238,211,167, 79,128, 32, 8,216,177, 99,199, 29, 74, +233,146, 93,187,118, 93, 51,153, 76,232,215,175, 95,101, 0, 29,237,212, 9,121,239,189,247, 70, 52,111,222, 28, 99,198,140,177, + 28, 63,126, 60,152, 82,186,152, 82, 26, 75, 11,136,163,148, 46, 63,115,230, 76,189, 81,163, 70,153, 66, 67, 67, 49,120,240,224, + 15, 9, 33,205, 75,208,109,210,191,127,255,154,130, 32, 96,235,214,173,183,139,153,171,194, 54,152,158,220,190,125,251,101,179, +217,140, 1, 3, 6, 84, 33,132,188, 85,138,125,151, 42, 20,138,237,223,126,251,109,185,196,196, 68,124,240,193, 7,166,200,200, + 72, 76,159, 62, 93,233,236,236,124,144, 16,226, 80,234, 11, 51,153,108,229,143, 63,254,216,163, 78,157, 58, 24, 62,124,184,249, +135, 31,126,248,116,196,136, 17,230,224,224, 96,124,255,253,247, 61,164, 82,105,169,102,170, 78, 73, 73,201, 62,125,250,180, 91, + 73,175,164,164, 36,187,166,102,209,104, 52,229, 92, 93, 93,239,132,133,133,165,215,173, 91,183, 42, 0,220,187,119, 47,109,251, +246,237,180,124,249,242, 56,124,248, 48, 86,174, 92,137, 38, 77,154,192,193,193,161, 95, 41,146, 74,241,191,161, 24,244, 37,223, + 63,191, 94,137, 17,142, 28,189, 13, 98,142,131, 68, 68, 17,151, 98,132,133,167,144, 74, 56, 72, 68,128,152,163,112,115,148, 64, + 34, 17,129, 16, 59, 53, 65,144,173,179, 66, 34, 34,144, 72,100, 4, 64,241, 16,161, 82,161, 80, 16, 15,103, 41,164, 98, 2, 6, +227,141, 70,176,138, 60, 74, 70, 70,134, 36, 46, 46, 78, 97, 50,153, 56, 63, 63, 63, 35, 33,132,218,108, 54, 46, 35, 35, 67, 42, +147,201, 80,190,124,121, 11,207,243,165,186,234,206,202,202,150,196, 39, 62,121,163,154, 47,194,198,219,184,140,140, 12,217,155, +212,252, 39, 18, 25, 25,233,248, 40, 70,235,224, 46,174,117,245,211,239,194,155, 8, 20, 18, 2,106,149,235, 31, 95,200,200,184, + 37,225,202, 41, 85,222,222,222, 37,142,159,137,137,137,249, 88,163,209,204, 4, 16,200,243,252,254, 37, 75,150,144,229,203,151, +187,140, 24, 49, 34, 74,163,209, 36, 6, 4, 4,248, 45, 94,188,216, 9, 0, 54,110,220, 40, 28, 61,122,180, 61,128,251, 90,173, + 54,249, 85,186,103,206,156,121, 47, 52, 52,116,232,143, 63,254, 56,199,102,179, 41, 60, 60, 60,100,235,215,175, 39,137, 57, 22, +124,181, 49, 10, 89,249, 5, 3,180,148, 50, 17,198,116,112, 64,171, 86,173,184,184,184,184, 73, 0,126,126,153,230,217,179,103, +223, 9, 11, 11, 27,245,253,247,223,127, 11, 7, 63,133, 60,224, 67,233, 91,147, 10,186, 31,189, 93,228,224,200,179,200, 20,178, +179,179,209,179,103, 79,213,166, 77,155, 70, 3,216, 80,146,230,138, 21, 43,190,229,121, 94,230,238,238, 46,223,188,121, 51, 98, + 51,204,152,184, 46, 10,249,198,130,161, 81,106,185, 8,163,219, 42,209,186,117,107, 81, 98, 98,226, 84, 0,219, 95,210,128, 85, + 11, 12, 12,220,190,121,243,230, 90, 75,151, 46,205,124,252,248,177, 78,163,209,204,120,110, 53,211,220,185,115, 51,214,175, 95, + 95,227,131, 15, 62,216,174,209,104,250,104,181,218,251,127, 71, 57,114,114,114,154, 59,116,232, 80,252,250,235,175,200,204,204, + 92, 10, 0,185,185,185, 75, 54,111,222,188,245,227,143, 63,198,134, 13, 27,230, 18, 66, 14,219, 17,197,234,212,175, 95, 63, 28, + 58,116, 8, 39, 78,156,248,138, 82, 26,241,226,160, 4,125, 68, 8,153,176,103,207,158,101,253,251,247,199,154, 53,107, 58, 2, + 56,247, 10,221,118, 29, 58,116,192,193,131, 7,145,145,145,241,253, 75, 34,145, 63,236,221,187,183, 81,135, 14, 29, 48,103,206, +156,118, 0, 78,218,209,120,215,116,118,118, 94,187,108,217,178,144, 58,117,234,224,189,247,222, 51,154,205,230,142, 95,126,249, +229,190, 45, 91,182, 56,174, 95,191,190,225, 39,159,124,114,133, 16,242, 17,165,244,178, 61,199, 82, 36, 18,205, 94,177, 98,197, +144, 86,173, 90, 97,236,216,177,182, 35, 71,142,116,167,148, 30, 37,132, 68,141, 31, 63,254,192,162, 69,139, 68,139, 22, 45, 26, + 34, 18,137,210,120,158,159,252,183, 52, 0, 98,241,194, 69,139, 22,213, 10, 12, 12,132,209,104, 68, 84, 84, 20, 82, 83, 83, 55, + 31, 57,114,228,232,221,187,119,231, 39, 37, 37,237,244,244,244,252,120,236,216,177,190,161,161,161, 33, 26,141,198, 69,171,213, +102,217, 33, 93, 20,153, 74, 5,112, 31, 64,163,194,200, 21, 10, 35,211, 15, 11,223,187, 0,176, 71, 15,132,144, 59,143, 98, 18, +171,184,168,157,144, 37,200, 16,147,152, 14,165, 90, 13,142,114,176, 25,178, 80,205,207, 3, 2, 5,114,211, 19, 65, 8,177,107, + 26, 25,155, 32,132,199,196,167,248,148, 83, 43, 80,173, 97,103,183,219, 39,215,108,116,241,111,241, 9, 0,145, 92,161,254,185, +255,123,239,151,183,242, 20,249, 89, 73,224, 56,238, 42, 24,140, 55,101,176,120,158,231,214,173, 91,231,156,150,150,198, 5, 4, + 4,100, 4, 5, 5,233,164, 82,169, 96, 52, 26, 5,153, 76,102, 83,169, 84,130,193, 96,144,197,198,198,186, 38, 37, 37,137,120, +158,183,215,230,147, 51,103,206,121, 87, 15,168,155,242, 6, 53, 95,124, 5, 41,149,241, 74,165,154,127,147,154,255, 36, 4, 65, +144,205,158, 61,187, 73,185,114,229,116, 97, 97, 97, 9,205,253,221,119, 39,228, 10,103, 23,174, 88,253, 97,253, 0,191, 53,106, + 81, 70,150, 94, 74,165,177,177,177,222,145,145,145,106, 74,169,212,142, 72,214, 83, 0, 79, 53, 26,205, 15,173, 91,183, 30,217, +181,107, 87,156, 62,125,218, 67,167,211,121,168,213,106, 0,192,206,157, 59,177,103,207,158, 69, 90,173,246,132,189,105,189,122, +245,234,207, 0,126,110,208,160, 65,136,179,179,243,101, 39, 39, 39, 18,159,163, 67, 86,158, 21, 39,231, 4, 67, 42,230,208,236, +203,107,200,200,204,130,152, 16, 40, 20, 10,223,224,224, 96, 46, 60, 60, 92,120, 73,227, 76, 81, 48,101,194,138, 70,157, 62,122, + 71,249,244,215,141, 11, 23, 45,146, 3,128,136, 16,120, 56, 75,145,157,157,141,244,244,116,164,165,165, 65, 44, 22,195,104, 52, + 6,190,242,178,187,152,102,131, 6, 13,218,186,185,185, 29, 86,169, 84, 34, 33, 93,135,172,124,235,239,186, 32,179,178,179, 33, +149, 74,161, 82,169,170,191,196, 92, 57, 2, 88,183,122,245,234,154,142,142,142,162, 79, 62,249,164,220, 39,159,124,210, 12, 5, +221, 35,127, 64,173, 86,139, 86,175, 94, 93,189,126,253,250,107, 53, 26, 77, 59,173, 86,155,243, 23, 70,174, 68, 0,134,125,241, +197, 23, 13, 21, 10, 5, 86,172, 88, 17, 13, 96, 83,225,215,219,127,252,241,199,175,251,247,239, 31,240,233,167,159,214,158, 58, +117,234,216,194,174,194,151,142,103,147, 72, 36,193,181,106,213,194,174, 93,187, 0, 96, 87, 9, 63,191,227,226,197,139,203,186, +118,237, 10,165, 82, 25, 82,194,186,149, 43, 84,168,128, 61,123,246, 0,192,205,151,172,115, 51, 50, 50, 18,189,122,245, 2, 33, +164,178, 29,251,222,163, 67,135, 14, 59,102,207,158, 45,118,116,116,196,144, 33, 67,204, 87,174, 92,233, 76, 41, 61, 75, 8,105, + 61, 96,192,128, 51,155, 54,109, 82,159, 57,115,166,230,172, 89,179, 46,138, 68,162,217, 60,207, 79, 45, 65,243,195,153, 51,103, + 78,234,217,179, 39,102,204,152, 65,183,109,219,246, 30,165,244,104, 97, 25, 59, 66, 8,121,223,213,213,117,211,228,201,147, 73, + 78, 78,206, 36, 66, 72, 2,165,244,199,151,233,233,245,250, 28, 65, 16,188, 12, 6,131, 93, 99,182,236, 93,223,223,223,191, 83, + 96, 96, 32,246,236,217,131,110,221,186,225,248,241,227, 0,112, 64,171,213,158, 2,112,180, 40,106,253,248,241,227,177,205,155, + 55,231, 78,156, 56,209, 11,192, 47,118, 36, 33, 6, 64, 29, 0,199, 40,165,241,133, 55, 78, 54, 65,193,148, 13,247, 41,165, 79, + 11,215, 11, 2, 16,101,151, 25, 50,235,214,159, 60,184,163,117,219,119, 70, 56,139,196, 28,196, 84, 10, 67,126, 46,192, 11,168, +230,231,137,208, 90,158,184, 29,107,192,165,227, 59,178, 13,250,252,245,246,105,234,215,158, 56,188,167,101, 72,251, 15,156,101, +254,129,168,224, 53,166,126,196,149,163,199, 20,114, 25,121,187,215,187,229, 90,135, 86,195,137, 59,185,184,124,114, 87,150, 94, +151,187,150, 89, 6, 70,153, 12,214,139, 6,151, 81, 74,211, 78,156, 56,161,154, 58,117,106,158,183,183,183, 88,167,211,113, 54, +219,255,250, 95, 20, 10, 5,188,189,189,109,217,217,217,230, 19, 39, 78, 84,165,148,102,188,234,199, 56,145, 44,233,167,205, 43, + 42, 8, 68,101,238,220,165,187,160,241,241,123,109, 77, 0,208,155,164,105,219, 15,239,118,105, 21,218, 84,226, 89,222,243, 15, +223,255, 25,154,207, 66,246,233, 41, 56,125,245,130, 85,111,146,102, 65,254,215,103, 32,165, 84,251,248,241, 99,247, 89,179,102, +221,212,104, 52, 70, 0,112, 81,211,164,236,136, 93,153,170,202,221,146,164, 50, 25, 84,238,238, 38, 71, 71, 71,235,129, 3, 7, +218, 83, 74,181,165,144, 31, 59,108,216, 48,238,220,185,115,195, 6, 14, 28, 72, 42, 85,170,132,155, 55,111, 98,227,198,141,116, +251,246,237,203,240,146,105, 26,236,104,208,162, 77,166,223,207, 95, 88,116,103, 33, 45,136,110,130,228,167,131,231,121,235,203, +204,213,243, 88,211,110, 95, 50, 42,149,168, 93, 81, 93, 44, 74,154,133,180, 66,115,149,158,158,142,212,212, 84,136, 68, 34, 67, + 41,210, 25, 99,177, 88,158, 75,231,255,146,147,157,157, 13, 33, 39, 13, 60,207, 91, 94, 98, 84,243, 52, 26,205,138,229,203,151, + 47,250,230,155,111, 60, 22, 47, 94,156,249,224,193,131, 92, 66,136,241,185, 60, 84,248,251,251, 59, 46, 92,184,208,115,197,138, + 21,153, 0, 86,252,197,230,170,103,157, 58,117,214,117,234,212,201,113,196,136, 17, 88,190,124, 57,146,147,147, 39, 82, 74,109, +133,233, 19, 8, 33,227,191,255,254,251,253, 19, 38, 76,128,197, 98, 89,120,240,224,193, 25,132,144, 97,148,210, 77, 47,210,244, +240,240,240, 21,139,197,184,113,227, 70, 46,165,244, 73, 9,101, 56,185, 70,141, 26, 41,132, 16, 79, 47, 47,175,170,175, 90,215, +205,205,205,223,209,209, 17,137,137,137, 69,141,248,139,136,213,106,181, 84, 38,147, 17,141, 70, 83,173,164,253,119,117,117, 29, +255,203, 47,191,136, 79,157, 58,133,105,211,166, 37,196,197,197, 13, 40,156, 70, 0,148,210, 27,132,144,230,173, 91,183,222, 50, + 97,194,132, 26,243,230,205, 35, 15, 30, 60, 24, 14,224,149, 6,203,207,207,111,216,135, 31,126,136, 21, 43, 86,224,231,159,127, + 30, 78, 41,221,254,220, 62,111, 33,132,184,184,186,186,174, 24, 58,116, 40,214,174, 93, 59, 0,192, 75, 13, 86, 98, 98,226,132, +190,125,251,126,157,153,153, 57,219,158, 60,181,103,125,141, 70,211,125,224,192,129,158,148, 82, 44, 95,190, 60,121,249,242,229, +250,188,188,188, 77,133,230,170, 56, 59,143, 28, 57, 50,118,196,136, 17, 56,125,250,244,119, 26,141,134,106,181,218, 85, 37,228, +105, 18, 33,164, 42, 33,164, 22,165,244,126,225, 93,130,241,207,149,187, 26,133,235, 38,216,179, 79, 25, 15, 79,238,243, 12,234, +124,225,214,213, 51,237,171,212,110, 38,241,112,117,132,111,141,242,112, 81, 75, 65, 1,220,141, 51,224,242,185,163,214,212,164, +184,139,233,145, 39,246,217,171,233, 21,212,229,162,186,124,165,246,149, 3,155,138, 43,251, 87, 71,187, 38,117, 93,220, 28, 37, + 48,219, 40,142,221,202,193,165, 51,135,172,105,201,241,167, 50, 31,177, 59, 8,255,228,182,236, 95,215, 15,251,202, 8, 86, 74, + 74,202, 24,145, 72,212,122,240,224,193, 3, 90,180,104,225, 52,116,232,208, 20, 7, 7,135,124,169, 84, 42,114,119,119,151,241, + 60, 47, 59,113,226,132,175, 86,171,117,161,148,110, 74, 77, 77, 61,245,220, 9,244,187,167,109,127,242,173,190, 34, 33,132,104, + 52,206,173,197, 91,134, 14,104,209,162,133,195,235,106, 2,160, 89, 73, 54,159,132, 52,221,140,172,156,131, 99,125,189,188, 68, +205, 27, 54,150, 56,168, 10,134, 75,184,187,151,151,218,120, 42,125,147,154, 0,144,147,151,131,115,215, 47, 89, 19,146,147,249, +199, 9,162,197, 42,155,109, 26,156,165,244, 21,154,111,162, 33,252,131,166,197, 98,105,250,248,241,227,247,222,123,239,189, 9, + 13, 27, 54,188, 55,117,234,212,139, 78, 78, 78,214,162,194,106, 50,153, 36, 71,143, 30,109, 18, 31, 31, 95,219,102,179,205, 3, +176,185, 36,205, 98, 6,193, 2, 96,132, 70,163,217,155,154,154,122,164, 95,191,126, 88,187,118, 45, 46, 94,188,216, 92,171,213, + 94, 40, 77, 58,139, 19, 30, 30,158,217,169, 83, 39,125,100,100,164,131, 72, 93, 1, 94, 46, 50,116,252,234, 6, 40, 0, 7, 25, +133, 46, 63, 7,182,172, 44,232,245,250,136, 82,104, 38, 53,107,214,204, 16, 29, 29, 45,175, 82,165, 74,129,185, 42, 52, 86,105, +105,105,200,204,204, 68, 94, 94, 30,149, 72, 36,215, 74,161, 25,221,177, 99, 71, 62, 38, 38, 70, 36, 18,123,192,195, 89,130,214, +147,194, 11,250, 53, 84, 64,126, 94, 46, 12,233,233,208,233,116, 87, 95,166,169,213,106,183,106, 52, 26, 0, 88,244,213, 87, 95, +149,239,220,185,243,227, 43, 87,174,180, 44,254, 59,193,193,193,187,103,204,152,209,101,214,172, 89,233,107,215,174,157,160,213, +106, 55,150,230,120,190,110, 89,114,115,115, 27,119,224,192, 1, 71,139,197,130,229,203,151, 99,241,226,197,171, 41,165, 59,159, +171,252, 14,136, 68,162,239, 57,142, 27, 57,106,212, 40, 12, 29, 58, 84,213,176, 97,195,177,197,162, 92,191,211, 76, 76, 76,156, + 26, 28, 28,252,117,106,106,170, 93,134,224,209,163, 71,159, 4, 7, 7, 79, 77, 77, 77,157,255,170,125, 87,171,213,106,158,231, + 17, 27, 27,155, 69, 41,205,121, 73, 69,109,172, 81,163, 70, 34,207,243,190, 42,149,202,181,164,242,153,153,153, 57,187, 97,195, +134,211, 83, 82, 82,142, 2,152, 73, 41,125,222, 0,223, 34,132,212,254,236,179,207, 70,207,157, 59,183, 87,114,114,242,214,146, + 52,227,226,226,102,183,110,221,250,171,135, 15, 31,174,163,148,254,252,146,116,126, 71, 8,177,108,220,184,113,120, 76, 76,204, +156, 87,105,106,181,218,253, 0,246,219,155,191, 47, 91,191,184,166,171,171,235,132,209,163, 71,227,240,225,195,200,203,203, 91, +166,213,106,231,189, 68,235,114,165, 74,149,246, 54,110,220,184,251,130, 5, 11,164, 93,186,116, 25, 14, 96,149, 29,229,243, 18, +128,166,133,227,224, 30, 0, 40,186,176,117, 69,193,157,131, 4,255,187,179,208,174, 58,196, 98,212,245,191,121,118,215,150,248, +168,219,141,131, 91,246,116,201,209,251, 66, 42,230,144,159,149,132, 75, 39,126,203, 74,138,127,114, 73,175,203,235, 95, 26, 77, +179, 49,191,223,173,115,187,183, 38,197, 70, 52,210, 55,237,236,146,157,231, 7,169,132, 32, 59, 45, 1, 87, 78,239,205, 76,138, +127,114, 78,151,159, 59,168, 44,117,221,155,170,231,255, 43,154,255, 54,136, 61, 55, 4,249,251,251, 75,204,102,115, 23,137, 68, +242,118,219,182,109, 83,194,194,194, 34,214,175, 95, 95, 43, 38, 38,198,147,231,249,221, 10,133,226, 64, 84, 84,148,181, 52, 25, +240, 38, 53, 79,207, 80, 1, 0,217,255, 88,162,150, 74,173, 43, 42,122, 89,251, 87,173, 88,153,139,126, 26, 69,182, 95,110,182, + 56, 58, 38,214,227, 13,106,138,170, 84,244,231,159, 60,141, 17,158, 38, 75,182, 88, 44,146,209, 93,171, 89,117, 40,120, 76,206, +223, 86,160, 9, 33, 82,177, 88, 60, 92, 34,145, 12,109,211,166,205,165, 75,151, 46, 53,116,113,113,185, 30, 23, 23,215, 88, 16, +132,159,121,158,255,241, 69, 51, 38,219,147, 78,141, 70, 83,190, 99,199,142,169, 83,166, 76, 33, 51,102,204,192,241,227,199,203, +189, 42,194, 98,143,102,104,104,232,160,218,181,107,175,158, 57,127, 57,247, 40, 46, 29,233, 25, 25,200,204,200, 68, 86,102, 6, + 36, 84,143,203,103,143,240, 79,159, 62,109, 22, 30, 30,126,217, 94,205,176,176,176, 15, 43, 87,174,188,116,225,194,133, 14,121, +121,121,207, 12, 86,102,102, 38, 12, 6, 3,118,236,216, 97, 52,155,205, 97,225,225,225,119, 75,161,249,121,253,250,245, 23,142, + 30, 55,133,139,209,230, 32, 59, 59, 7,217, 57,217,208,229,229, 65, 10, 61,206,157, 56,192,107,181,218,186,225,225,225, 17,175, +210,212,104, 52,125,155, 53,107,246,205,221,187,119, 79, 61,120,240, 96, 88,241,239,170, 85,171,246,125,189,122,245, 58, 95,184, +112,225,107,173, 86,187,225,175,174, 28, 9, 33, 29,125,125,125, 23,167,164,164, 68, 91,173,214,237,148,210, 13,175,216,174,159, + 88, 44,238, 87,190,124,121,207,228,228,228,185,148,210, 93,127,101,153, 39,132,116,245,240,240,152,156,154,154, 58,151, 82,186, +247, 21,219, 21,173, 55,159, 82,186,155, 53, 96,127,212,212,104, 52, 93, 61, 60, 60,190, 41,188,224, 28,175,213,106,249, 87,212, + 1, 10, 0,223,120,122,122, 54, 73, 73, 73, 89,164,213,106,127,179, 55,157,133,143,202,169,132,130,241, 86, 64,193,152,171,184, + 87,205,125, 85,146,102,249, 26,111,117,147, 43, 29, 6, 83, 42,212, 35, 0, 56,145,232,150, 65,159,191,246, 85,145, 43,123, 52, + 21, 42,199, 15,169,192,215, 3,129, 32,226, 68,183, 13,250,252, 95,210, 34, 79, 28, 98,102,232,175, 55, 88,132,144, 79, 40,165, + 43,241,255, 24, 82,154,103,225,186,186,186, 42,213,106,245,187,132,144, 70, 86,171,245,178,201,100,218,145,153,153,105,120,157, + 12,120,147,154, 69,166,104, 71, 4,239, 85,222, 69,180, 70,173, 68,221, 21, 59,157, 39,234, 13,166,237,111, 80,179,173,206,128, +227,233, 89,252,135,239, 6,138,146,159, 55, 86,127,119,129, 38,132,168,165, 82,233, 68, 65, 16, 6, 81, 74,215,241, 60, 63,151, + 82,170,123,221,147,164, 70,141, 26,171, 90,182,108, 57,248,200,145, 35, 63,196,197,197,141,126, 19, 39, 94,243,230,205,183, 84, +172, 88,177,119,203,150, 45, 69, 10,133, 2, 73, 73, 73,200,204,204,196,195,135, 15,109, 25, 25, 25, 51,206,159, 63, 63,179,180, +154, 45, 90,180, 88, 47,149, 74,123,117,235,214, 77, 37,149, 74,145,153,153,137,156,156, 28,122,254,252,121, 51,199,113,227, 46, + 94,188,248, 67,105, 52,131,131,131,137, 74,165,218, 95,161, 66,133, 14, 77,155, 54, 21, 73, 36, 18,100,101,101, 33, 51, 51, 19, +247,239,223,183,101,100,100,124,126,233,210,165,239,236,209,212,104, 52, 50,173, 86,107,126,201,119, 18,173, 86,107,101, 21, 46, +211,100,154, 76,147, 25,172,255,160,193,250,255,146,169, 69,166,168,240, 85,226, 3,152, 75,169, 41, 2,192,191,204, 88,253,155, + 79, 18,141, 70,163,212,106,181,134, 55,169, 25, 28, 28,220, 89,173, 86,207,144,203,229,181, 0, 88, 77, 38,211, 13,157, 78, 55, + 62, 60, 60,252,250,107,104,118,114,114,114,250,194, 98,177, 4,137, 68, 34, 19, 33,228, 90,126,126,254,215, 69, 81,166,178,104, +134,132,132,188,171, 82,169, 38,203,229,242, 0, 65, 16,204, 38,147,233,154, 94,175,255,252,117, 52, 89,133,203, 52,153, 38,211, +100,154,255, 94,131, 37,198,191,144, 66,227, 99,247,252, 42,165,212,180,225, 63,138, 61,230,170,180,132,135,135, 31, 4,112,240, + 13,107, 30, 2,112,232, 77,106, 94,187,118,109, 7,236,159, 17,155,193, 96, 48, 24,255,113, 56,118, 8, 24, 12, 6,131,193, 96, + 48,222, 44, 4, 5,243,144,252,129,210,132,254, 8, 33, 65,165,253, 97, 59,198, 18, 49, 77,166,201, 52,153, 38,211,100,154, 76, +243, 95,166, 89, 76,251,155,151,124,149, 88,168,195,198, 96,189, 42, 99, 88,255, 52,211,100,154, 76,147,105, 50, 77,166,201, 52, +255,107,176, 46, 66, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96, 6, +139,193, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12,198, 63,134, 63,245, 46, 66, 6,131,193, 96, 48, 24,140,255, + 34,191,139, 96, 17, 66,152,219, 98, 48, 24, 12, 6,131,241,151,243,111,243, 32,172,139,144,193, 96, 48, 24, 12, 6,131, 25, 44, + 6,131,193, 96, 48, 24,140,255, 7, 6,139,117, 13, 50, 24, 12, 6,131,193,248, 59,248,183,122,144,162, 8, 86,171,194, 29,108, +197,178,154,193, 96, 48, 24, 12,198, 95,200,191,210,131,176,187, 8, 25, 12, 6,131,193, 96, 48,222, 48,108, 12, 22,131,193, 96, + 48, 24, 12,198,255, 39,131, 69, 8, 9, 98,154, 76,147,105, 50, 77,166,201, 52,153, 38,211,100, 6,139,193, 96, 48, 24, 12, 6, +131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,152,193, + 98, 48, 24, 12, 6,131,193,248,155, 32, 0, 94,120, 39, 0,165,244,174,221, 34,101,184,155,160, 36,125,166,201, 52,153, 38,211, +100,154, 76,147,105,254,251, 52, 75,210, 46,141,255,248, 71, 27,172, 63,115,162, 81, 66, 72,208,155, 62, 80, 76,147,105, 50, 77, +166,201, 52,153, 38,211,252,247,105,254,219, 16,179, 67,192, 96,252, 63,231, 92, 45, 17, 4,190, 50, 64, 52, 16,137,146, 64,233, + 19, 52,191, 47,188,182, 38, 71,253, 32, 80, 79, 64,156, 6, 8,209,175,173,201, 96, 48, 24,204, 96, 49, 24,140,255, 63,103, 49, +173, 1,155,104, 14, 8,245, 6,165, 81,224,185, 57, 0, 94,239,202, 82,160, 53, 0,110, 38,136,224, 11, 42, 60, 4,132,185, 0, + 34,216,193,102, 48, 24, 12,251,248, 91, 6,185,135,132,132,132,135,132,132,124,219,170, 85, 43, 57,203, 2, 6,227, 53, 56, 87, + 75, 5, 27, 58,153,173,188,207,225, 75,217, 30,122,147,173, 6, 56,190, 51,206,213,114,120, 45, 77,142,180, 55, 90,108, 21, 55, + 30,215,123,234, 76,182, 90,160,220,235,105, 22, 18, 20, 20, 84, 46, 52, 52,244,112,253,250,245,203,179,204, 99, 48, 24,204, 96, +189, 97, 4, 65,104,224,225,225, 49,214, 96, 48,196, 53,108,216,176,251,127,233,128,135,132,132, 60, 13, 14, 14,166,193,193,193, + 52, 36, 36, 36,173, 85,171, 86,226, 87, 45,255,183,210,160, 65,131, 6,205,155, 55, 63, 25, 24, 24,168, 6,128,218, 31,239,243, +168, 55,236,184,127,200,200, 99,190,236,180, 44,205, 25, 76, 61, 1,210,250,126,140, 81,149,146,105,243,188, 30,169,119, 4, 33, +173, 32,240,222,175,165, 73,241,214,173, 40,163,250,210, 19,119,207,243,119, 76, 78, 0,105, 13,145,224,245,186,201,149,201,100, +195, 41,165,237, 36, 18,201, 24,150,121,255,109, 8, 33, 65,132,144,238,132,144,144, 55,168, 57,175,102,205,154,137,132,144,207, +216, 17,102,252,191, 49, 88,189,171,144,166,239, 85, 37,103,250, 86, 33,121,253,170,146,252,129, 85,201,249,119,253, 73,203,178, +254,240,206,157, 59,149, 27, 54,108,240, 8, 12, 12,220, 26, 22, 22,118,190, 97,195,134,213,203,104, 88, 14,135,132,132,244,126, +126, 89,195,134, 13,251, 22, 95, 22, 26, 26,122, 47, 52, 52, 52, 39, 36, 36,228,137, 61,186,193,193,193,143,131,131,131,117, 33, + 33, 33,143,139, 47,111,216,176, 97,223,208,208,208,195,207,253, 94,239,231,151,189, 12, 74,169,247,145, 35, 71,112,252,248,113, + 0,112, 65, 97, 55, 45,165,212,251,240,225,195, 56,118,236,216,239,150,151,225,120,124, 28, 18, 18,114,241,185,125,249,232,249, +101,175,162, 97,195,134, 23,131,131,131, 63,122, 78,247, 98, 72, 72,200,199,111,200,100, 54, 84, 40, 20,167, 77, 38, 83, 75,165, + 82,169, 6, 0,177, 72,225, 72, 56,244,179, 16,113,112,237, 49, 39, 61,216,169,105, 7,231,106, 73,193,147, 22, 2, 21,220,239, +197, 24,220, 59,117,125, 71,124,251,177,193,221,202, 11,174,224, 68,173,112,174,150,188, 76,154, 2,154, 11, 16, 60, 79,220,146, +186,183,234, 58, 74,116,242,142,196,221, 42,240,110,176,145,150,101,210,252, 95, 57,148,136, 68,162,177, 67,135, 14,229, 8, 33, +163,252,253,253,101,255,165,236, 10,171, 67,124,218, 52, 20, 95, 13, 14, 36, 77,223,148,166,175,175,111,104,149, 42, 85, 34, 52, + 26, 77,253,255,103,230,170, 1, 0, 21,165,116, 47, 0, 79, 66,136,248, 13,104, 46,249,230,155,111,198,223,189,123, 87, 83,165, + 74,149, 25,132, 16, 17,171, 36, 24,255,120,131,213,175, 10,153,238,233,229,115,116,202,146,205, 45, 86,157,141,118,248,126,111, +184,122,236,132, 57, 77,189, 92,220, 15, 14,244, 39,115, 95, 97, 38,238,190,226, 74, 22, 79,158, 60,193,242,229,203, 21,211,166, + 77,107,226,228,228,116, 59, 44, 44,108,105, 81, 68,195, 94, 77, 74,105, 83,137, 68,178, 42, 44, 44,108,109, 81,133, 77, 8,105, + 42,151,203, 87,134,133,133,109, 44,234,134, 12, 14, 14,174,114,245,234, 85, 39, 66,136,167, 61,233, 12, 13, 13,245, 14, 15, 15, + 87, 1,240, 6,128, 86,173, 90,201, 67, 67, 67, 55,248,248,248,252, 12,160, 41, 0,248,251,251,203,194,194,194,214, 86,168, 80, +225, 23, 66,126, 95,105,190,106,223,203,149, 43,135,205,155, 55,255, 97,185,139,139, 11, 54,109,218,132,178, 28,207,192,192, 64, +117, 72, 72,200, 78,111,111,239,165,130, 32, 52, 6,128, 58,117,234,168, 66, 67, 67,119,248,248,248, 44, 43, 90,102,143, 38,165, +180,177, 84, 42, 93, 26, 26, 26,186,163, 78,157, 58, 42, 0, 16, 4,161,177, 88, 44, 94, 18, 18, 18,178,179,180,121,212,178,101, +203, 79, 27, 53,106,100, 10, 9, 9,177, 53,111,222,124,135, 68, 34, 57, 53,107,214, 44,181, 66,161, 48,243,170,234,234,250,163, + 78, 85, 20, 36,212, 70, 9,103, 34,130, 48, 71, 34,192,213,255,211,195, 50,123,247,189,172,252, 11, 52, 61, 64,208, 54, 50,206, +168,240,171, 22,162,246,168,249, 46,220,203, 73,228,151, 34,242, 29, 65,208, 6,128,123,153, 52,193,181,185,247,196,168,116,169, +210, 73, 21,210,168, 5,136, 67, 53,249,233, 91,249, 78, 32, 92, 89, 53,139,120,183,113,227,198,178, 54,109,218, 64,163,209,136, +156,157,157, 7,252, 7,242,232,153,185,114, 84,200,174, 44,250,230,243,134, 26, 55,213, 30,123, 76, 86, 73,154,190,190,190,161, +142,142,142,199,167, 77,155, 86, 75, 46,151,159,180,199,100,253, 19,142,103,161,185,146, 82, 74, 47, 23, 46,138, 0,208,252, 53, + 53,151, 76,159, 62,125,204,164, 73,147,144,151,151,135, 65,131, 6, 57, 1, 88, 84, 22,205,222,189,123,139,122,247,238, 45,250, +143,212, 33,255, 40,205, 18,144, 1,104, 13,160, 11,128, 54, 0, 66, 11,223,135, 20,190,186, 0,104,251,220,255,162,232,104,209, +247, 97, 47,209,232,242,130,237, 66,138, 45, 47,254,249,249,247,175, 54, 88,132, 16, 90,252,127,113,250, 84, 37, 77,220,188,124, +198,207,219,125, 77, 41, 60,188,133,240, 15, 91,227,225,152,183,161,124,124, 19, 19, 71, 79, 84, 58, 58,186,140,238, 93,149,180, + 46,203,209,122,248,240, 33,182,110,221, 10,119,119,119,178,102,205, 26,121,239,222,189,135, 59, 57, 57,197,135,132,132, 12,176, + 87, 67, 36, 18,241,107,215,174,117,232,217,179,103, 63, 87, 87,215,123,193,193,193, 85, 56,142,227,215,175, 95,239,208,183,111, +223,222,102,179,249,126,195,134, 13,171,223,184,113,131,191,118,237, 26, 56,206,190,160, 93,120,120,184,237,208,161, 67, 69, 17, +157,234,148,210,251,115,231,206,237,183,107,215, 46, 71,103,103,103, 33, 56, 56,184, 74,133, 10, 21,238,205,155, 55,111,192,142, + 29, 59, 28,157,156,156,236,190,195,202, 96, 48, 64,161, 80,188,112,185, 92, 94,250, 0, 65,112,112,112,109, 55, 55,183, 7,115, +230,204,233,177,123,247,110,165,163,163, 35, 66, 66, 66,106,149, 43, 87, 46,114,254,252,249, 61,247,236,217,163,116,116,116,180, + 91, 79, 42,149, 98,211,166, 77,170,254,253,251,119,151,203,229, 15, 66, 66, 66,106, 73,165, 82,108,217,178, 69, 53, 96,192,128, +174, 42,149,234,126,112,112,112,109,123,245,120,158,159,186,100,201, 18,217,182,109,219, 68, 21, 43, 86,236, 56,107,214, 44, 85, +112,112, 48,161,148, 66,112,169, 84, 14, 84,232, 39,162,240, 5, 47,236, 38, 64, 50,181, 10, 31, 56,153, 37, 44,138,245,234, 72, +147, 8, 2,109, 0, 66,253,111, 60,212,151,175,223,252, 61, 49, 82,247, 34,180,150, 90,124,250, 70,190, 7,165,212, 15,160,161, + 56, 87, 75, 92, 42, 77,160, 30,136, 80,253,232, 45, 82,190, 73,219, 1,226,184,184, 56, 84,174,217, 74,180,239, 42,231, 73, 33, + 84, 6, 65,195, 82,105, 22, 67, 34,145, 76,235,211,167,143, 58, 46, 46, 14, 77,154, 52, 81,201,100,178,175, 95,251, 56, 60, 8, +148,226, 76,128, 31,206, 4,180,196,197, 26,222, 56,243,207,235, 90, 15,171, 67,124,156, 20,178,203, 91, 54,254,170,169,211,252, + 99,242,243,231,126,174,238,142,146, 61,175, 19,201, 42, 50, 87, 7, 14, 28,112,104,215,174, 29, 70,142, 28,233,172, 80, 40, 78, +253,211, 35, 89,197,205, 21, 33, 68, 89,216, 61,152, 8,192,247, 53, 52,151, 77,159, 62,125,204,228,201,147,113,249,242,101,204, +159, 63, 31,157, 58,117,130,139,139, 75, 35,123, 53, 26, 52,104, 16,214,178,101,203,223, 90,180,104,145, 29, 31, 31,111,141,139, +139,179, 54,107,214, 44,187,101,203,150,191, 53,104,208, 32,236,117,118,185,240,197,120,117, 30,190,212,131, 20,163,238,164, 73, +147, 66, 9, 33,251, 39, 77,154,212, 16, 64,121, 66,200,254,194,139, 62,247,194,247,178,231,254,187, 23,154,166,162,239,221, 94, +164, 81,244,122,110, 59,247, 98,203,139,255,198,243,239, 75,142, 96, 17, 66, 90, 2, 56,251,252, 10, 98,138,111, 62, 25,251,173, + 34,102,237, 34, 36,109, 90, 2, 46, 93, 11, 81,118, 50, 76,103,247,194,122,110, 31,222,111,220, 88,169, 36,100,102, 89, 14,170, +163,163, 35,164, 82, 41, 30, 61,122,132,251,247,239,163,115,231,206,210,229,203,151,151,171, 93,187,246,202,166, 77,155,222, 10, + 9, 9,169,107, 71,198,160, 90,181,106,232,215,175,159,236,179,207, 62,171,170, 80, 40,110, 80, 74, 37,149, 43, 87, 70,223,190, +125,165, 19, 38, 76,168,164, 80, 40,174, 9,130, 32, 85,169, 84, 32,132,216,155,225, 80, 42,149, 0, 32,169, 94,189,250,245,173, + 91,183, 86,110,218,180,169,248,232,209,163,200,205,205, 21,215,168, 81,227,214,150, 45, 91,252,155, 52,105, 34, 62,127,254, 60, +116, 58,157,221, 19,138,233,245,250, 34,237,223,161,211,233, 94,104,188, 94, 69, 72, 72,200,199,254,254,254,215,182,110,221,234, +219,188,121,115,209,169, 83,167,144,151,151, 7, 63, 63,191,235, 91,183,110,245,109,218,180,169,232,226,197,139,200,203,203,179, +255, 50, 65, 38, 67,225,241,147,124,241,197, 23,190, 82,169,244,154, 76, 38,131,159,159, 31,250,244,233, 35, 29, 55,110,156,175, + 76, 38,187, 98,111,151, 33,207,243, 50,119,119,119, 56, 59, 59,227,227,143, 63, 86, 5, 4, 4, 16,155,205, 6, 74, 41,136, 69, +111, 1,165, 53, 8, 21,245, 33, 98,145,133, 18,186,158, 16,210,138,138,197, 82, 86,237,188, 18, 55,112,104, 23,155,100,150, 75, + 29,124, 29, 29,202, 7, 0,153,103, 81, 69, 35, 7, 33,156,226,218, 3,189, 26, 4,237, 0,184,149, 74,147,160, 93,116,162, 73, +110, 81, 4, 57,104,124, 42, 34, 35, 35, 3, 21, 42,215,132,153,148,151, 93,188,167,115, 0, 45,181, 38, 0,160,126,253,250,205, + 43, 84,168,224, 85,169, 82, 37,164,167,167,163, 90,181,106,112,112,112,112, 9, 14, 14,110, 87,230, 35,112,166,146, 28, 25,104, + 10,142, 44, 2,199,125, 3,129,155, 11,113, 90, 3,220, 8,150,252,227,204,213,166, 95,125,220,188,107, 2,119,135,192,211, 85, +134,213,147,234,185,186, 59,202,203,100,178,138,155, 43,165, 82,137,240,240,112,212,174, 93, 27,227,199,143,119, 82, 42,149,255, + 88,147,245,156,185,114,165,148, 26, 0, 8, 0,250,163, 12,119,189,146, 2,190,251,246,219,111, 63,157, 60,121, 50, 46, 93,186, + 4, 31, 31, 31,164,166,166,162,121,243,230,113, 89, 89, 89, 37,182, 75,189,123,247, 22, 53,109,218,244, 23, 55, 55,183,227, 67, +134, 12,233,177,101,203, 22,231,221,187,119,147, 22, 45, 90,144, 74,149, 42, 57, 15, 25, 50,164,135,155,155,219,241,166, 77,155, +254, 98,111, 84,171,168,233, 4,160, 0,160, 42,122, 61,121,242, 68,230,239,239, 47, 35,132, 40, 10,205,165,156, 16,194,158,166, + 82,130, 7, 41, 70,249,185,115,231,206,166,148,118,157, 59,119,238,236, 98,219,237,127,133,102,113,211, 4, 0,120, 94,131, 82, +218,181,248,255,226,219, 82, 74,187, 82, 74,187, 22,223,254, 85,191,247, 82,131, 5,224, 52,165,180,229, 31,194,128, 64, 93,239, + 42, 53,144,125,124, 59,148, 34,242,187, 23,247,228, 54, 42, 40,196,176, 82, 90,187, 44, 7,212,193,193,225,217,139,227, 56, 36, + 37, 37, 65, 36, 18,225,235,175,191, 86,140, 30, 61,186,142, 84, 42,189,212,162, 69,139, 57, 37, 25, 33, 0,184,114,229, 10,170, + 85,171, 70, 38, 79,158,236,212,178,101, 75, 49, 0,220,190,125, 27,254,254,254,100,214,172, 89,142,221,186,117, 35, 42,149,202, +238, 8, 22,199,113, 80, 42,149,104,213,170, 21, 89,187,118,173,131, 92, 46,199,129, 3, 7,144,158,158,142,246,237,219,139,215, +174, 93,235,160, 80, 40,112,230,204, 25,228,228,228,216,173, 75, 8,129,209,104,252,131,193, 34,132,188, 52,178,245, 50,154, 52, +105,178,218,203,203,107,233,134, 13, 27,228, 74,165, 18,167, 78,157, 66, 78, 78, 14,250,245,235,103,219,180,105,147,194,201,201, + 9, 23, 47, 94, 68, 78, 78, 78,153, 10,252,213,171, 87,225,239,239, 79, 38, 79,158,172,108,220,184,177, 21, 0,110,222,188,137, +234,213,171,147, 41, 83,166, 40,157,156,156,150, 52,107,214,108,181, 29,161,100,232,245,122, 24,141, 70, 60,126,252, 24,153,153, +153, 72, 72, 72, 0,165, 20, 50, 93, 82,174, 64, 68, 91, 40,165,189, 57, 43,167, 32, 28, 34, 64, 72, 32, 79,168,140,204,152,193, + 42,159, 23, 71,154, 8, 32, 84, 7, 72,131,203, 17,249,174, 45,218,191, 39, 69,218, 33,128, 90, 1, 34, 70,235, 80, 95,241,158, + 11, 58, 79, 8,164, 46,128,154, 5,235,219,161, 41,162,213, 0, 52, 60,122,131,119,107,214,113,184, 52, 33, 33, 1, 82,169, 20, +114,185, 28,245,155,188, 35,222,114,218,234, 5,160, 30, 56, 18, 96,151,102, 49,228,114,249, 87, 31,126,248,161, 58, 49, 49,241, +153,102,167, 78,157,212, 42,149,106, 90,153,205, 21,167,106, 12,208, 49,119,163,141,149,102,173,215,214,124,146, 96, 14, 0,197, + 56,152, 12,175,109,178,252,252,252, 90,213,168, 81, 35,186,114,229,202,205, 94,211, 92, 93,218,186,233, 87, 31, 87,175, 2,115, + 5, 94, 15,136,148,240,242,112,193,234,105,173, 92,221,157,148,165, 50, 89,207,155,171,235,215,175, 67, 38,147, 65,161, 80,160, + 65,131, 6,248,230,155,111,156, 84, 42,213, 63,194,100, 17, 66, 92, 8, 33, 29, 8, 33,239, 18, 66,222, 41,102,174, 42, 3,120, +139, 16,210, 14,128, 23,128, 51,148,210, 91,118,106, 54, 19,139,197, 7,234,213,171,167, 21,139,197, 17,179,103,207, 30, 57, 97, +194, 4, 44, 91,182, 12,173, 90,181,122, 50,113,226, 68, 68, 70, 70,218,244,122,125,119, 74,105,137, 13,161, 86,171,157, 81,189, +122,245,126,187,119,239, 86, 87,174, 92,153,211,235,245, 56,118,236, 24, 22, 46, 92, 8,163,209,136,138, 21, 43,114,187,119,239, + 86, 87,175, 94,189,159, 86,171,157, 97, 71,250,220,221,220,220,106,160,160, 59,171,200, 96,169,227,226,226, 28,206,157, 59,231, + 26, 20, 20,228,162, 86,171,213, 83,167, 78,245,253,252,243,207,123, 0, 96,145,250, 18, 60,200, 75, 76, 83,241,246,165,235,203, + 76, 79,209,119, 47, 50, 79,101, 77,228,171,126,239, 85, 6,171, 21, 33,228,204,139, 86,178,100,165, 66, 14, 1, 42, 17,129, 82, + 76, 10,254,139, 8,148, 28,133, 56, 43, 21,164,140, 1, 80, 7, 7, 7, 56, 58, 58,254,193,104, 25,141, 70,228,231,231,219, 21, +109, 18,137, 10, 46, 42, 92, 92, 92,144,151,151, 7,155,205, 6, 7,135,130,187,201, 93, 93, 93, 97, 50,153, 64, 8,129, 90,173, +134, 90,173, 46, 85, 4,171,200,236, 92,188,120, 17, 23, 46, 92,128, 88, 44,134,171,171, 43, 0,224,250,245,235,184,115,231, 14, +100, 50, 25,220,220,220,236,214, 5, 0,179,217,252, 66, 35,101, 50,153, 74,213, 69, 88,120,172,232,245,235,215,113,247,238, 93, +200,229,114,184,187,187, 67, 38,147, 33, 62, 62, 30, 15, 30, 60,128, 76, 38,131,187,187,123,153,242,199,201,201, 9,217,217,217, + 16, 4,225,153, 33,116,114,114, 66,126,126, 62, 56,142,179,219, 84, 22, 25,179, 75,151, 46, 33, 38, 38, 6,183,111,223, 70,100, +100, 36,158,123,138, 64,193, 1,180, 10, 86, 80,202, 9,132,231,128,105,172,202,121, 49,206, 0,215, 62, 45,215, 34, 79,203,147, + 59,123,250,183, 5,210, 15, 1, 68, 4, 72, 92,208,168,126, 21,196,165,242,234,200, 4,163, 2, 20, 29, 80,112,211, 68,201,154, + 2,215, 46, 53,219, 34,143,205, 46,239, 84, 43, 40, 24,169,169,169,144,203,229,144,203,229,104, 24,214, 6, 79,146, 5, 85, 68, +172, 65, 5,138,246,118,106, 2, 0, 26, 52,104, 80, 85,169, 84, 54,110,208,160, 1, 73, 73, 73,129, 92, 46,135, 66,161, 64,227, +198,141,193,113, 92,157,250,245,235,215, 44,213,222, 63,241,151,129,168, 26, 1,116, 76, 68,172, 65,179,247,162,161,122,183, 30, +239,184, 46,221,145, 82,243, 65,172,169, 50,108,100, 28,116,250,224,178,154,172, 74,149, 42,181,116,112,112,216,255,213, 87, 95, + 85,150,203,229,135, 42, 87,174,220,188, 76,245,155, 92,244,211, 87, 99,250,251,184, 20,153, 43,155, 14, 16, 41, 1,145,170,192, +100,121,150,199,204,207,218,186,170,164,146,223,236, 14,139,136,197,155,167, 79,159,254,204, 92, 73,165, 82, 40, 20,138,103,175, +176,176, 48, 12, 31, 62,220,201,193,193, 97,211,223,108,174, 92, 81, 48,174,234, 54,128,157, 0, 78, 20, 51, 87,213, 0,252, 86, + 24,181,186, 65, 41,141,179, 83,179, 73,199,142, 29, 79, 61,121,242,164,243,173, 91,183,188,147,147,147,107,142, 27, 55, 14, 75, +151, 46,197,132, 9, 19, 54, 83, 74,107,108,223,190,189,254,213,171, 87,235,216, 59, 62,136,227,184,161, 3, 6, 12, 80, 41,149, + 74, 40, 20, 10,172, 95,191, 30,195,135, 15,127, 86, 15,171, 84, 42, 40,149, 74, 12, 24, 48, 64, 69, 8,249,196, 14,201,140,188, +188, 60,135,119,222,121,199,175,200, 92,153,205,102,135,228,228,100,103,158,231,203,213,173, 91,215,115,250,244,233, 1,121,121, +121,245,118,237,218,149, 10, 32,141, 85,103, 37,123,144,231, 13,142, 61,203,202,186,190,189, 38,171, 84, 6,139, 82,122, 6, 64, +139, 63, 24, 24,130,219, 79,175,158,129,107, 96,131,223, 71,176,196, 4, 42, 39,103, 68, 39,196, 65, 10,114,175, 12, 9,124,102, +170,138,155,172,164,164, 36, 76,152, 48, 65,191,113,227,198, 59,102,179,185,241,217,179,103, 39,217, 19,193,242,240,240,192,211, +167, 79,233,130, 5, 11,114, 15, 29, 58,100, 43, 90, 22, 31, 31, 79,167, 78,157,154,247,235,175,191,210,210,116, 17, 22, 69,176, +206,156, 57, 67,167, 77,155,150,163,213,106,169,171,171, 43,220,220,220,112,252,248,113,219,164, 73,147,114,162,162,162,168,171, +171, 43, 92, 93, 93, 75,101,176,108, 54, 27,148, 74,229, 31,182,177, 90,173, 47, 92,254, 50,206,159, 63, 63, 36, 39, 39,231,243, + 47,190,248,194,112,255,254,125,234,238,238, 14,119,119,119,172, 91,183, 78,252,193, 7, 31, 24,110,223,190,253,108, 89, 89, 40, + 95,190, 60, 30, 62,124, 72,103,207,158,109, 56,113,226,132, 4, 0,220,221,221, 17, 25, 25, 73,191,249,230, 27, 67,118,118,246, +231,231,207,159, 31, 98, 79, 94,103,102,102, 34, 61, 61, 29, 9, 9, 9, 72, 79, 79, 71, 70, 70, 6, 4, 65,128, 89,237,237,196, + 81,190, 63,128, 29,130,196, 96, 36, 34,113, 13, 10, 68,137,172,212, 68,167,129,205, 28,254,194,171, 10,120,129,210,102,231,111, +229,151,107,215,185,143,140,228, 94, 5,172,249,128,196, 5,144,148,131, 88,225,134, 78,173,235,139,214, 30,205,243, 2, 65, 19, +112, 92,201,227, 91, 8,241,132, 64,155, 31, 15, 55,185, 52,237, 52, 90,150,153,153, 9,142,227,158, 25, 44,149, 90,141,182,157, + 7,114,107,142,153,188, 64,105, 83, 16,222,238, 49, 51, 82,169,116,252,224,193,131,165, 89, 89, 89,191,211, 84, 42,149,232,217, +179,167,220,209,209,113,170,221,251,254, 32, 80,138, 20,121, 35, 16, 58,230, 65,172, 65,179,231,130,190,198,184,105,171,149,181, +235,134, 97,104,119, 15,229,172,141, 41,129, 55,159, 24,170,128,227,198, 66,175,111,136,149,165, 51, 89,149, 43, 87,110,174, 86, +171, 15,236,222,189, 91,213,186,117,107,140, 27, 55, 78, 45,151,203, 15, 85,170, 84,169, 69,105,179, 73,151,199,143,250,102,201, +134,148,219,219, 58, 0,182,188, 66,115,245,191, 87,106,142,128,175,191, 59,149, 99,229,105,127,123, 53,173, 86,235, 39,147, 39, + 79,206,223,177, 99,199, 31,204,149, 66,161, 64, 76, 76, 12,126,254,249,231,252,252,252,252, 79,254,230, 82, 90, 31,192, 77, 0, + 70, 0, 45, 1,168, 10,239, 20,108, 12,224, 56,165,148,167,148,166, 80, 74,147,236, 46,246, 34,209,132, 31,126,248, 65,108, 48, + 24,240,241,199, 31, 35, 62, 62, 30, 90,173, 22, 83,166, 76,137, 17, 4,225,131, 66,205, 91,148,210, 7,246,106, 26, 12,134, 15, +103,204,152, 97, 72, 76, 76, 68, 80, 80, 16, 82, 83, 83,209,185,115,103,116,233,210, 5, 42,149, 10,117,234,212, 65,124,124, 60, +166, 79,159,110, 52, 26,141,246,212,117,130,213,106,189,119,252,248,113,101,183,110,221, 2, 22, 45, 90, 84,245,228,201,147,213, + 77, 38, 83,101,179,217, 28,152,156,156, 28,180,111,223,190, 74,191,252,242,203,211,167, 79,159, 94,166,148,242,172, 66,123,181, + 7,121, 3, 28,120,157, 72,213,139, 34, 96,118, 7, 65, 10,133, 72,241,255,191,139, 94, 1, 95,175,223,177,222, 40,243,171, 14, +231,154,245,160, 82, 40,160,148,203,160, 44,231, 10, 35,207, 99, 85,108,138, 94, 71,233,212, 50, 36,254,119,145, 43, 65, 16,240, +243,207, 63, 27,103,206,156,153,157,156,156, 60,236,236,217,179,245,174, 93,187,118,219, 30, 35,148,155,155,139,237,219,183, 27, +214,174, 93,251,196, 96, 48, 52,144, 74,165, 86,179,217,140,205,155, 55, 27,151, 46, 93, 26,171,215,235, 67, 36, 18,137, 69,161, + 80,148,122, 12,150, 68, 34,177, 26,141,198, 6, 91,183,110,141, 58,112,224,128,193,201,201, 9, 18,137,196,170,215,235,235,108, +216,176, 33,114,235,214,173, 6, 39, 39,167, 82, 25, 44, 65, 16, 94, 24,193,226,121,190,212, 99,176,174, 93,187,246,139,197, 98, + 9,219,188,121,115,194,154, 53,107,140, 78, 78, 78, 69, 21,113,200,250,245,235, 19,126,250,233, 39, 83,105, 6,184, 23, 69,216, +120,158,199,250,245,235, 77, 91,182,108, 73,176,217,108, 33, 69,203,214,172, 89, 99,220,176, 97, 67,130,197, 98, 9,187,118,237, +218, 47,118,230,181, 57, 41, 41, 9, 73, 73, 73,184,125,251,182,249,193,131, 7, 52, 61, 61,189, 96, 12,150, 88, 37, 6, 33, 15, +193, 9, 91,169, 77, 34, 21, 40, 6, 16,224, 52, 17,139, 44,172,202,121, 89, 43, 43,168,192, 65,249, 40,193,228,168,148, 90, 9, +146,127, 3,164, 46,133, 6,171,224,165,241,241,197,181, 72,189, 35, 8,149, 65,160, 37,119, 67,240,188, 26, 28, 85,221,141,133, +163, 68,170, 34,201,201,201,207, 34, 77, 69,134,168,114,213, 90,184,241, 40,223, 1,132,202,193,139, 60, 75, 83, 81, 57, 58, 58, +138,147,146,146,158,105, 61,211,172, 92, 89,100,181, 90, 59,216,189,239,241,188, 55, 4, 97,212,195,120,147,102,207, 69, 67,141, +177, 95,173, 81, 42,185, 44, 32,118, 25,106, 87,243,194,184, 15,234,201,166,174, 73, 13,188,250, 64, 95, 21, 68, 52, 12,181,243, +237,190,186,168, 92,185,114, 51,149, 74,117,104,247,238,221, 42,181, 90,141, 39, 79,158,160,110,221,186,248,246,219,111, 85, 42, +149,234,160,159,159, 95,171,210,100,211,229, 72, 26,151,159,199, 55, 30,255,115,124,242,237, 24,190,192, 88,113, 5,230, 42, 45, +135,226,163,175,246,101,103,229, 26,223,185,116,199,122,210, 94,205,196,196,196, 83, 70,163,177,199,178,101,203,242, 83, 82, 82, +126,103,174, 98, 99, 99, 49,114,228,200,252,252,252,252, 78, 90,173,246,194,223, 92, 74,213, 40, 24,188, 30, 0,192, 31, 64, 61, + 74,169, 13, 64, 94, 89, 77, 69, 96, 96, 96, 3, 63, 63, 63,252,248,227,143, 88,181,106, 85,214,226,197,139, 65, 41, 69,245,234, +213,157,202,170,121,227,198,141,253, 22,139,101,236,251,239,191,111,216,180,105, 19, 63,104,208, 32, 52,108,216, 16,193,193,193, +120,255,253,247,241,203, 47,191,216, 6, 12, 24, 96, 52,153, 76,159,223,184,113, 99,191,157,229,221,148,151,151, 23,190,127,255, +254, 91, 43, 86,172,136, 31, 51,102, 76,222,199, 31,127, 44,157, 53,107, 86,218,175,191,254,122,243,220,185,115, 7,141, 70,227, + 21, 74,169,137, 85,102,207,142,217, 75, 61, 72, 49,210, 10,141,142,249,185,255,105, 37,124,103,239,182, 47,124,111,199,122, 47, +143, 56,151,180,227,219,158,208,139, 3,253,201,252,111,215,252,252,229,192, 58, 53,149,149, 42,215, 2,159,159,141, 59,201,201, + 88,159,148,163,183, 82,250,221,246, 39,244, 84, 89, 13,150, 72, 36,194,145, 35, 71,248,205,155, 55, 91, 40,165, 43,115,115,115, +167, 70, 68, 68,232, 74, 97, 86, 68, 31,126,248, 97,126, 86, 86,214,111, 73, 73, 73,195,162,162,162,204,205,155, 55, 23,189,247, +222,123,249,153,153,153,123, 9, 33, 31, 95,191,126,221,212,172, 89, 51,148,230,193,214,132, 16, 72,165, 82, 16, 66,112,237,218, +181,152,192,192,192,218,151, 47, 95,254,254,225,195,135,125, 40,165,162,240,240,240,248,224,224,224,186, 23, 47, 94, 92,241,224, +193,131,254,130, 32,148,106,206,149, 23, 13,114,167,148,150,218, 96, 1, 64,120,120,248,189,192,192,192, 90, 87,175, 94, 93,247, +201, 39,159,116, 0,160,186,118,237,218,253, 58,117,234,212,188,124,249,242,186, 15, 62,248,160, 99, 97,184,218, 46, 44, 22, 11, +122,246,236,169,207,201,201, 57,156,151,151, 55,232,206,157, 59,250,224,224,224,162,101, 71,178,179,179, 7,149, 38,143, 40,165, + 51,207,158, 61, 59, 31,128, 88,169, 84,238,191,121,243,102, 7,189, 94,175,162,148,130,228,197,231, 8,158,182, 95,121, 34,225, + 56, 17,237,206, 81, 90,131,167,194, 36,149, 84,197, 66,231, 47, 63,162,185, 0,167,125,183,181,139,124,217,247,171,165,131,187, + 85, 85, 4,213,244, 43, 48, 87, 82, 23, 92,187,159,141,175, 23,111, 23,230,125,226, 30, 13, 1,241, 32, 52,178,228, 75, 45,113, + 46, 4, 33,245,163, 14, 18,249,156, 95,198, 84,105,218,229, 75,121,173,160,208,103, 70,232, 65,196,117, 44,153,251,169, 48,239, + 99,215,104, 8, 68, 11, 14,118, 71, 9,108, 54,219,187,115,230,204, 57, 60,120,240, 96,117,237,218,181,159,105,198,196,196, 96, +222,188,121, 6,147,201,244,142,189,103, 37,148, 53,234,243, 2, 60, 54, 31,205,168, 54,230,211,161, 74, 37,151, 9, 68, 47, 44, + 48, 47, 18,103,212,175, 93, 30, 95,143,242,146,124, 49,127, 95,224,249,101, 85,243, 97,149,214, 2,160,181, 71, 93, 44, 22, 31, +152, 61,123,182, 74,169, 84,226,209,163, 71, 40,234, 54, 10, 14, 14,198,210,165, 75, 85, 35, 71,142, 60,212,170, 85, 43,135,211, +167, 79,219, 74, 99,178, 26, 5,144,198,227,127,136,186, 52,255,179,114, 94,117, 3,202, 35, 61, 15,248,104,218,254,172,204, 92, + 67,239,210,152,171,226, 38,203,199,199,167,199,204,153, 51,247, 44, 88,176,192, 33, 40, 40, 8,113,113,113, 24, 49, 98, 68, 94, +126,126,126,231,127,128,185, 2, 0, 29, 0, 31, 0, 15, 81, 48, 22,233, 49, 33, 68,134,215,120, 60, 91, 68, 68,196,141,184,184, + 56,239, 33, 67,134, 32, 55, 55,215,165,111,223,190,120,242,228, 9, 30, 62,124,120,243,117, 18,122,233,210,165,159, 67, 66, 66, + 46,172, 89,179,102, 2,199,113, 45,204,102,179, 7, 0,225,232,209,163, 73, 54,155,237,180, 94,175, 95,124,227,198,141,200, 82, +157,161, 5,141, 77,122,225, 43,146,213, 89,111,132,107,127,211,182,101,198,174,194,190, 49,138, 78,239, 93,133,156, 88,117,249, +234, 76, 11,165,245, 41, 64,100, 28,185,157, 79,233, 87, 59,162,232,153, 87,152,148, 87, 62,109, 59, 38, 38, 6,203,150, 45,211, +231,231,231,223, 50,155,205, 31, 93,191,126,253,145, 29,198,231,119,154, 98,177,248, 66, 66, 66,194,218,107,215,174,109, 47,190, + 44, 49, 49,113,253,149, 43, 87,126, 45,182, 44,174,117,235,214,190,132,144, 12,123,210, 73, 8, 73,234,209,163,135, 88, 36, 18, +197, 23,158,220, 22, 0, 31,135,134,134, 30,116,112,112,248,168,208,216, 88, 1, 12, 11, 11, 11, 59,172, 86,171, 63,182,119,223, + 57,142,131, 74,245, 98,191,243, 42,131,245, 42,205, 66,195,243, 78, 72, 72,200,199, 42,149,106, 16, 0,220,185,115, 71, 15,224, +221,208,208,208,143, 84, 42,213, 96,123, 53, 85, 42,213,165,212,212,212,181, 87,175, 94, 93, 85,124, 89, 74, 74,202, 58,123,162, + 86,207,107, 94,187,118,109, 57,128,229, 69,159, 67, 66, 66, 26, 62,126,252,248,164, 32, 8, 42, 46,255,129, 62,252,199, 14, 41, + 13, 70,158,169, 74,169,213,129, 16, 50, 65, 70,164, 25,151, 22, 55, 50,150,166, 44,149,133,255,183,154,156, 40, 14, 4, 11,252, + 53,202,137,159,116, 43, 79,230,111,141,174, 50,106,160,151,172, 65, 93, 23, 92,137,200,194,184,153,155,132,249, 67, 61,162,154, +212, 82,199, 0,194, 50,128,164,150,156, 78, 33, 14, 68,152, 87,205, 87, 49,241,139,119, 40,249,106,195,172,170, 10,197, 76,105, +195,176, 86,184,127,239, 42,230, 78,255, 68, 88, 48,212, 53,170, 73, 45,245, 83, 80, 44, 3,144,106,239,190,135,135,135, 95, 8, + 14, 14,238,184,110,221,186,195,159,125,246,153,186,110,221,186,136,137,137,193,140, 25, 51, 12, 70,163,177,235,141, 27, 55, 78, +217,189,239,180,224, 54,110,129, 82,126,226,244,239,204, 6,139, 64,140, 38, 74,244, 22,112, 6,147, 64,244,102,129, 88,172, 2, +209,184, 43, 10, 34, 26, 28,229,236, 77, 39,199,113, 57,159,125,246,217, 75,195,189, 50,153, 44,191, 44,249,254,204,100, 45, 11, +191, 52,225, 35,169,215,242,205,225,153, 25, 57,134, 62, 37,153,171, 87,105, 22,153,172,241,227,199,239,249,226,139, 47, 28, 22, + 47, 94,108,151,185,250, 11,203,252, 77, 0,205, 0, 92,162,148,158, 38,132, 56, 0,104, 2,224, 78, 89, 53,121,158,159, 55,108, +216,176,142,179,103,207, 22, 79,155, 54, 13, 81, 81, 81,248,246,219,111,121,155,205, 54,231,117,207,205,107,215,174,221, 7,240, +254,127,166, 14,249,135,106,254,219, 32,165,137,234,188,169, 12, 8, 14, 14,166, 29, 58,116, 48,156, 57,115, 38,223,108, 54, 15, +189,126,253,250,222,255, 74,225,107,210,164,201, 83,179,217, 92,161,176,194, 78,151, 74,165,222,167, 79,159,182, 21, 95, 46,149, + 74,211,101, 50,153,247,243, 87,202,255,166, 19,175, 65,131, 6, 13, 8, 33,243, 77, 38, 83,247,136,136, 8, 93,157,225,199,220, + 57, 74,156,136, 88,100,185,249, 93,235,167,172,210, 41, 65,243, 92, 45, 25, 56, 52,132, 64, 38,222,137,214, 87,254,106, 77,122, +213,174,237,155, 72,214,237, 56, 43,204, 31,246,204, 92,205, 3,184,171,104,126,223,100,183, 38,132, 80,128,155,120, 43, 74,239, + 55,238,231,172,106,237,186,126, 36,218,247,219,207,194,130,161,110, 69,230,106, 30, 8, 46,217,173,249,251,243,190,169, 92, 46, + 63,212,191,127,127,135, 45, 91,182,148,104,174, 94,168,121,169,102, 69,216,200, 44, 0, 21,236,168,221, 30,193,138,153,104,253, +224,233, 63, 33,223, 27, 5, 16, 63,181,163,124,191,222,100, 27, 99, 79,228,202, 30, 77, 31, 31,159,214, 10,133, 98,189,193, 96, +232,103, 79,228,234,175,220,119, 66,136, 59, 10, 38, 98, 20,163,224, 38,150,123,148,210, 39,175,169,217, 76, 36, 18, 77,168, 90, +181,106,221, 39, 79,158,220,229,121,126, 1,165,244, 52, 51, 46,204, 96, 49,131, 85, 72,243,230,205,195,121,158, 63, 44,149, 74, +103,157, 62,125,218,196, 10, 31,211,100,154,101,208, 44,102,178,194, 31,233,170,204,222,146,229, 55,174,119,185,167, 37,153,171, + 18, 53, 11, 77,214,213,135,250, 74,115,127,205,243,251,226, 93,135,167, 37,153, 43,123,247, 61, 56, 56,184,105,161, 33,248,184, + 36,115,245, 66,205, 7,129, 82,100, 89,125, 64, 69, 65,160,120,249,163,118, 4,170,135, 68,116, 23, 73, 72,193,187, 17, 22, 86, +150,152, 38,211,100, 6,235,175,230,111,153,245,248,220,185,115,193,236,208, 51, 24,175, 73,243,251,102,156,171,117, 29, 28,157, + 27, 92, 93, 57,122,215, 55, 74, 61, 40,151, 0,240, 75, 95,101,174,236,208,188, 10, 8,115, 67,171, 43,199,236,158,161,212,131, + 34, 25, 20, 75, 94,101,174,236, 37, 60, 60,252, 2,128, 42,101, 22,168, 25, 97, 1, 16, 3,144, 88,204,120,197, 12,217,211, 64, +129, 63,241,234,145,193, 96, 48,254,137, 6,139,193, 96,188, 81,147,117, 13, 32, 95,192, 70,170, 64, 34,196, 65,224,146,209,252, +190,249, 53, 53,175,128,224, 51, 8,164, 6, 68, 66, 20, 4,188,158,230, 27,135,210, 2, 19,197, 96, 48, 24,204, 96, 49, 24,140, + 63,199,100, 89, 0, 36, 20,190,254,185,154, 12, 6,131,241, 31,130, 0, 8,122,241,245,161,253,125,171,132,144,160,210, 95,127, +190, 90,159,105, 50, 77,166,201, 52,153, 38,211,100,154,255, 62,205,146,180,255, 45, 99,187,254,150, 65,238, 76,147,105, 50, 77, +166,201, 52,153, 38,211,100,154,255,102,216,195,116, 25, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96, 6,139, +193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,255, 24,254,212,187, 8, + 25, 12, 6,131,193, 96, 48,254,139,112, 0, 64, 8, 97, 46,139,193, 96, 48, 24, 12,198, 95,206,191,213,131,176, 46, 66, 6,131, +193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193,248,111, 26, 44, 66, 8,101, 99,177, + 24, 12, 6,131,193, 96,252,213,252, 27, 61, 8,187,139,144,193, 96, 48, 24, 12, 6,227, 13,195,186, 8, 25, 12, 6,131,193, 96, + 48,254, 63, 25, 44, 66, 72, 16,211,100,154, 76,147,105, 50, 77,166,201, 52,153, 38, 51, 88, 12, 6,131,193, 96, 48, 24, 12,102, +176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, + 96, 48, 24, 12,198,223, 4, 1,240,194, 59, 1, 40,165,119,237, 22, 41,195,221, 4, 37,233, 51, 77,166,201, 52,153, 38,211,100, +154, 76,243,223,167, 89,146,118,105,252,199, 63,218, 96,253,153, 19,141, 18, 66,130,222,244,129, 98,154, 76,147,105, 50, 77,166, +201, 52,153,230,191, 79,243,223, 6,235, 34,100, 48, 24, 12, 6,131,193,120,195,136,255,109, 59,228, 17,212, 83, 42, 22,139,223, +118,117,113,158, 72, 41, 69, 86,118,238, 92,155,205,182, 43,245,238,110,203,159,245,155,132, 16, 2, 0,244, 95,250,220, 33, 66, +136, 34, 48, 48,176, 17, 0, 68, 68, 68, 92,166,148, 26, 95, 51,143, 8,128, 9,142, 14,234,193, 54,222, 38, 24, 12,166, 85,169, +119,119, 47, 98,167,227,107,231,147,136, 82,202,255,211,211,233, 86,163,189,171, 72,170, 20,165,222,221,157,198,114,141,193, 96, + 48,131, 85,136,111, 96,111, 23, 43,199, 79, 23, 73,196,239, 80,129, 58, 38,221,218,174,254,135, 24,171,170,229,156, 29,199, 54, + 11,171,211,119,192, 59, 29,149,117, 2,171,203, 76, 22, 27,246, 28, 58,187,106,251,158,163,203,107, 52,255, 96,103,118, 78,222, +226,212,187,187,159,188,225, 70, 77, 62,117, 80,141, 78,229, 29, 21, 82, 66,200, 78, 74,169,237, 69,235,121, 54, 24,112,145, 16, + 84, 41,220, 6,132, 0, 4,208, 38, 94,219,216,224, 5,154, 42, 0,222, 0, 98, 95,166,247, 34,148,154,192, 10, 18, 78, 54,147, +211, 9,159,102,103,223,202,121,221,125,147, 74,165,158, 21, 43, 86,108, 86,163, 70, 13,207,209,163, 71, 75, 1, 96,201,146, 37, +181,252,253,253, 83,158, 62,125,122,222, 98,177,164,148, 81,250,171,175, 39,140,152,209,189,125,115,100,229, 91,176,124,213,246, +133, 30, 65, 61, 69,169,119,119,207,127, 83,249,162,246, 12,168,205, 73,213,227, 33,216, 58, 67, 36, 57, 38,152,243,231,234, 82, + 34,111,191,174,110,229,182,147, 38, 1, 8, 45,252,120, 53,230,248,156, 57,127,175,169, 10,150, 52,104, 85,229, 35,155,205, 54, +165,114,157, 22, 94,117,155,247, 74,214,229,235,191,142,190,157,177,145,210,112,235, 63,204, 0, 58,215,241, 47, 87,187,107,253, +122,251,206, 70, 89, 28, 61,130,122,110, 7,176, 32,245,238,238,155,246,106, 84,168,217,228,134, 72,196,105,120,155,144, 16, 31, +121,177,225,159,145, 78,181,103, 64, 91, 66,184, 77, 0,164,148, 10,139, 1,108, 3, 16,165, 75,137,124,173, 11, 40, 71, 77,117, + 87,158, 39,157,164, 82,121, 3,171,213,124, 93, 36, 22, 29,202, 77,136,200,126, 67,105, 22, 1, 24,164, 80, 42,191,240,175, 30, + 88, 35, 46,230,241,195,188,220,156,197, 0, 86,235, 82, 34,133, 82,150,241,247,168,192,127, 45,240, 22,142, 16,110,102,220,233, +197,235, 89, 83,201, 96,252,201, 6,171,124,141,238, 14, 34,185,228,110,179,166, 77,220,166,140,236, 37, 91,186,241, 44,188,235, +247, 73, 76,186,185,205,231,111, 54, 87,126,132,144,199,159, 15,237,135, 33,125,219,147,244, 60, 27,114, 13, 60,136, 4,232,211, +171,139,234,157, 30, 29, 85,243,151,175, 30,182,255,240,233, 97, 30, 65, 61, 43,167,222,221, 29, 87,146,166, 87,240,128,211, 0, + 2,138, 62, 83,193,166, 32,156,216, 88,220, 32,169,203,121,158,158,254, 97,205,221, 95, 15,169, 53,123,253,225,167,203, 0,148, + 7,144,252,194,198,133, 19,249,110, 88,185,216,195,199, 77, 6, 17,199, 33, 75,103, 69,223, 15, 63,231, 95,208, 8, 57,252,244, +101,131, 94,131, 58,251, 13,144,183,252,109, 34, 33,228, 38,165,180,196, 10, 82,237, 81,189,142, 76, 89,238, 88,213,122,109, 93, + 98,110, 31, 15, 82,123,212,120, 95,175, 52, 63,166,177,177,166,210, 70, 65, 28, 28, 28, 2, 28, 29, 29, 67,219,180,105,163, 28, + 63,126,188,180,101,203,150,207,190,255,228,147, 79,164,103,206,156,169, 48,127,254,252,119,125,124,124, 12,121,121,121, 87,243, +243,243, 35, 75, 19, 57,113,117,113,254,168, 87,231,150,232,218,111, 36, 4,112,248,114,194, 87, 56,116,232,200,135, 0,222,136, +193, 82,123, 6, 4,248, 85,170,114,229,171, 25,179, 21,213,171, 84, 36,135,207,222,238,253,243,178,111,187,168, 61, 3,154,190, +174,201, 18,139, 72,216,188, 49,239,118,179,218,128,137,203,182,151,184,190, 87,131,247,174,131, 16,223,103,166,154, 0, 28, 10, +222, 83, 74, 19,226,175,110, 44,147, 73, 8,107,251, 94,168, 72, 38, 93, 80, 35,196,173, 81,247,174, 29,196,157, 59,180,133,183, +151, 7,226,226,147, 52,123,246, 29, 88,189, 75,188,239,231, 58, 45,251,157,137,127, 26, 51, 54, 59,246,234, 61,123, 52, 61,235, +190,155, 66, 5,155,199,243,203, 69, 34, 73,106,210,173,237,158,175, 97,172,220, 59, 55,241, 12, 57,243,125,139, 14,141,106,187, +213, 93,121,204,228,220,160,243,104, 36,102,163,239,158,221,191,245,245, 8,234,121, 10,192,252,212,187,187,143,150,164, 37,151, +203, 61,247,237,219,231,209,161, 99, 39, 23,143,160,158,135, 0, 36,189,224,149, 12, 32, 69,102, 77,187, 34, 18,115,190, 60, 47, +104,227, 31, 92,108, 96,127,122,185, 77,135,142,159,119, 55, 90, 41,230,127,191,229, 27,125, 78,242, 55,177, 17, 23, 99,213,158, + 1,159,235, 82, 34,247,150,102,223,149,154,218, 62, 34,222,214,197,167, 66,165, 62,159,142,153,220,184, 93,155,150,146, 42, 21, + 60, 72,116,124, 42, 61,118,226,172, 37, 32,180,227,133,196,248,167,219, 5,155,176, 95,159,254, 48,185,140,229, 93, 76, 8,217, +210,189,207,144,119,123,244,234, 15,103, 39, 71, 88,204,230, 26,167,142,237, 95,249,243,119,243,154,170, 61, 3, 6,149,198, 28, + 82,193,246,245, 47,115, 70, 86, 3, 4,124, 48,250,219,233,132,144,141,246,212, 65, 12, 6,227, 53, 12,150, 72, 38,250,182, 81, +163, 80,183,207, 71,126, 40, 27,182,252, 52,158, 94, 61,104, 72,126, 67,230, 74,237, 30,232, 41,150, 75, 62,228, 56, 73, 57,112, +156, 82,176, 90,159,230, 34,109, 5, 77, 72, 40,177, 59, 42,245,238,238, 56,143,160,158, 65,203,126,217,246,109,248,237, 7,173, + 62,121,191,167, 67, 5, 95, 13,103,181, 81, 92,188,126,135,255,238,151,173, 57,153, 89, 57,231, 41,165, 95,217, 99,174, 0,128, + 82, 90,109,209,194, 5, 30, 26, 55, 57,114, 13, 54,140,252,124, 42,230,205,154,238, 88,209, 67, 1,163, 69,192, 15, 7, 19, 82, + 3,115,151, 94,251,186, 71,173,217,123,206, 37,253, 60,120,230,181,155, 0,244,175,210,116,119,150, 98,244, 79, 15,161, 84,136, +225,172,146,130, 43,232, 89,252,157,185,250, 97,124,131,183, 63,233, 94,121,218,172,245,145,191, 0,144, 0,144, 1, 48,190,186, +130,173,217, 70,237,236,190,189,227,224,111,202,169,156, 61, 49,176,119,167,160,179, 71,118,158,141,143,143, 69,133,154,205,140, + 60,207, 31,203,205,201, 92,162, 75,125,116,167,164,253,174, 84,169,210,251,221,186,117, 83,143, 27, 55, 78,234,235,235,139,109, +123, 78,250,182,121,119, 76,135,196,228, 52, 13, 0,248,120,185,107, 63,126,175,235,145, 67,135, 14, 37, 36, 36, 36, 72,231,207, +159,223, 98,219,182,109,245, 1,108,176,187, 2,167, 20, 54,158,130, 23, 40, 4, 42, 32, 35,191,244,189,183,175,234, 14, 35, 98, +249,244, 47, 39, 77, 83, 38, 25, 28,241,221,202,135, 8,174,234, 65, 58,245, 29,169,220,246,203,220,137, 0,250,190,110,180,202, +100, 5, 22,156,176,211,183,114,196,119,229,247, 75, 60,220, 28,165, 16,113, 4, 34, 17,129,136, 35,200, 55,218,240,254,144, 49, +101, 58, 87,106, 53,234,246, 36,184,126, 80,229,193,239,191, 71,106, 5, 84, 69,174,129, 34, 45,215,138,155, 49, 6, 40,101,229, +208,167,255, 32,244,127,239, 61,241,197,139, 23,219,108,219,190,243,142,127,112,199,199, 81,225,135,107,216,209,176,122,236,219, +177, 14,110, 78, 82,112, 4,200,200,179, 33, 38,197,136, 79, 71, 14,245, 40,163,177,114, 25,218,189, 74,231,219,235,219,182, 14, +240,115,172,126,235,113,118,196,224,153,215,150, 30,139,175,213,100,250,130,154,208, 27, 77, 24,246,249, 84,164,107, 99, 90, 31, + 57,184,175,181, 91,141,246,145,188,213, 48, 57, 59,250,252,158,151,105, 26,141,198,172,142,157, 58, 59,123,123,121, 42, 87,175, + 90,217, 49, 51,199,128,204,236,124,164,101,230, 32, 61, 35, 11, 73, 41,233, 72,212, 38, 33, 33, 62, 81,200,210,102,227,240,161, +131, 92,183,110,221, 74,221,109,106,176, 8,184, 21,157, 15,191, 26, 13,225,234,225,131,208,246,131, 43,221, 60,189,117,143,131, + 87,205, 57,249,201, 15, 38,219,163,225,224, 85,115,105,223,126, 31, 12,239,251,110, 79,113, 77,255, 10,156, 54, 53,155, 94,188, +122, 35,115,201,210,165,247,154,181,120,171,118,215, 78,109, 93,135, 13,238,253,214,131,168,248, 86, 91,119,236, 89,161,246, 8, + 88,171, 75,141, 28, 86,218,200, 21, 33,100,211, 91,221, 7,191, 27, 20,214, 30,143,162,158, 32, 42,226, 26, 90,181,233,132, 14, + 93,223,129,201,108,122,127,221,202,165,215, 0,124,255,162,237, 93,252, 91, 72, 0,168,126,159,238, 64, 49, 64, 11,206, 83, 83, +174, 84,237, 93,219,205,197,191, 69,209, 73,170,207,138, 58,107, 5,131,193,120,179, 6,139,136,101, 93, 63, 31,220, 89, 54,241, +199, 75,120,122,117,171, 33,249,230,246,103, 39,166,111,112,191,232,132,240,173, 85,158,107, 72, 75,188,195,128,144, 96,137,115, + 69, 76,240,240,241, 25, 49,224,195, 81,226, 74,190,158, 92,158,193,102, 75,210, 38,208,163,123, 55,127,234, 92,161,254,172,156, +248,155, 63,190, 76,147,248,119,146,209,168, 67,230,212,187,187, 35, 0,244,244, 8,234,233,121,238,202,157, 73,174, 46,142,253, +120, 94, 64, 78,174,110,107, 78,110,222,156,212,187,187, 83,138, 85,252,164,248,120,169,151,165,211,197, 81,138,113,171, 31,193, +104,230, 65, 41,224, 81, 78,134,185, 59,227, 32, 22,145,212,218,185, 75,231,125,211,195, 48,114,199, 5,243,150, 73,123,125,155, + 3,248,153, 82,154,247,210,116, 2, 16,113, 4,106,165, 4,106,185, 24,142, 74, 9, 56,242,187,198, 72,253,221,184,186,111, 15, +235, 94,121,250,156,141,145,191,124,181, 50,226, 44,128, 71,197,199, 59,189, 40,157,142, 94,117, 62,112,245,172,176,172,199,199, + 51,157, 98,179, 56, 72,108,128,155,119, 21, 50,109,250, 76,103,133,140,131, 82, 66,157,239, 68, 70,127, 48,114,212,103,221, 85, +222, 53,218,234,147, 30,134,191, 42,143,116, 58,157,252,189,247,222,147, 90,173, 86,243,144,207,231,182,138,137, 79,237, 52,123, +218, 56,121, 69, 31, 15,240, 2,197,221,135,241,213,103,204, 90, 92,241,192,137,203, 7,250,118,172,119,200,221,221,221,197,100, + 50, 9,165,201,247,172,236,220,245,155,118,157,152,186,108,241, 2,196,166,232,176,113,243,118,240,188,109, 77, 9,166,236,119, +154, 51,103,206,244,174, 93,187,182, 52, 34, 34, 34,153, 82,106,120,238, 88,119,241,243,171,136,117, 91,227,144,153,103, 69,116, +178, 9, 77, 3,106, 19,202, 91,219,149,178,124,134,126, 49,102,120,119,129, 2,139,151,253, 88,100,184, 66,166, 44,223, 14, 0, + 41, 0,174,150,148, 78, 2,130,242,142, 82,204,222, 17, 11,165, 76, 12,165, 76, 4,165,188,224,255,115,254,218,238,125,215,233, +242,189,127, 90,242, 45,137, 73,179,226, 86,156, 5,185, 58, 43,172,188, 0,128,194,108,166, 72, 73,201,130, 62, 47, 19,219,119, +236,134,201, 10,146,151,155, 91,169, 36,205, 34,220, 28,165,248,122, 83, 12,148,242,130,116,214,175,236, 96,119,253,240,188,166, + 79,157,206, 39,206,165, 73,106,234, 14,153, 46, 69, 63,186, 50,243,202,109,237, 85, 74,105,166, 71, 80, 79,152,109, 20,249, 6, + 43,238, 61,181, 65, 48, 74,209,179, 99, 8,234,186,148, 15, 88,190,254,212, 6, 66,136, 83,209,249,249,188,102, 66,228,165,218, + 30, 65, 61,157,147,242,149,143, 22,236,138,117,247,243,116,130,151,139, 3,220, 53,174,168, 89,179, 6, 92,212, 18, 56, 41, 69, + 80,202, 68, 92,203,142,189,209,161, 99, 39,131,192,219, 82, 74,147,239,148, 10, 3,222,233,220, 98, 43, 5,100, 68, 36, 75,240, +241,171,230, 23,214,113,136, 34,164,253, 96, 88,205,198,137,106,207,128, 83,186,148,200, 19, 37,105,186,184,121, 13, 30, 50,228, + 19,105,101, 79, 57, 78,156,189,100,155, 52,101,202,237,220,236,220,185,186,212,200,187,199,143, 30,211,148,115,115,157, 54,249, +171,111,155,181,105, 90, 95,212,166, 75, 63,233,225,195, 71,251, 2, 24, 86, 82, 58,213,158, 1, 28,128, 79,170, 5,212, 25,255, +254, 39,159, 87, 74,204, 48,195, 69, 83, 29,183,111, 92,199,209,237, 43,110, 24,117, 89, 11,143, 31,216, 57,254,171,217, 43,234, +117,237,209, 23, 7,118,111, 29,167,246, 12,248, 65,151, 18, 73,139,107,186,248,183,232,224,231, 87,121,163,135,167,167, 91,113, +125,129,138, 48,125,238,114, 24,243,179, 80,201,187,156,183, 99,205,142,169,148, 16, 80, 10,164,167,165,152, 93,252, 91,116,201, +138, 58,123,162, 52,245,124,105, 97,154,255, 77,205, 18, 8, 1,224, 14, 32, 13,192,181,231, 62,163,240, 61, 94,240, 57,189,176, + 9,118, 3, 96, 46, 12, 90, 20, 81,244,249,101,203,139,182,143, 0, 80,171, 80,147, 47,172,251,179, 74, 52, 88,133, 94,131, 20, +107,232,127,247,249,119, 7,148,183,250,122,120,122,193, 70,227, 64,240,191, 85,252, 66,223,211,127,246, 73,111,165,166,126,111, +157,246,166,253, 99,178,148, 62,254, 62,206,126,229, 78,126,250,217,151,206,195, 63,232,230,120, 63,222,152, 27,241, 84,151, 75, + 85,128,155,159,155,168,110, 39, 79, 33,109,219,194,233,206,154,186, 89, 57,218,219,219, 94,164,225,225,228, 26,237,219,104, 72, +166,201,160,155,154,113,119,251, 1, 74,105, 10,128,207, 60,130,122, 78, 44,140,110, 61, 51, 40, 30,245,122, 53,145, 43,156,103, +251,132, 12,112, 43, 60, 88,175, 36, 51,207, 2,158, 47,240, 97, 28, 71,144,111,228,161,144,113,105, 53, 50,151, 60, 51, 87,231, +232, 71, 31, 91,133, 95, 37,197,205,213,139,141, 36,144,145,103,133, 90, 46,134,131, 82, 2, 7,165,248, 89, 4,139, 16,162, 94, + 62,182,222,219, 35,222,174, 58,125,222,198, 71,171,166,252, 20,113, 22,192, 67, 74,233, 43, 51,208,209, 35,160,177,188,156,251, +138,143,190, 92,226,112,254,161, 14, 26, 87, 25,130,252,156,224,172,146, 33, 49,179,224,130, 83,155, 97,132,209,226,136,158, 31, +205,112, 62,188,237,251,171,229,124,130, 86,103, 39,222,253,164,164, 8,211,182, 61, 39,171, 70,199, 37,117,218,182,118,145, 60, + 83, 15, 60,205, 20,144,145,103,134, 89,228,130, 41,211,102,200, 39, 78,156,208,133,234,211, 18,252,253, 92,181,101, 56, 81,230, +238,216,125,120,114,237,224,102,220,233, 83,167,112, 55,252,252,214,210,142,191,170, 88,177,162,109,233,210,165,229, 86,172, 88, +241,150,139,139,203,211,172,172,172,187,133,199,178,130, 91,197,160,148, 35,167,175, 85,170, 83,169, 10,137,207, 48,163,102, 5, + 71, 60,186,123, 73, 16, 75, 36, 7, 95, 25, 97,172,221, 99, 38, 1, 9, 6, 0, 10, 26,174,246, 12,128,213, 70,241,243,145,132, +194, 50,192,133,141, 31, 59,220,147,231, 41, 22, 44,249,193,174,241, 87,132, 0, 34, 17,129, 74, 46,198,173, 35, 43,179, 77,134, + 28, 11, 1, 87,104,174,132,132,178,214, 52, 2,165,120,154,110,134,222,196,195, 96,225,193,243, 54,112,214,108,100,229,100,225, +215, 77,171, 97,178,240,104,248, 86, 31,184,187,151,199,218, 69, 19,236, 30,199,199,113,128, 66, 38,130, 66, 38,130, 82, 42, 66, +126,161,119,246,168,211, 99, 59, 40,201, 22,139,196,121,218, 91, 59,190,180, 71, 75,161, 46, 87,111,253,202, 5, 56,118, 46,188, +213,153,199,235, 66, 60,130,108,203, 61,130,122, 46, 4, 0,139, 77,128, 62, 63, 7,106,107, 28,154, 87, 74,135,155,138,199,195, + 44, 13,110,197,139, 29, 74,186, 89, 36,245,238,238, 28,143,160,158,195,110,157, 63,184, 75,220,170, 23,178,117, 60,226,228,102, +168,228,226,194,151, 8,247,111, 95, 65,114,142,112, 22,196,165,125,234,131,221,230,210, 28, 91, 93, 74,228,241,194,202,184,200, +208,184, 39,255, 52,110,253,187,163,151,119, 8,237, 56,132, 60, 12, 63, 54, 25,192,137,146,116,156,156, 93, 37, 81, 41, 60,158, +196, 69, 11, 97,161,141,197, 87,207,157, 12, 62,118,250,226,175, 27, 54,109, 49,118,126,123,160,178,109,179,250,162,248, 12, 51, +150,253,118,159, 70, 36,130,200,212,110, 82, 59, 34, 86,156, 74,237,184,121,221,134,205,125,107, 87,175,128,228,108, 43,180, 89, + 22,156, 11,127,140,181, 43, 39,100,235,210, 98, 6,216, 76,121,249, 84,224,115, 78, 28,221,123,120,216,232,137,168, 85,187,126, +165,179,167, 14, 59, 1,200,121, 78,238,227,111,103, 47,112, 83,171,255, 88,101,167,165,104,161,203,215, 65,166,114,130,202,201, + 21, 54,155, 0, 43, 79,145,151,151, 39,155,248,233,192,225,246,236, 63,131, 81,138,104,183, 61, 62,196,157, 16,178,159, 82,218, + 21, 64, 91, 0,178, 98,159, 65, 8,217, 95,216,126,253,238,243,196,137, 19, 39,207,153, 51,231, 94,209,186, 69,203,139,214,125, +213,242, 98,219,187, 77,154, 52, 41,104,238,220,185,179, 27, 55,110,188,245,226,197,139,209,118, 25,172,226, 59, 67, 8,121,105, +197,230, 89,167, 71, 40,165, 34,145,143,187, 3,170, 84,170, 0, 87,229, 7, 74, 77,131,190, 58,177,152,112,235,150, 78, 86,196, +100, 75, 33, 18,113,186,210,152, 43,185,184,220,217, 31, 87,110,112, 8,171, 83, 73,177,104,119,226,147,196, 76,179,153,183, 89, + 57,147, 33, 79,154,169,125,172,206, 77,141, 81, 59,122, 86, 23, 25,114, 83,190, 65,193, 64,211, 63, 32,147,201,185,101, 11,166, + 7,157, 62,115,126,235, 94, 7,199,108,175, 6, 3,231,137,101,230,213, 69,198,138,144, 25,156, 71,253,135,239,202, 21,170,169, + 1,117, 90,104,188,107,132,150,187,122,104,221, 35, 59,236,185,104,194,228,233,207,204,149, 85,159,133,249, 43,247,231,181, 41, +127,126,110,145,185,218,148,218,255,131, 14, 45,106,120, 30, 18, 75, 50, 74, 44, 64,224, 19,222,255,232, 51, 41,225, 0, 14, 28, + 8, 7, 16, 42,164, 16, 66, 84,203,198,212,235, 57,170, 87,213, 25,243, 55, 61, 92, 61,233,167,123, 69,230, 42,179, 36,205,124, +177,234, 54, 49, 26, 83,226,162,238, 41, 70,119,110, 34,246,243,114,134, 82, 38, 70,182,206,134,108, 61,143,132, 52, 35,158, 36, +235,112,247, 73, 26,120, 67, 46,222, 27,245, 13,183,118,254,167,157,236,201,159,131,167,111,116,152, 63,107,178, 60, 67, 7,100, +228,243, 72,202, 52, 34, 33,221,128,132,116, 3,148, 82,160,113,187,126,242,243, 7,215,117,242,247,115,253,165,180, 39, 83,234, +221,221,122,143,160,158,151,180, 73,233, 77,253,171, 7,130, 28,216, 91,203, 35,168,167, 79,234,221,221,137,246,106,236,219,183, + 47,205,215,215,215,243,167,159,126, 74, 93,188,120,113, 93, 95, 95,223,192,196,196,196,223,220,220,220,134,124, 57,250,195, 51, + 63,174, 89,236,211,170,219, 16,113,221,106, 65,220,147,123,167,133, 35, 59,127,214, 27,244,249,243, 95,157, 71, 36, 56, 62,252, +215,246, 0, 80,181,213,167,149, 1, 56, 44,251,238,167,103,209, 44, 80,192,102,163,216,126, 33,165, 20, 21, 7, 32,230, 10, 12, +150,201,144, 99,137,187,188,193,243, 77, 84, 72,188, 0, 24,205, 2,140, 22, 1, 38,139, 0,137, 45, 11,171,190, 95, 8,179,141, + 71,104,219,126,144,171,156, 64,100,206,136,207,181,129,130,216,173,203, 17, 82,104,174,196, 80,200, 68, 48, 89, 11,170,132,165, +179, 38,138,130, 2, 3,209,186,219, 64, 71,123,181, 28, 29,148,200,211, 91,160,114,246, 70,248,137, 13,170, 3,199,175, 78,154, +191,124,213,151,185,249,122, 36, 60,188,130,198, 46,105,240, 47,111,198,213,167,142, 56,250,212, 15,213,171, 86, 1, 39,222,109, +111, 25,218,237, 81,231,237, 93,185,181,234,191,237, 82,181, 6,228, 82, 17,228, 82, 14, 50, 41,135, 39, 15,239,225,215, 77,235, + 34, 0,116, 79,189, 91, 58,115,245, 18,195,149,166,246, 12, 24,249,232,198,241,232,102,221,135,195,197,211,175, 94,169,174, 38, +190,157, 98,226,109, 54,203,123, 31,124,162,238,214,233, 45,113,147, 38, 77, 28,174, 61,204,194,220,181,167,249, 11,135, 55,104, + 37,114, 39,165,111,147, 97,110,246,152, 43,185, 66,177,126,227,230,109,125, 43, 87,244,194,209,171, 49,184,241, 56, 27, 78,206, +206, 16,169,189, 17,208,114, 72,185, 59,135,150,190,195, 91,244,235, 69, 50,213, 71, 33, 97,205, 65, 41,197,195, 7,119, 51, 1, +188,168,110,254,241,235, 41,227, 59,187,123,120, 20,191,114, 71, 85,255,234,232,220,253, 93,156, 56,189, 29,209, 81,143, 32, 80, + 10, 74, 11, 76,125, 70,122,106, 6,128, 95,192, 96,252, 73, 38,235, 85, 62,164,200, 56, 61,111,136,158, 55, 90, 69,239,139,214, +155, 51,103, 78,215,231,130, 8, 93, 95, 18, 92,248,195,122, 69,219,207,157, 59,119,118,177,239,245,118,119, 17, 22,237,212,203, +118,206,189,238,219, 77,229, 50,213,209,239,231,140,225, 82,115,172, 80,202, 68, 80,251, 85,133,255,135, 99, 84,239,181,112,135, +214,232,130,253,251,215,230,218,120,126,191,189,230, 74, 38,118, 58,179,228,187,213, 82,255,202, 26, 50,125,107,236, 35,147,165, +224, 74,217, 98, 50,136,159,222, 58,162, 78,136, 56,102,224,121,126,141, 72, 42, 15, 1,197, 43, 27, 37, 63,175,114,104,210,178, +157,170,101,203, 86,170,163, 39,207,205, 63,112,240,224,103, 0,252, 1,192,187, 97,204,133,224,198,157,131, 52,254,117, 84,121, + 38, 2,153,148,179, 55,183,249,249,179,167,163,162,135, 2, 70,179,128,111,127, 60,148,219,194,249,228,140,226,230,202,211,183, + 90, 5,169, 66,109, 87, 87, 79,226,181, 77, 77, 94, 80, 80, 84, 75, 62,175,243,246,232,119,171,206, 88,176,249,225,154,137, 63, +222, 59, 3, 32,210, 30,115, 5, 0, 84, 27,110,112,242, 13, 12,219,189,110,193,140,131, 91,150,190, 69, 64,221, 2,106, 84, 19, +183,107,223, 94, 81,191, 97, 83,121, 90, 14,197,253,152, 52,152,242,179,240, 86,227,154, 56,180,107, 3,159,154, 20,107,215, 24, +143,180,140, 28,141,159,143, 39, 98,210, 5, 60, 77, 43, 48, 86, 9,105,122, 36,102, 24,144,149,111, 70, 72, 21, 79,232,116, 38, +205,107,156, 79,187, 47, 93,186,212,180, 81,139,118,120,103,192, 39, 65,251,127,219,112,199, 35,168,231,167,169,119,119,111,182, +103,227,237,219,183,243, 26,141,230, 81, 74, 74, 74,203,185,115,231,166, 86,171, 86,173,226, 55,223,124, 51,205,219,219,219,109, +252,184,207, 98, 26, 55,110,188, 97,193,178, 85,205,246,109, 92, 92, 9,132, 30, 52, 25,141, 83,116, 41,145,145,118,156,228, 72, + 75, 75, 3, 39,145, 59,125, 49,102,184,187,163, 82, 12,142, 0,217,122,222,115,209,210, 31, 82, 22, 46,253, 97, 47, 10,198,101, +133, 86,110, 59,105, 15, 74,184,147,144, 35, 5,227,174,212, 10, 49, 8, 41, 40,123, 47, 27, 76, 14, 0,156, 72,146,154, 92,194, +128,114, 74, 1, 27, 79, 97, 48,243, 48, 89,120,152,173, 60,212, 42, 23,116, 31,248, 41,114,116, 22,152,136, 26, 17, 79, 13, 72, +200,200, 64, 21, 79, 37, 4,193,254,241,201,137,153,102,116,106,224,138,244, 60, 27,178,116, 60,164,226,130, 52,239,191,145,137, + 39,250,156,210,117, 33, 8, 64,121, 55,103,168, 50,129,206, 99,119,161,117, 3, 95,156,218,187, 74,124,225,234, 29,124, 59,119, + 57, 60,122, 52,198,234, 91,254,144, 59, 85,128,220, 89, 14, 43, 45,229,180,124,148,142,186,121,102,119, 91,255,170,227, 29,100, + 18, 41,100, 18, 17,146,226,163,177,105,237, 79, 9,130, 32,180, 79,189,187, 59,247, 13,214,255,190, 46,174,238,144, 75, 56,240, + 86,179,174,180, 27, 39, 37,196, 87,159, 63,115,226,144,243,151,123, 77, 11,233, 52, 84,118,102,231, 50,211,221,171, 7, 62,214, +167,168,183, 85,109, 90,254, 94,241,136,217, 75,204, 21, 17,139, 37,107,127, 90,189,121,128,151,151, 7,118,159,184,141,181,171, +190,131, 79,237, 78,136,186,121, 4, 21, 27,244,128, 67,149, 86,144, 59,255,250, 9, 17,137,235, 12,251,108, 74,175,250, 13, 27, +227,210,249,147, 72, 77,209,254,164, 75,137,252, 67, 20, 51, 43,234,236, 9, 23,255, 22, 14,177,177,209,197,199, 96,105, 4, 1, + 17,109, 44, 2,162,163, 30,225,102,248,229, 64, 0,197,163,212,108, 12, 22,227, 79,161, 36, 31, 82, 82,212,169,148,102,110,255, +139, 76,214,243,203, 9, 33,251, 39, 78,156, 56, 25, 0,157, 56,113,226,228,162,207,115,230,204, 49, 60,119, 94,188,220, 96, 21, +237,220, 11,187, 77,234,190,221, 84, 46, 85, 28, 93,183,124,138,114,203, 85, 30, 11, 14,133,163, 94,117, 15, 72,165, 98, 56, 40, + 60,113,226,110, 14, 46,158,219,155,119,227,218, 37, 35,225,204,147,236, 49, 87, 18,162, 62, 57,111,241,143, 89, 1,213,253,100, +223, 29, 76,186, 97,180, 8,132, 82, 72, 8, 32,182, 9,188, 83, 66,196, 49,215,108,146, 81,159, 38,216,115, 7, 28, 17, 44, 54, +138,216, 84, 51, 8, 1,154, 54,111,173, 56,122,236,132,242,217,183,156,196,181, 98,205, 96,213,253,167, 58, 72,197, 28, 60,202, +201, 96,239,237, 52,238,229,100,152,179, 35, 22, 18, 49,151,218,194,249,228,188,226,230,202,203,183, 90, 5, 71,103, 39, 8, 2, +121,214,112,150, 50,131, 85,139, 63,171,211,243,179,119,171,205, 88,188,249,241,186, 9,223,223, 59, 99,111,228,170, 56,185, 9, + 17, 89, 0, 70, 63,235,150,240, 13,116,185,118,237, 90,251,114,110,238,203, 90,244,158, 90, 62, 63,199,140,182, 77, 10,204,213, +221,179,219,222,214,165, 68, 30,176, 87,219, 98, 19, 16,151,162, 71, 76,178, 30,137,133,209,171,132,116, 3,148, 50, 17,140,230, +215,158,110,233,251, 35, 7,118,119,179,242,104, 81, 43,184, 37,222,253,112,162,203,177, 61,235, 55,121, 4,245, 52,164,222,221, +109, 87, 24, 67,171,213, 26, 92, 92, 92, 46,230,228,228,244,220,178,101, 75,102, 72, 72,136,168, 92,185,114,153, 0,228,224,205, +150,203,167,118,199,228,229,228,188,111,177, 88,174,149,226, 36,135,197, 82,208,189,106,181, 81, 44,216, 21, 7,169,152,123,102, + 52,138,248,118,202,167,158, 2, 69,247,105,179,151,151, 16,185, 4,116, 38, 30, 42,185,248, 89, 28,137, 10, 54,143, 31,127,250, + 9, 46, 14,146,130,177,121, 34,130,204,124, 43,146, 50, 45,152, 62,113,180, 93, 3,202,109, 60,133,201,202,195,108, 41, 48, 89, + 49, 58, 30, 57, 6, 37, 30, 39,241, 72,204,204,134,185,240,130,197, 38, 20, 12, 86,182, 7,145, 72,146,250,118,159, 65,127,248, +125,165,202,193,168, 16,139,161, 86, 20,236,129, 71,237, 30, 35, 1,146, 43,146, 72,141, 73, 55,183,253,246, 50, 61,129, 10,144, +203,100,240,245,114,133,197,202,227,200,149, 56,116,105, 19,138, 70,161,193, 32, 18, 25,174,231,213,135,220,201, 1, 84, 68, 96, +227, 41,204,214,210,149,169,212,187,187,147, 61,130,122,142,189,117,233,232, 47,237,187,244, 66, 86,122, 18, 54,252,178, 34,199, +106,181,182, 77,189,187, 59,233, 77, 85,252,106,207, 0, 15, 7, 39,151,165, 13,154,180,133, 33, 59, 9, 25, 73,209,191,149, 86, + 67,159, 22,145, 5, 96,185,197, 98,156,198,113, 4, 16,204,208,167, 60,218, 1, 64, 0,234,219, 35, 49, 98,214,226,159,222,175, + 80,161, 2, 14, 95,120,128, 57,147,134,222, 80,169, 29, 43,123,182,114, 42,199, 87,175,135,216, 59, 71,225, 90, 57, 27, 14, 30, +213,125,251, 15, 24,226,219,161,243,219,184,123,251, 58, 86, 44,156,113, 9,192,236,151,137, 22,154,165,103,206,217,197,191,197, +156,198, 45,218,193,108,229, 17,218,180, 45,110,134, 95, 30,149, 21,117,118, 56,107,254, 25,127,149,201,178,115,189,174,175,249, + 59, 93, 81, 48, 86,203,221,222, 8,214,156, 57,115,238,205,153, 51,231,133, 17,177, 18, 13,214,171,204,213,218,165,147,149,155, +174,240,136,140,205, 68,187,134, 62, 72,210, 38, 96,219,150,239, 4, 74, 41,228, 10, 89,178,205,102, 59,100,160,182,241,217,225, +251,114, 74, 50, 87, 98,170, 56, 58,107,193,146,123,117, 3,107,136,126, 56,154,122, 78,111, 18, 40, 17,136,132,136,168, 68, 16, + 56,177, 72, 44, 87, 11,130, 80, 11,188, 43,103,239,161,178, 9,244,217,149,189,133,167,160,248,125, 38, 89,109, 2, 4, 1, 16, + 10,175,252,237, 51, 64,128,206,200, 67, 41, 19,165,213,200, 90,242,123,115, 85,161, 90, 5, 71, 39, 39, 40,164, 34,208,194, 70, +180,148,230, 74,185,120, 84,157,158, 99,250, 84,251,102,233,214,199,235,190,248,254,206,233,242, 53, 59,123,138,229,206,110,222, + 13, 6,252, 47,103,108,212,144,116, 99,243,209,210,104, 23, 26,174,173,106,175,128, 42, 73, 81,215,191,109,215,185, 31, 14,238, + 90, 95,100,174,246,217,171, 83,222,205, 89,123,253, 94,108,117, 11, 45,135,216,100, 29, 18,210, 13, 72,201, 46,240,187,238, 78, + 82, 36,196,199, 65,173,150,219, 61,254,202, 35,168,231,103, 28, 33, 31, 11,148,110, 72,189,187,123,126,234,221,221,102,143,160, +158,109, 79, 28,250,109,113,244,147, 71,163,194,218,244, 70,253, 86,189,112,120,211,130,175, 0,236,182, 87, 55, 43, 43, 43,183, + 92,185,114,167,199,141, 27,247,246,170, 85,171, 50, 1,136,243,242,242, 84,239,188,243, 78,133,244,244,244,145,148,210,216, 82, +158,120,176, 88, 44,224, 45, 6,213,226,197,139,159, 77,132,201, 73,228,202,233,147, 62,243, 20, 40,186,127, 59,111, 5, 40, 5, + 78,220,206,182, 71, 48,225,189, 15, 63,251,195,152, 43, 23, 7, 9, 70,253,244, 0,234,103,227,134,196,104, 91,223,213,206, 52, + 22,148, 99,179, 69,128,201, 90, 96,176,140, 22, 30,137,233, 38,100,228,253, 62,184, 96,181, 81, 8,118, 94, 82, 20,159,138,193, + 51,168,231,182, 21,115, 39,137,246,134,103, 66, 33, 22,195, 65, 37, 17,148, 82, 9, 0,224,199,133,147,197,213, 2,106,225,173, +206, 3, 20,175,142, 96, 81,156,185,246, 8, 43,118,220,194,210,201,189, 33,230, 8, 70,205,220,134, 1, 29, 2, 32, 8, 2,146, + 30, 93,135,119, 64, 35,200,101, 5, 50, 69,166,176,132,115, 39, 12,133,119,214, 82, 74,175,165,222,221,189,202,183,102,139,197, +209, 55,247, 59, 24,141, 22,193, 68,156, 58,164,222,221,253,168,112,221, 32, 0, 82, 0, 38, 74,105, 68, 25,140,149, 43,128,126, +126, 85,107, 78, 25, 50,230, 91, 79,149, 83,121,236, 92,191,156,162, 20,119,204, 2,128, 96,179,114, 0, 42, 0,200,161,133,153, + 65, 10,238,112,145, 1,112, 19, 4,139,184,164,232,149,155,135,207,248,154, 53,107,225,242,189, 4,204,155, 60,236, 70,126,122, + 76,127,179,209,117,168, 53, 63,105,108, 96, 80,125,120,123,148, 71,114,114, 18, 90,118,239,132,246,237, 59,224,238,237,235,152, + 51,109,220, 37,163,209,208, 94,151, 18,105,176, 39,157, 46,254, 45,234, 4,213, 11,249,164, 90,205,186, 72,203,200, 68,149, 26, +117, 80,163,118,131, 79, 92,252, 91,252,148, 21,117,246, 14, 24,140,127, 14, 7, 0,116,121,222, 8, 61,111,146,138, 69,160, 94, +196,181,226, 26, 69,235,191,204,192, 21, 31,147, 5,192,174,219,200,197,207, 59,198,162,207,238,117,223,110, 42,147,200,142,174, + 89, 50, 73,185,241,138, 13, 15,227,178,209, 46, 68,131,244,140,116, 28,222,249,115, 62,192,183, 77,189,187,231,170,189, 71, 67, +233,227,239, 35,162,178,131, 95, 77,159,121,160,121, 88,136,245,135, 99,137,167,243, 13, 84, 16, 8,145,136, 40, 21,115, 84, 36, + 22, 56, 42,145, 41, 29,197,229,171,132,148, 19,158, 92, 58,162,118, 15,252, 84,159, 94, 62,130,210,211,182,146,174,230,139,224, +121,138,226,237, 9, 45,252, 94, 40,186,237,216, 78,131,197, 17,130,245, 39,147, 82,107,231,253,239,110,193, 77,233, 5,230,202, +201,201, 9,114,105,193, 64, 96, 10, 2, 66,236,183, 88,132, 16,229,130, 17,117,222, 30,211,191,218, 55,203,183, 61, 89, 55,118, +197,157,211, 0, 30,138,229,206,110,235, 87, 45,149,123,187, 41, 32, 2,144,173,231,209,251,131,209,101,189,226,126, 47,184, 89, +231, 25,111,117,233,141, 3, 59,215,240,247,206,239, 44,149,185, 2,128, 46,173, 26, 28,153, 51,127, 89,197,113, 19,191,150,203, + 36, 20,121, 6, 43, 20, 82, 14,238,206, 50,184,170, 57,156, 59,242,155,169, 89, 77,183, 67,118,154, 43,167,138, 21, 43, 46,154, + 60,101,178,104,205, 47, 43,231,122, 4,245,220,159,122,119,119,100,234,221,221, 86, 0,163, 61,130,122, 62,244,241,245,251,174, + 98,237, 22,112, 46,239, 83,207, 35,168,167, 99,234,221,221,121,246,166, 53, 59, 59,251,169,159,159,223,163,239,190,251, 46,112, +212,168, 81,198,145, 35, 71, 86,208,233,116, 91, 75,107,174, 0, 64, 16, 4, 88, 44, 22, 60, 56,186, 72, 37,149, 74, 85, 0, 96, +179,217, 80,171,243,148, 52,129, 82,245,129,235,153, 0,144,242,245,236,229, 69,101,255,149,231,192,211,151,204,115, 69, 8,126, +103,174,212, 10, 49, 12, 38,251,186,242, 40, 40,172,188, 0,153, 24,200,214, 9, 48, 89, 5,152, 45, 2,108, 66,129,249, 42, 10, + 88, 73,196, 4, 54,129, 66,224, 75, 63, 63, 38, 5,114,170, 4,212, 68,245,252, 28, 40, 21, 4,106,169, 4, 74, 69,129, 15, 56, +124, 35, 7, 49,198,146,205,165, 64,255, 23,149, 50, 89,120,168,229, 5,219,155,173, 5,119,229, 38, 62, 56,179, 62, 37,234,202, + 0,175,234, 97, 34,223,128, 38, 48,201,237, 58,143, 92, 40,165,135, 8, 33, 29, 8, 33,237, 1,208,138,181,154, 8,123,118,253, +134,174, 93,187,234,226,111,239, 81, 17, 66, 90, 21,158,250,148, 82,122,150, 16,210,172, 36, 81, 7,175,128, 22, 20,220, 54, 16, +170,130,128,123, 94, 62, 21, 84,173, 58,188, 93,171,249, 91,157, 68,149,171,214,128,201,194, 99,227,170,165,244,210,137, 93,159, +234, 82, 34,111,150,230, 88,250, 84,170,142,164,196,216,207, 5,158,204,250,223,213, 24, 1,128,124,181, 71, 64, 59,165,139,175, +123, 9, 18, 78, 65, 33, 45, 43,196,165, 91,113,248,224, 65, 24,114, 83,190,226,205,249,122, 43, 71, 86,157,216,249,211,144,222, +195,103, 56,133,132, 52, 68, 57, 39, 21,220,202, 57,226,230,245, 75, 88, 48,115, 98,145,185,178,187, 59, 83,196,137,230,118,239, + 61,152,203,200,200,194,146,217,227, 49,236,139,217,104,215,253,125, 46,234,254,237,185, 0, 58,178, 54,157,241, 87, 69,174, 94, + 18,201, 74, 43, 22,121,250,195,231, 98,166,232, 69,159, 73,225,103,243, 75, 52,204,207,153, 42,243,115,203,205,207,233,221,122, +173, 8,150,136,136,142,173, 94, 50, 73,177,251,174, 8,209,137, 5,230, 42, 45, 53, 13, 7,126, 93,145,111,177, 90, 58,165,221, +177,223, 92, 1,128,200, 42,234,234, 93,209,123,236,136,254,221,200,154,115, 89,215,146,136,131,141, 32, 79,196, 73,228, 34, 78, +108,224,116, 38,145, 72,162, 20,113, 48, 91, 68, 65, 29,199, 93,188,181,207, 88, 63,227,233,157,233,106,207,212,202,142, 94, 53, + 55,230, 37, 63, 88,240, 34, 93,158,231,145,146,150, 5,111, 23, 21, 82,178,173,176,190,160, 49,225,121, 10, 66, 8, 84,114, 17, +244,186, 92, 8,188,181,196,154, 92,229,236,177,183,118,222,210,168, 34,115,181, 57,189,255, 7, 94, 62,191, 55, 87, 10,169, 8, + 92,225, 4,146,246,154,171,121, 35,106,247, 28, 55,160,192, 92,141, 89,118,235, 12, 10,186, 5,211,189, 27, 12,128,135,147, 20, + 35,127,184, 15,149, 66, 2, 23,149, 20, 34, 81,153,205,213,134,182,189,134,113,123,214,205,183, 69,222, 58,223,171, 52,230, 74, + 16, 4, 98,181, 90,241, 86,211, 58, 9, 55, 30,196,158,154, 57,227,171,214,161,109,251,202,155, 7,120,193, 96,230,145, 16,255, + 20,103,143,108, 55,105, 92, 36, 39,253,253, 92,181, 60,207,219, 19,214,213,153, 77,102,163, 88, 44, 85,191,251,118, 23,114,253, +198,205,237, 30, 65, 61,119, 0,184, 3, 32, 8, 64,175,122,129, 85,145, 13, 10,139,217, 96,180,247,234,224,119, 70,230,233,211, + 99, 43, 86,172,168, 35,145, 72,188, 14, 29, 58, 36,232,245,250, 95,203,120,162,195, 98,177,224,201,147, 39, 16,137, 68,224, 56, + 14, 28,199,129,183, 24, 84,211,191,157,159, 6, 0,130,213,148,111,206, 79,141, 72,187,183,103,106, 89, 43, 20, 17,199, 65, 37, +151, 64,173, 16, 61, 51, 89,102,171,125, 70,200,102,181,198, 46,251,105, 93,181,119,122,189, 35, 46,167, 18,225, 86,108, 62, 76, + 22,254,217, 29,175, 98, 17,224,230, 32,131,148, 26,144,120,115,135,141,130,127, 92,218,244,137, 69,226,188,142,221,255, 56,160, + 93,165,118,176,202,165, 4, 42,121,137, 55,188,193,106,179,161, 89,112, 53,184,121, 86,196,196,133, 5,189,106,223, 77,237, 3, + 15, 39, 17, 54,175,165, 72,189,187,123,144, 71, 80,207,153, 9,247, 78,127,149,112,247,248,123,111,133,122,139, 60, 21, 89,118, +156, 70,228, 29, 0, 2,128,125,148, 82, 91,133,128, 38, 81, 29, 59,118,240,229,121, 65, 75, 41, 61, 85,184,146, 12, 64,107, 66, + 72, 71, 0,118, 68,112,184,205,225,215,174,121, 88,108, 2, 78, 92,184,221,168, 89,163,250, 48, 91, 41,244, 70, 11,174,223,188, +133,189,219, 55,232, 35,239, 94,235, 95,154,115, 41, 41, 49,230, 72, 66,220,227,238, 3,135, 77,145, 7, 55,110, 59,124,207,214, +159,250,163, 48,218, 14, 2, 84,106,244,254, 29,175, 58, 61,106,137, 29,188, 56,106,206,166,121,105, 79,206,191,236,252,121, 24, +113, 51, 43, 58,197,236, 34,114,169, 6,145,220,113,168,204,201,123,153, 88,238, 48,205,167,241, 96,167,211,231, 47,227,193,173, + 11,240,118, 83, 35, 38,234,161,254,222,157,240, 31, 0,204,208,165, 68,234,237, 77,171,139,127, 11,175,128, 90,245,218, 57,150, +115,199,111, 91,126, 65, 78,118,198,252,147,135,127, 27,223,166,219, 7,168, 80,181, 86, 59, 23,255, 22, 94, 89, 81,103,147,193, + 96,252,125, 92, 43,225,243,155,208,124,163,188,212, 96, 9,188, 77, 81,222,203, 15, 59, 71,124,128,175,231,172,192,157,200, 56, + 28,218,246, 93,129,185,186,189,235,130,157,134,226,217,211,182,243, 83, 31, 62,155,203,106,116, 71,151,194, 65, 67, 94, 47,223, +120,252,186, 68, 0,251, 94,165, 9, 0,166,252,188,119,198, 78,152,177,170, 73,227, 16,223,230,111,117,112,178,241, 10, 80, 8, +228,185,171,113,184,171, 41,162,111, 31,207, 74, 79,120, 16,105,211,229,126,252, 42, 77, 66,136,124,250,135, 53,207,124,221,163, +214,236, 29, 23,204, 91,206,240, 67, 62,122,171, 73,117, 47,169,220,161,240,142, 44, 82,240,199, 17,200,164,162, 18,247,189, 72, +115,238,240,218, 61,190, 28, 80,227,219, 21, 59,162,214,143, 89,118,251, 12, 10, 6,180,167, 23,187,130,132,163, 66, 2, 39,149, + 20,229,212,210, 18, 53, 95, 96,174,186, 62, 51, 87,235,237, 51, 87,207,107, 82, 74,175,246,234,213, 43,120,232,208,161,178, 47, + 63,238,126,234,212,197,187, 81,219,143,108,235,144,145,145,171,225,121, 30,106,181, 92,219, 36,192,229, 72,117, 63,183,132, 59, +119,238,240,167, 78,157, 50, 81, 74,175,191, 74, 51,245,238,110,222, 35,168,231,182,235, 55,239, 12,105, 80,175, 54,126, 88,190, + 48,240,209,147,216,192,168,232,167,240,241,241,129,143,143, 15,114,109, 42, 68, 93,185, 11, 67,110,230, 11,159, 27, 89,210,190, + 83, 74,109,132,144,213, 95,127,253,245,244,172,172,172,153,246,204, 60,253, 34,205, 34,131, 85,100,172,138, 76,214,253, 35, 11, + 85, 82,169, 84, 69, 8,129,213,106,117,175,218,248,253, 96,123, 53, 95, 68, 86,190, 21,106, 69,193,148, 2, 42,185, 24,106,185, + 24, 22,222,190,116,166, 70, 93,170,189,230,151,252,143,118,110,251,117, 94,191, 15, 62,118, 10, 14,107, 69, 30,167, 16, 36,103, + 25,161,113,149,193, 81,198, 35,230,246,113,122,239,234,193, 44,179, 33,127,124,174,246,206,186,210,166,179,248, 84, 12, 30,129, + 61, 71,253,184,104,146,232,240,141, 28,200,229, 4,106,165, 82, 80,169, 68, 37,166, 51, 59, 59,239,194,194,101,191, 52,125,191, +127, 79,116,108, 84, 9,231,239, 36, 66,160, 5, 93,245, 69,217,147,118,111,143,249,179,190, 85,207,125,210,163,186,103,142, 33, +173,198,180, 56,243, 37, 66, 8, 87,148,127, 47, 40,159, 7, 9, 33, 34, 0,141, 0,116, 36,132,156,166,148, 54,124, 46, 29, 21, + 1,212, 1, 16, 93,120,142, 9,118,236, 59,177,216, 4,196,164, 24,113,241,226, 5,152, 12,185,136,122,244, 24, 71, 15,253,118, + 53, 47, 39,107, 21,128,237,186,148,200,188,210,148, 37,131, 53,119,244,252,169, 67,132,208,102,157, 58,119,126,119,136,108,194, +172, 85, 46, 81,143, 31, 10,130, 0,168,253, 59,203,124,170,170,107,115,130,153,102,220,223,107,142,187,185,247, 8, 15,250,233, +139, 52,117, 41,145, 54,181,103,192,143, 23,206,159,153,162,208, 52, 68,173, 46,147,187,107,111,237,237,238, 25,216, 1,229,253, +155, 66,123,107, 55,110, 92,216,124,240,186,205, 58, 17, 64,220,171,162, 86,175,200,247,190,181,131,155,113, 6,163, 25,247,110, + 94,122, 10, 96,210,253,219,151,251, 52,106,223,191, 98,213,192, 70, 92,236,227,187,125, 1, 44,121,157, 50, 95, 26,152,230,127, + 83,243,223,198, 75, 13,150, 88, 44, 49, 93,187,245, 80,222,233,195, 89, 8,191, 23,131, 99, 59,126,208, 89,121,251,205,213, 95, + 69,198,253,157, 87, 1,212,246,168,219,247,237, 75, 87,175, 47,170,219,160,177,171, 32, 20,187, 29, 73,224, 69,183,175,158,215, +101,196,133, 39, 88,205,186, 79, 83,110,110, 43,113,254,150, 79,222,174,252,214,215, 67, 10,102,104,159,184,219,167,142,149,110, + 21, 29,222, 39, 75, 37, 5,222,170,192, 98, 17, 82,248, 31,176,241, 86,123,158, 39,230, 61,166,111,181,143,190,219, 25,181,254, +179, 37,183, 79, 23, 69,174,138,175,144,173,183,192, 73, 37,133,163, 90, 10, 71, 71, 73,169, 31, 20, 41,149, 41,134,191,213,125, +136,221,230,234, 69,100,102,102,222, 32,132, 68, 44, 90,180,168,209,170, 85,171,170,125,241,197, 23, 49, 63,207,252,228, 23, 0, + 56,124,248, 48, 0, 32, 42, 42,138,126,247,221,175, 70,179,217,252, 72,167,211, 93,164,148,218,115, 43,252, 23,107, 87,253, 24, +152,220,229,221, 80, 63,255, 0,148,243, 10, 64, 99,159, 0,100,235,173,184, 23,159,137, 39,143,111,226,222,197, 3,183, 0,124, +102,231,201,221, 12, 64, 87, 0, 30,133, 47, 79, 0, 30,105,105,105, 30, 0,222, 38,132,164, 2, 40,254, 58, 66, 41, 45, 49,239, + 13, 6,195, 11, 13,214,227,199,143,127, 23,209,122, 93,146,178,204,104, 91,207, 21, 6, 19, 15,147,149,194,194,227, 89, 23,154, + 29, 81, 54, 1,192, 74,226,235,187,113,213, 15,139, 39,237,216,178,118,108,231,119, 63, 86, 54,168, 90,143,220,187,126,129,158, + 60,186, 81,167,215,229, 47,204, 66,198,124,154, 24,107,122,253,154, 20, 57, 85,170,213, 66,117,115, 54, 28, 20, 82,168,229, 34, +168,228,146,146,211, 9,180, 58,113,242,236,160,227,167,206,206,121,171, 85, 51,183,105, 31,246,192,142,131, 23,160, 86, 72, 33, +240, 60,250,190, 85,241,221,251, 91, 58,116,171,224,169,240,217,121, 42,225,236,168, 37,119,191,208,235, 45, 15, 75, 50,199,133, + 51,248, 95, 32,132, 4, 22,230,181, 13,128, 18, 64, 62, 10,230,166, 81, 2, 56, 95,210, 60,114,207, 93, 82,246,111,220, 56,108, + 59, 8,149,129,226,167,163,123,232, 62, 0,209,186,148,200,212,178, 30, 54, 67, 98,148, 22,192, 59, 14,158, 53, 90,220,188,114, +114,118,171, 14,189,131, 91,116,126, 79, 18,147, 97,133, 32,114,128,238,201, 57, 75,244,181, 95,111,241, 38,211, 20, 93,106,228, +201, 18,228,102,223,220, 55,191, 85,181, 54,159, 53, 46,239,223, 20, 46,126, 5,158, 50, 39,225, 14,158, 94,219,190, 71,176, 89, +123,235, 82, 34,203,124,119,159, 76, 38,127,223,191, 86, 3, 68, 70,220,130, 94,151,183, 41, 43,234,172,224,226,223, 98,211,147, +200,219, 83, 52, 85,235, 67, 44,149,191,255, 50,131,197, 96, 48, 74,105,176,172,130,173,237,244,153,243,143, 10, 2,175,228, 68, + 34, 3, 79,133,142,255, 52,115, 85,156,212,219,191,238, 34,189,123,239,181, 94, 62, 55, 66, 34, 17,181,251, 95,101, 44, 92, 75, +139, 58,127, 42,233,198,214,213,212,206,219,169, 82,211,141,182,165,219, 30, 47, 28,187,252,206, 61, 60, 55, 67,251,107,160,149, +183,248,109, 44, 0, 7, 20,204,208,158,246, 92,179, 97,232,247,225,152,103,221,130, 98, 0, 60,168,161, 52, 63, 96, 49, 27, 23, + 46,156,248,174,153,183,241, 63,235, 82, 34,143,148, 53,161,133,134,233, 12, 33,228,250,228,201,147,155,121,120,120,248,124,253, +245,215, 74,173, 86, 43, 57,120,240,160, 33, 47, 47, 47, 65,167,211,157,166,148,218,221, 5, 81, 56, 57,100,211,189, 59, 55,245, + 33,132,116,112,243,240,110,231, 82,222,219, 61, 43, 45, 57, 35, 51, 93,123, 76, 16,232, 81, 0, 91, 11,199,101,217,147,198,243, + 0,206,191,201, 50, 68, 65,195,107,191, 53,212,238,117,203,250, 59,156, 72,146, 58,109,194,139,239, 22, 20,139, 37,118, 55,232, +133,143,145,250,218, 81, 83,125,249,182,181, 75, 23,241, 54, 75, 31, 78, 36,222, 96, 49,235, 38, 22,222,236,240, 70, 16, 73,164, +198,118,221,254, 56,160, 93, 42,151, 26, 75,200,115, 27,128, 85, 30, 65, 61,215,157, 58,117,126,208,201,211,231,231, 52,110,213, +217,205,175, 82, 85,248,185, 88,176,238,203,224, 79, 79,220, 72,187,218,253,203,179, 63, 60,209, 26,111, 23,127,106,129,157,101, + 32,130, 16,146, 9,160, 43,165,116, 37, 33,228, 19, 0,143, 1,220, 41,237,179,243,242,147, 35,207, 22, 26,245, 55, 78,126,202, +195,179,132,144,166, 71,247,154,122, 95, 58,115,112, 73,179,206, 3,221,110,239, 91,155, 99, 52,228,125,174, 79,121,184,213,158, +180,234, 82, 34, 13,106,207,128,118, 15,143, 46,252, 42, 61,234,252, 8,149, 75, 69, 7, 93, 70, 76,102, 86,236,245,133, 0, 22, +190,104, 26,134,210, 80,222,211,167, 2, 37, 82,220, 14, 63, 15, 0,155, 10, 23,111,122,112,243,194, 20, 55,223, 64, 56,187,121, + 7,186,248,183, 32, 89, 81,103, 41, 24, 12,134,125,215,166,246,222,194,253, 95, 10,117,146,130, 81,235,238, 40,184, 83, 41,239, + 77,166,147, 16, 34,165,148, 90,254, 63, 29, 79, 66,136,139, 92, 46,111, 44,149, 74,165,121,121,121,103, 74,138, 12,216,155, 78, +143,160,158, 78,246,206, 85,196, 66,241,255,255, 53, 61,130,122,138, 9,197, 32,129, 96,102,107,255, 92,125,114,244,253,225,231, +238,164, 93,121,213, 57,102,103,249,236, 15, 64, 13, 64, 71, 41,221,242, 79, 62,158,132,180, 18, 43,221, 82,106, 27, 68,217,143, +104, 74,138,161, 44,154,106,207, 0, 41, 0, 23, 0, 25,165, 53, 86, 47,211,116,241,111, 49,169,188, 87,197, 9,233,201, 79,215, +100, 69,157, 29, 91,108,249, 52, 23, 15,191,209, 89,169,113,139,178,162,206,206, 97,101,158,105,254,153,154,255,153, 8,214,127, +153,194, 72, 87,234,159,164,109,249,127,120, 60,178, 80,112, 91,236, 27,229, 13, 79, 4,201,248,135, 83, 20,209, 2,176,170,248, + 56,171, 55, 80, 62,183,252,255, 57,151, 78,219, 96,231, 29, 72, 47, 67,151, 18,105, 65,193,179, 48,223, 24,133,230,105,206, 11, +150,207, 0, 48,131,149, 94, 6,163,244,112,236, 16, 48, 24,140,191,193,180, 11,236, 40, 48, 24,140,127, 51, 4, 5,183,201,191, +168, 2,180, 59,244, 87, 56,161, 95,105, 43,216,187, 76,147,105, 50, 77,166,201, 52,153, 38,211,252,111,105,150,164,253,111,233, +122,100, 99,176,152, 38,211,100,154, 76,147,105, 50, 77,166,249,183,107,254,219, 96, 93,132, 12, 70,201, 21,137, 39, 33,196,147, + 29, 9, 6,131,193, 96,252, 99, 13,150,189,141,213,235, 52,106,172, 65,252,255,129, 70,163,105,172,209,104, 86,122,121,121,173, +246,246,246,110,246, 39,150, 57, 31, 66,136, 79, 25,183,157, 67, 8,180, 5, 47, 50,135,229, 26,131,193, 96, 48,236,225,165,119, + 17,182,104,209,226,186, 72, 36,242, 21,139,197,228, 5,141,206, 31,214, 23, 4,129,218,108,182,132,211,167, 79, 55, 44,161,177, + 26, 95,248,126, 62,165,116,210,235,172, 87,210,182, 34, 17, 89,202,243,116, 92, 89, 26,100, 0,160,148, 38, 2,128,175,175,175, + 63,207,243,173,165, 82,105, 45,139,197,114, 95, 36, 18,157, 74, 72, 72,136,122,209,186,101,108,196, 61, 92, 92, 92,186, 74,165, + 82, 41,199,113,153, 73, 73, 73,231, 41,165, 73,165,212, 16,213,170, 85,109, 48, 33,104, 70, 0, 87, 10,100, 82,138,243,247,239, + 63, 94, 91, 56, 49,227, 63, 14, 74,233,224, 61,123,246,212, 17, 4, 1, 93,187,118,253,152, 16,114,145, 82, 42,148,116, 76, 9, + 33,196,203,203,171, 25, 0, 36, 39, 39,159,167,148, 82,111,111,239,230, 10,133,226, 99, 0, 48, 26,141,191, 36, 37, 37,157,123, + 3,101,201,147, 16,140, 47,154,184,150,227,200, 4, 7, 7,135, 13,249,249,249,145, 69,223, 23,166, 51,133, 85, 37, 12, 6,131, +193,176,203, 96, 17, 66,124, 87,173, 90,229,161, 84, 42,159, 25,170,226,198,138,144,255, 61,228,216,106,181,194, 96, 48, 96,212, +168, 81, 54,251, 27, 43,110, 98,155, 54,109, 58, 41, 20,138,223, 77, 44,105, 52, 26, 37,132,144, 32, 65, 40,184,201,136,227,200, +120, 66,200, 50,123, 26,177,162,223, 48,155, 77,156, 68, 34, 3,199,113, 99,235,215,175, 31,156,150,150,118,130,231,249,159,146, +147,147,211,237,208,216, 13,160, 7, 33, 4, 14, 14, 14, 87,252,253,253,211, 63,250,232, 35,239, 54,109,218,160, 82,165, 74, 72, + 74, 74,106,124,242,228,201,143, 27, 54,108,152,244,240,225,195,242,132,144, 48, 74, 41, 8, 33,123, 40,165, 61, 75,155, 1,106, +181,186,110,247,238,221, 59,172, 91,183, 78,166, 84, 42,241,228,201,147,242, 3, 7, 14,244, 34,132,108,126,126,166,247, 87,153, +171,192,192,234, 43, 70,140, 24, 93,187, 87,175,119, 42, 40,149, 74,121, 66,194,211,132,159,126,248,222, 69, 68, 72,125, 66,200, +232,215, 53, 89,193,193,193,223, 0, 24, 93,174,156,179, 83,118,118, 78, 46,128, 21,225,225,225, 95,191,142,166, 32, 8, 34, 65, + 16, 64, 41, 37, 60,207, 75, 1,136, 8, 33,179, 74, 50, 68, 26,141, 38,172,123,247,238,139,149, 74, 37, 54,111,222,188, 5,192, + 98, 66,200,128,227,199,143, 7, 0, 64,179,102,205, 6, 0, 56,231,236,236,220,128, 16, 76, 16,132,130,103, 37,150,166, 44,189, +136, 46, 93,186, 2,192, 47,222,222,222,103, 50, 50,210,124, 9,193,128,178, 24, 55, 6,131,193, 96,252,135, 13, 22, 0, 40,149, + 74,236,219,183, 15,148,210,103,143, 13, 33,132,128,227, 56, 92,207,175, 3,163, 85,140,252,164,219,232, 21, 44, 65,131, 6, 13, + 94, 24,217,122,222, 11, 20, 55,104, 99,199,142,133,135,199,239, 39, 79, 78, 77, 77,197,233,211,167,223,200,206, 17, 66, 48,115, +230, 76,231,140,140,140,238,171, 87,175,238,224,229,229, 53, 53, 57, 57,249,116, 9,145,171, 30, 69, 3,255,219,183,111, 31,246, +243,207, 63,223,211,233,116,150, 75,151, 46, 89,126,250,233,167,196,214,173, 91,251,244,233,211, 71, 58,108,216, 48,191,247,223, +127,191,246,222,189,123,139,182,237, 65, 8,241,177, 55,146, 69, 8,145, 0,168,218,178,101,203,246, 59,119,238,148,229,229,229, + 33, 46, 46, 14, 74,165, 18, 95,125,245,149,211,240,225,195, 91, 1,216,110,143, 86,173, 90,213, 6, 15, 31, 54,162,246,208,161, +195, 67, 44, 22,179,238,206,157,171, 39, 69,132,144,225, 35, 63,118, 76, 74,142,119,227, 41, 29,140,130,249,135,202,108,174, 66, +195, 66,166, 78,152, 48,129,120,121,122, 35, 38,246,137,243,130, 5, 11,167, 6, 7, 7,195, 30,147,165,209,104,234, 85,172, 88, +241, 27, 15, 15, 15, 47, 74, 41,138,142,111,221,186,117,241,249,231,159,195,100, 50,161, 90,181,106, 85,149, 74,101,248,153, 51, +103,236, 49,215, 74, 15, 15, 15, 12, 27, 54, 12,249,249,249,253, 53, 26, 77, 52, 0,177, 94,255,108, 98,121,207, 26, 53,106,108, +111,221,186,117,245,189,123,247,144,178,238, 55,165, 52,133, 16,178,160, 91,183,174,227, 1,130,183,222,122, 43,227,211, 79, 63, +181,221,191,127,191,213,219,111,191,221,232,241,227,199,111,196,184, 49, 24, 12, 6,227,191, 21,193, 2, 33, 4,199,143, 31,135, +217,252,199, 71,205,185,180,108,128, 47,122,249, 97,240,232,245,216, 26, 21,133, 58,117,234,224,249, 59, 18,159,123, 72,107,138, + 88, 44,250,153,227,184, 97,132, 16,212,175, 95, 63,101,225,194,133, 47,122, 44,138,181,126,253,250, 41, 34,145,200,179,208,216, +253,108,179,241, 41, 47,210,124, 73,131,184, 80, 38,147,127, 9, 0, 26,111, 77,202,190,125,251,172,189,123,247,198,130, 5, 11, +100, 19, 39, 78,156,169,209,104,250,106,181,218,132,151,165,179, 56, 21, 42, 84, 64,100,100, 36,166, 76,153,146,148,156,156,252, + 83, 74, 74,202,253, 77,155, 54, 85,174, 92,185,242,199, 63,254,248, 99,128,151,151,215,171, 26,231,187, 47, 57,174,237, 68, 34, +209,120,142,227,130,107,213,170,117,127,216,176, 97,183,179,178,178,210,226,227,227,159, 61, 7, 79, 44, 22, 67, 42,149, 82,123, + 53, 69, 4,205,187,247,232,225,105, 50, 25,243,141, 70,125,246,195, 7,215, 99,227,227,239,101, 86,174, 92,219,253,173, 54,141, +221,162,162,158, 52,127,153,193,122, 94,243, 69,145, 42, 0,163, 39, 76,152, 64,102,205,156,141,129,131,250, 99,227,186, 45,248, +232,227, 33, 24, 53,226,211,209, 0,190,182, 35,157,221,214,174, 93,235,229,230,230, 6,158,231, 33, 8,194,179,255, 73, 73, 73, +208,233,116, 80,169, 84, 48, 26,141, 56,123,246,236, 11, 13,121,113, 77,173, 86,123,234,151, 95,126, 57, 21, 16, 16,208,122,226, +196,137,144, 72, 36, 95,229,230,230, 98,193,130, 5, 80, 42,149,152, 57,115,166,119,221,186,117,193,113,156,213,102,179,165,136, + 56,206,147,130, 82, 66,176, 68, 16,168, 93,101,169, 8, 31, 31,159, 35,169,169,105,205, 90,183,110,141,236,236,108,203,180,105, +211, 80,191,126,125,212,168, 81,163, 84,249,254, 58, 48, 77,166,201, 52,153,230,127, 65,243, 95,105,176, 8, 33,148,210,130,110, +148,231,222, 99,199,142, 29, 47,220,112,208,226, 8,136, 69, 5,237,223,143, 63,254,136,204,204, 76, 8,130,240,202,104,129,205, +198, 15,247,240,240,208, 77,158, 60,185, 93,245,234,213,173, 67,135, 14,189,254,244,233,211,225,197,215,169, 88,177,226,143, 63, +255,252, 51, 30, 61,122,148, 54,123,246,236, 99,169,169,169, 95,150, 50,211, 39, 16, 66,150, 0, 64,162, 86,155,190,127,255,254, +208,243,231,207, 79, 92,188,120,177,247,168, 81,163,100,159,126,250,233,112, 0,147, 95,178,109, 34, 33,100,157,143,143,207,160, +102,205,154,161,103,207,158,233,205,154, 53,179, 92,189,122,213,251,242,229,203,223,124,255,253,247,194,251,239,191,207,181,104, +209, 2,169,169,169,188,175,175,111, 90, 88, 88,152,123,116,116, 52, 0,172, 43, 41,122, 69, 8,121,203,211,211,115,207,142, 29, + 59,108, 13, 27, 54, 84, 70, 70, 70, 6,142, 29, 59,214, 75,171,213, 30,170, 81,163, 70,186, 78,167,131,205,102,131, 78,167,131, +157, 15, 80, 46,212,133,139, 66, 33,151, 94,190,116,112,111,244,227, 91,201,113,241,183,179, 8,161, 36, 33, 33, 60,179, 86,173, +214,174,160,112, 41,109,164,202,211,211, 11, 49, 49,209,206, 11, 23, 46,156,250, 52,238, 41,241,242,244,198,192, 65,253, 97, 52, + 26,208,111, 64,111,200,229, 50, 82,174,156,179,147, 61,186, 28,199,237,250,224,131, 15, 90,123,120,120,168, 0,160, 40, 66,229, +239,239,143,145, 35, 71, 98,203,150, 45,136,138,138, 2, 0,171,175,143, 79, 10,199,113,158, 0,165, 98,177,104,189,197, 98, 75, +121, 65, 62, 81, 95, 95,223,105, 95,125,245, 85,197,159,126,250,169,202,152, 49, 99,126,103,218,146,147,147,177,111,223, 62, 92, +184,112,193,242,240,225,195,141, 78,206,206,119, 13, 6,195, 21,147,201,244,196,222, 99,234,235,235,171,224,121,126, 88, 64, 64, + 64,215,254,253,251, 91,164, 82, 41,244,122, 61,244,122, 61,238,221,187,103,233,216,177, 99, 70,183,110, 93,221, 14, 28, 56, 64, + 41,197,124, 22,189, 98, 48, 24,140,178,241, 50, 15,242,175,137, 96,189,108,167,214,174, 93, 11, 74, 41, 68, 34, 17, 56,142, 3, + 33, 4, 34,145, 8,121, 90, 27, 6,141,222, 8,169,136,226,240,225,195,168, 87,175,158, 93, 63, 40, 8,194,226, 67,135, 14, 53, +107,218,180,169,184,125,251,246, 13, 43, 84,168, 16, 28, 31, 31, 31, 94, 24, 49, 10,238,208,161, 67,195,242,229,203, 99,201,146, + 37, 70, 65, 16, 22,151,209, 89, 23,111,236, 46,249,250,250, 78,253,237,183,223,214, 12, 29, 58, 20,158,158,158,245, 75,216,118, +112,251,246,237, 27,140, 31, 63, 30, 83,166, 76,177,172, 90,181,202, 54,108,216, 48,113,171, 86,173,176, 97,195, 6,238,225,195, +135, 88,185,114,165,176,107,215,174, 36,142,227,146, 59,117,234, 84,241,212,169, 83, 81,103,206,156, 25, 92, 82,186, 68, 34,209, +151,155, 55,111,182, 54,109,218,212,145, 82,138, 58,117,234, 56,126,249,229,151,150, 69,139, 22, 85,117,115,115, 75, 79, 76, 76, + 68,118,118, 54, 82, 83, 83, 45, 9, 9, 9,143, 75, 81, 60,211, 18, 18, 98,146,242,243, 82, 13, 61, 58,132, 78, 73,139, 77,134, +123,165, 30,248,237,240,190,153,113, 79, 31, 10,132, 35,105,118, 10,253, 33, 82,213,255,189,126,100,252, 23, 19,241,240,113, 36, + 54,174,219,130,126, 3,122, 99,235,166,237,104,219,190, 53, 10, 35, 92, 37,146,144,144,112, 15, 64,139,226,203, 42, 85,170, 36, + 7,112,193,106,181, 34, 58, 58, 26,145,145,145, 77, 99, 99, 99, 77,133,101,209, 7, 0, 44, 22, 91,226, 43, 52,141,229,203,151, + 31,243,225,135, 31,142,243,242,242,170, 11, 0, 85,171, 86,117, 30, 59,118, 44, 22, 44, 88,128,123,247,238, 77,148, 74,165, 23, + 18, 18, 18, 76,165, 45, 63, 30, 30, 30, 65,106,181,122,210,168, 81,163, 60,131,130,130, 96, 52, 22, 60,131,216,193,193, 1,122, +189, 30, 78, 78, 78,104,210,164,201,253,111,191,253,214, 66, 41, 6, 81, 74,147, 89, 21,201, 96, 48, 24,111,198,100,253,171, 34, + 88,133,198,130, 16, 66,232,115, 59, 92, 20,129,120,102,174,138,222,247, 14,145, 33,167, 90, 85,136, 10,151,219,108,246, 61,115, + 52, 61, 61, 61, 89,163,209,236,188,121,243,102,223, 62,125,250,224,212,169, 83,159, 2,120, 31, 0,164, 82,233,167,125,250,244, +193,205,155, 55, 17, 17, 17,177, 51, 61, 61,253,141, 52, 92, 86,171, 85,103,181, 22,244, 70, 42, 20, 10,169, 29, 70,200, 34,147, +201, 0, 0,145,145,145,157, 70,141, 26,245, 78,199,142, 29, 63,233,210,165, 11,246,238,221,139,245,235,215, 79, 7,112,172, 69, +139, 22,219,197, 98,177, 69, 34,145,232,237, 52,151, 97, 97, 97, 97,170,162,174,212,152,152, 24, 56, 58, 58, 58,198,197,197,121, + 25, 12, 6, 24,141, 70,228,228,228,224,198,141, 27, 58, 0, 9,246,238,159, 77,160,151,126,250,225, 59,215,143, 62,238,235,115, +238,250,181,165,219,118,230, 13,105, 18,186,114, 65, 69,191,122, 30,171, 86,159, 82,243, 2, 61, 97,143, 78,185,114,206, 78,207, + 71,170,156, 28,157,208,180,105, 83, 28, 58,112, 8,131,135,124, 0,185, 92,134,238,111,119,193,134,117,155,128,130,238,195,210, +156, 64,207,238, 14, 52,155,205,131,186,118,237, 10, 65, 16,208,169, 83, 39,220,188,121,115, 16,128,159,138,190,183,183, 44, 1, +248, 2, 0, 52, 26,141,155,179,179,243, 17,158,231, 65, 41,133,151,151,215,217,240,240,112,171,143,143,207,251,114,185,188,169, + 78,167,251, 53, 37, 37,229, 84, 73,154,222,222,222,205,106,212,168, 49, 99,225,194,249,196,211,211, 27, 60,111,131,213,106, 65, + 90, 90, 6,242,242,242, 16, 24, 24,136,138, 21, 43, 98,238,220,185, 0,176,155,153, 43, 6,131,193,120,125, 94,228, 65,254, 53, + 6,235,249, 29, 44,110,174,138,198, 99, 21, 55, 90, 34,142, 67,121, 55,151,103,203,120,158, 7,138,141,153,121, 21, 28,199,173, +217,184,113, 99,207,197,139, 23,203,186,117,235, 86,211,203,203,171, 5, 0,244,235,215,175,166,147,147, 19, 54,110,220,104,230, + 56,110,205, 27,114,197,156, 70,163, 25,220,188,121,115,164,164,164, 32, 54, 54,246, 82,105,182, 79, 76, 76,204, 5,176, 81,167, +211,125, 34,145, 72,138,162, 25, 39, 0,148,250, 89,106, 28,199, 93, 57,113,226, 68, 88,215,174, 93,157,226,226,226,160,213,106, +177,115,231,206, 20, 55, 55,183,100, 65, 16, 80,190,124,121,120,120,120, 64, 16, 4,213,131, 7, 15,188, 1, 68,217,163,123,255, +254,227,181, 18, 17,169, 39, 87,152,148,109, 90,213, 85,184,148, 43,199,121,184, 11,206,103,206,220,118, 76, 78,206, 78,185,119, +239,177, 93,199, 50, 59, 59, 39, 55, 38, 54,218,185,120,164,170,117,155, 22,184,112,225, 2,148, 74, 37,142, 31, 63, 1,103,103, + 39,248,248,248,226, 73, 84, 52, 0,164,132,132,132, 80, 66,136,112,245,234, 85, 81, 9,249, 80,108,250, 12,209,143, 29, 58,116, +104,208,184,113, 99,196,199,199,163, 81,163, 70,168, 83,167,206, 7,229,203,151,223,151,158,158,158, 84,138,188,245, 6,192, 85, +175, 94, 61,215,193,193,225,135, 33, 67,134,192,102,179,161,109,219,182, 88,181,106,213, 38,111,111,239, 59,157, 58,117,122,187, + 79,159, 62, 24, 63,126,188, 15,128, 83,118,104,190,223,183,111, 95,162, 84,170, 97,179,217, 32,151, 75, 33,151,203,225,224,224, + 4, 87, 87, 87,196,197,197,225,173,183,222, 18,162,163,163,247,168, 84,170,181,172, 90,100, 48, 24, 12,102,178, 94,216,230,151, +208,216,128,231,121,240, 60,143,139, 89,129, 56,150, 18,132,109,151,141,176, 90,173,176,217,108,176,217,108,224,121, 30,132, 16, + 88,173, 86,216,251,216,157,132,132,132,172,168,168,168,205, 23, 47, 94, 68,207,158, 61,225,226,226, 50,202,197,197,101, 84,207, +158, 61,113,241,226, 69, 68, 69, 69,109, 78, 72, 72,200, 42,165,145,114, 39,132,252,110,212,185,135,135, 71,149,138, 21, 43, 46, + 29, 49, 98, 68,199,160,160, 32, 28, 59,118, 12,130, 32, 28,179, 87,179,208, 52,122, 2,144, 60,183,111, 50, 0,174,130, 32, 72, + 74,147, 70,158,231, 23, 12, 26, 52, 72,178,120,241,226,180, 7, 15, 30, 24, 87,174, 92,169,221,182,109,155, 57, 32, 32,224,137, +167,167, 39,130,130,130,224,231,231,135,234,213,171,203,188,189,189,107,148,162, 80,242, 86,158,255,254,254,253,204,186,183,238, +164,214, 17,139, 45,105,187,247,221, 10, 60,114,252,126, 64,158,206,182,162, 20, 83, 52,172, 88,176, 96, 1,237,219,191, 55,156, +157,156,209,186,109, 11,236,222,181, 23, 74,165, 18,245,234,213, 67, 23, 15, 29,118,186,238,194,187, 14,209,144, 74,165, 24, 54, +108,216,247,103,207,158, 5,207,243, 37,149,163,103, 83,116, 8, 2,229, 40, 21, 70,188,253,246,219,202,164,164, 36,140, 25, 51, + 6, 73, 73, 73, 24, 52,104,144, 68, 38,147, 13, 43, 69,126,207, 38, 4, 9, 4,136, 79,210,106, 47, 79,157, 58,181,178,151,151, + 23, 78,156, 56,129,144,144, 16,204,155, 55,175,202, 71, 31,125,244,118,191,126,253,112,245,234, 85,100,102,102, 94, 44, 73,179, + 85,171, 86, 98,145, 72, 84,213,199,199, 7,177,177,177,136,139,139, 67, 78, 78, 30, 0,130,242,229,203, 99,233,210,165,104,209, +162,197,173,216,216,216, 97, 90,173,118, 69, 84, 84,148,153, 85,137, 12, 6,131,193,120,105, 4,171,120,191,103,241,247,132, 16, + 28, 58,116, 8, 0,160,110,220, 16, 19,123, 87,194,192, 17,235,177, 53, 58, 18,114,185,252,127, 34, 98, 49,134, 13, 27, 86,170, + 31,118,117,117,221,176,101,203,150,222, 77,154, 52, 81,191,245,214, 91,213, 0, 64,161, 80, 88,183,108,217,162,115,117,117,221, + 80, 74,115, 53,157, 16, 76, 5, 5, 39,151,201,142,184,184,186, 30,117,114,114, 10,237,216,177, 99,181,142, 29, 59,162,106,213, +170,216,185,115, 39,126,251,237,183, 99,201,201,201,231,237,213,173, 82,165, 10, 52, 26,205, 96,158,231,127, 6, 64,139, 69,232, +172, 0,218,249,250,250, 42, 74,233,206, 79, 18, 66,122, 77,152, 48, 97, 44,165,180,129,135,135, 71,108,104,104,232,221,102,205, +154,165, 59, 59, 59, 67, 44, 22, 35, 45, 45, 13,249,249,249, 16, 4,193,181, 52,218,217,217,134,149,115,230,140,173,219,166, 77, + 27,228,230,230,226,192,129, 3,149,146, 82,214, 33, 54, 54,118, 61,128, 38,246,104,132,135,135,127, 29, 28, 28,140,219,183,238, +124,213,181,107, 23,236,223,127, 0, 74,165, 18,106,181, 26, 85,171, 86,197,141,220, 92,140,146, 4,163,150,119, 45,180,111,159, +134,186,117,235,226,254,253,251,101,138, 43,122,123,123, 99,211,166, 77,200,207,207,255,102,203,150, 45, 95,143, 24, 49, 2,213, +171, 87,111,163,209,104,230,106,181, 90, 67, 9,249,237,250,187, 57,213, 8,169, 37,147,201,238, 45, 95,190,220,124,238,220,185, + 29,135, 14, 29,234, 58,100,200, 16, 69,179,102,205,112,225,194, 5,172, 90,181,234,146,147,147,211,130,146, 82,117,230,204, 25, + 65,163,209, 60, 27,103,168,215,235, 17, 29, 29,141, 38, 77,154, 96,205,154, 53, 88,186,116,233,134,164,164, 36, 22,181, 98, 48, + 24,140, 55, 28,185,122,209,251,127,133,193,122, 21, 91,183,110, 5, 0,124,180,252, 33,204,150,130,113, 86, 63,252,240, 3,138, +166, 40, 40,234, 74, 60,123,246,108,169, 14, 76, 68, 68,132,206,199,199,103,205,232,209,163,231, 93,187,118,213, 19, 0,174, 95, +191,158,162,213,106, 39, 36, 38, 38,234, 74, 97,174, 92, 8,193, 20, 65,160, 34, 0, 80, 42, 21, 29,199,141, 27,231,211,184,113, + 99,139, 84, 42,197,211,167, 79, 49,127,254,124,156, 63,127,126, 99,114,114,242,114,106, 71,152, 45, 54, 54,246, 82,124,124,124, +227, 81,163, 70,161, 69,139, 22, 61, 86,174, 92,217,169,200, 92, 81, 74, 81,191,126,253,173,157, 59,119,246,146,203,229, 98,179, +217,204, 63,120,240, 32,188, 20, 5,233, 8,128, 35,132, 16,105,114,114,114,213,156,156,156,118,130, 32, 56,165,164,164, 32, 46, + 46, 14,233,233,233,200,203,203,131,205,102,203, 40, 77, 70,106,181,218,166, 3, 7, 14,164, 81, 81, 81,200,206,206,198,154, 53, +107,138,150, 55, 41,141, 78,161,201,250, 42, 52, 52, 12,247,238, 69, 64,163,209,160,114,229,202,240,241,241,193,195,135, 15,225, +232,232, 8,169, 84,138,227,199,143, 35, 62, 62, 30,213,170, 85,179,103,159, 83, 8, 33,243, 57,142,140, 7, 64, 66, 66, 66, 83, + 29, 29, 29,173,151, 47, 95,126,164,213,106,247,249,251,251,247, 25, 52,104, 80,245, 70,141, 26, 73, 31, 61,122,212, 10,192,193, +210,249, 53, 32, 51, 51, 19,231,206,157, 59,165,213,106,231,187,187,187,111,152, 62,125,250, 4, 47, 47,175, 6, 73, 73, 73, 23, + 60, 60, 60,166,133,135,135, 91,237, 72,167,160,209,104,158, 30, 61,122,180, 98,239,222,189, 33,149, 74,145,149,149, 5, 71, 71, + 71, 44, 92,184,144, 90, 44,150,157,172, 42,100, 48, 24, 12,198, 27, 49, 88,187,118,237, 2,199,113, 48,167, 89, 48, 98,252, 22, +168,228, 34,156, 62,125, 26,174,174,174,191, 27,151, 85,244,122,206,252,188,242,105,219, 89, 89, 89,103,146,146,180, 30,130, 80, +224,121, 56,142,120,200,229,138, 51, 37, 24,170, 63,104,146,231,198,126,153, 76, 38, 28, 59,118, 12,103,206,156,177, 68, 69, 69, +157,164,148,238, 78, 74, 74,186,105,175,102,118,118,246,204,161, 67,135, 78,237,216,177, 99,227,129, 3, 7, 98,197,138, 21,210, +251,247,239, 23,153, 43,212,173, 91,215,215,106,181,210,187,119,239,230,237,219,183,239,160,209,104, 92,103, 79, 58,159,107,204, + 45, 0, 30, 56, 56, 56,192,102,179,181,106,210,164,137,155,205,102, 67, 70, 70, 6, 46, 94,188, 24,147,145,145,113,174, 52,154, + 26,141,230,210,180,105,211,208,171, 87, 47,164,165,165,161, 98,197,138, 88,183,110, 29, 52, 26,205, 37,173, 86,219,184, 52,199, + 19, 0,142, 31, 63,142,129, 3, 7,194, 98,177,192,102,179, 65,175,215, 35, 52, 52, 20, 0, 16, 31, 31, 15,139,197,130, 59,119, +238,140,140,136,136,248, 94, 44, 22, 11, 37,105, 82, 74, 39, 17, 66,190,247,242,242,154, 61,123,246,236,154, 87,174, 92,129,201, +100, 58, 88,152, 95, 7,175, 95,191, 94, 61, 56, 56, 24,155, 54,109,234,252, 34,131, 85, 92,147, 82,154, 89,104,216, 38,128,130, + 4,214, 14, 76,171, 94,189,186, 69, 34,145,148, 7,128,180,180,180, 20, 0,159,219, 97,206,255,144, 78,155,205, 54, 97,215,174, + 93, 67, 47, 93,186,212,114,236,216,177,164, 77,155, 54, 0, 0,157, 78,199,167,167,167,231,151, 69,243,117, 97,154, 76,147,105, + 50,205,255,130,230,127,202, 96,229,228,228, 32, 52, 52, 20, 86,171, 21,181,106, 89,145,155, 91, 25, 86,171, 21, 86,171, 21, 50, +153, 12,130, 32, 60, 27,135,197,113,220,179,249,141,236,197,104, 52, 90,158,159,252,221,104, 52, 90, 74, 25, 90,204, 34,132,204, +226, 56, 50, 21, 20, 68, 38,151, 94,254,225,135, 31, 86,163,224, 46,188,139, 37,117, 55,189,136,148,148,148, 52, 0,159, 86,168, + 80,161,225,169, 83,167, 62,239,213,171, 87,181,110,221,186, 33, 62, 62, 30,130, 32, 32, 42, 42,202,186,119,239,222, 59,217,217, +217,223, 83, 74,239,189, 78, 6,228,231,231, 63, 32,132,104, 31, 62,124,216, 68, 38,147, 41,121,158, 79, 77, 79, 79,191, 71, 41, +205, 43,101, 4,171,177, 70,163,161, 51,102,204,248,195,242, 50, 36,107,228,217,179,103,191,127,110,210,207,103, 20,230,245,200, +240,240,240, 31, 0,252, 80,138,188, 74,108,218,180,169,179, 66,161,192,217,179,103, 5, 74,233,209,194,229, 71,207,159, 63, 63, +166,126,253,250,156,187,187,123, 45, 59,181, 38, 19, 66,190,115,116,116,244,169, 85, 43,240, 7, 74, 41,220,221,221, 43,190,238, + 9,145,154,154,154, 10,224, 27,141, 70,179,125,252,248,241,195, 67, 67, 67,131, 10,143,169,136, 85, 23, 12, 6,131,193,120, 19, + 6, 43,122,216,176, 97,150, 98,110,245,121,247,250,135,207,148,210,132,210,252,120, 97,215,209,188,194,174, 35, 80,138, 5,101, +153,176,145, 82, 58,141, 16,242, 61, 0,145,209,104,126, 99,183,205,199,199,199, 95, 39,132,188,183,110,221,186, 14,219,183,111, +159,212,175, 95, 63,229,170, 85,171, 44,169,169,169,115, 0, 28,164,148, 10,111,226,119, 40,165,185, 0, 14,189,174,142, 86,171, + 37,132,144,233, 0,166, 1,152, 65, 41,157, 94, 22,157,210, 26,167,210, 16, 23, 23,183,105,228,200,145,131, 83, 83, 83,183,107, +181,218, 76, 0, 72, 76, 76,204,244,241,241,153, 63,121,242,228,247,211,210,210, 54,149,226,184, 37, 17, 66, 82,163,162,162,114, + 51, 51, 51,157,236,157, 42,196,206, 99,249, 16,192,103, 26,141,166,113,135, 14, 29, 6, 81, 74, 83, 89,117,193, 96, 48, 24,140, +215, 54, 88,167, 78,157,106,242, 87, 36,160,176,235,104, 89,145,225,122, 13,157,180, 63, 41,125, 20,192, 97, 66,200,177,165, 75, +151, 6,234,245,250, 24, 74,105,254, 63, 53, 67, 11, 77,213,244,127,106,250, 18, 19, 19,183,227, 5,207, 88, 76, 76, 76,220, 9, + 96,103, 25,246,151,247,245,245,157,244,249,231,159,119,161,148,238,126,211,233,213,106,181,151, 0, 92, 98, 85, 5,131,193, 96, +252,237,132, 0,112, 47,124, 95,212,230,187, 63,247,222,140,130, 59,253,139, 40,250,156, 6,224, 90, 49,141,226,203, 75,218, 22, + 0,210, 1,220, 46, 92,102, 23,220, 63,196, 20,164,252,211, 31, 53, 66, 41,229,117, 58,221,157,127,178,185,250,175,146,144,144, +112, 45, 49, 49,241,107,173, 86,123,139, 29, 13, 6,131,193,248,247,154, 43, 66,200,126, 66,200,254, 66, 67,228,254,130,247,178, +162,117,138,127, 46,102,204,220, 95,176,252,149,219, 18, 66,246, 79,154, 52,169, 53,236,188, 35,255, 31,101,176, 24, 12, 6,131, +193, 96, 48, 94,129, 59, 33,100, 63,165,180, 43,165,180,107,161, 1,122, 33,148,210,174,197,255,191,138, 23,233, 20,253, 70,241, +207,115,231,206,157, 13, 64, 89,154, 4,139, 9, 33, 65, 47, 73,160,221,119, 7,188, 76,227, 85,223,149,164,207, 52,153, 38,211, +100,154, 76,147,105, 50,205,127,159,230,155,218,254, 77,240, 34,179, 86,100,228,138,127,158, 56,113,226,100,148,162,123,176, 72, +252, 79,123, 1, 8, 98,154, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,205, 87,151, 2,203, 66,187, 20,127,255,162,101,175, +122, 95,210,182,118,172,107,119,154,197, 96, 48, 24, 12, 6,131,193,248,103,147, 86, 60,218, 84, 24, 97,226, 39, 78,156, 56,185, +104, 89, 97,148,201, 4, 64,254,130,104, 89,241,237, 74,138,172,217,189,238,171, 96, 6,139,241,183, 17, 88,149,116,160, 20,147, +120, 1, 34, 66, 48, 55, 50,134, 30, 96, 71,133,193, 96, 48, 24, 47,224, 26,128,144, 98,166, 39, 13,192,157, 57,115,230,100,205, +153, 51,167,248,178, 91, 0,234, 21,174,151,246, 2,163,100, 46,252,108,126,193, 58,102,123,214,253, 83, 12, 86,237, 10,100, 56, + 10,166, 0,160, 0,102,220,139,167, 63,150,106,251,106,164,173, 66, 44, 90, 5, 0, 70, 27,255,209,189,199,244,248,235,172,247, +146,109,219, 73, 57,110,163, 64, 33,177,242,194, 18, 80,108, 3, 16, 21, 17, 77,203,252,132,110, 95, 95,226,194, 81,116,149,138, +197,161, 22,155,237,170, 64,176, 63, 33,129,102,189,169, 82, 83,222,153,212,117,114, 80,174,147, 72, 56, 7,169,132,123,148,146, +150,247, 77,106, 54,189, 82, 26,141,222,129, 68,202,249,202,151, 59, 40,249, 14, 98,142,119,225, 5, 81,118,190, 65,116,132, 79, + 48,141,222, 30, 65, 45,255,196,179, 69,160,152,252, 96,255,240,102, 0, 80,185,221,143,211, 8, 33,135, 74, 59,183, 88, 96, 21, + 82, 27,192, 72, 59, 86,253, 62, 34,186,108,147,194, 6, 86, 33,171, 1,212, 0,193, 14,155, 5, 91, 31,198,179, 57,177, 24, 12, + 6,227,111, 50, 89,207,115,213,206,245,254,114, 74, 27,193,154,121,239, 81,188, 11, 4, 11,106, 7, 84,253, 22, 64,169, 12,150, + 66, 44, 90,123,237,118,178, 6,188, 17,139,167,247, 61, 54,251,243, 70,224, 5, 27, 4,222, 6,158, 47,248, 47, 8, 60,186, 52, +171,136, 57, 63, 94, 3,108,121,104,216,160,198, 90, 0, 62,246,254,134,148,227, 54,134, 95, 56,234, 78,108, 57,216,186,102,230, + 55, 79,147, 13,223,156,188,166,141, 13,172, 66, 62,143,136,166,123,237,213,169, 80,129,120,115, 64,207, 10, 26,247,190,147, 70, +244,110,220,161,117,115,174,162, 95,101, 60,141,139, 25,126,228,212, 57,161,121, 35,143, 75,241,218,180, 95, 5, 96,119,124, 60, + 77, 42,107, 6, 84,240,148,125,212,182, 77,155,165, 63,173, 92,167,114,112, 42,143,220,204,167,149, 7, 13,124,183,158,167, 11, +105,151,146,101,159, 33,232, 29, 72,164, 14, 85,165,183,218,119, 27, 90,190, 77,231, 81, 34,185,210,153,166, 38,221, 35,251,182, +207,234,124,247,230,249,102,189, 3, 73,221,215, 53, 89, 33, 33, 33,115, 4, 65, 24,238,236,236,236,152,147,147,147, 35, 8,194, +146,155, 55,111,126, 91, 10,147, 34, 7,224, 92,124, 25,207,227,217,195,178,173, 54,168, 42,107,160, 9,172, 66,138,158, 25,152, + 23, 17, 77,237,153,133,127,228,173,107,167,134,218,178,175, 1,130, 5,148, 90, 1,193, 2, 80, 43,168, 96, 1, 4, 43, 40,181, + 32,236,237,181, 0, 48,172,140,187,223,254,248,137,107,222,169, 41, 73, 33,139,151,204,154, 20, 88,153, 28,162, 28, 54, 62,136, +198,153, 55, 53,217, 44,131,193,248,123,105,211,166,205,198,156,156,156, 89,225,225,225, 15,223,148,166,167,167,103,160, 72, 36, +138, 41,203, 19, 69, 94,197,144, 33, 67,166,155,205,230,241,130, 32, 72, 56,142,179,202,100,178,249,171, 87,175,158,254, 58,154, + 31,125,244, 81, 37,163,209,232,203,243, 60, 17,137, 68, 84,161, 80, 36,172, 90,181, 42,150,149,140,191,206, 96, 41, 64, 5,224, + 66, 79,160,148,183, 43, 2, 0, 40,228,160, 54, 64,255, 16, 3,123,133,162,188,139, 43,192,155, 0,193, 12, 8,166,130, 23,111, + 66,122,102, 10, 96,203, 3,210, 14,129, 23,168,172,212,191, 99,205, 1, 82,183,163, 67, 99, 47,148,115,116,192,103,253, 3, 43, +173,220,245,112, 79, 80, 85,110,206,221, 39,194,228, 18, 77,143, 47,249, 97,194,176,158,195,218,183,235, 66, 42, 85, 13, 66,102, +122, 2,174, 94,189,148,181,248,231, 29, 17,237, 91, 53, 12,124,167, 87, 95,151,161,195,190,108, 26,251,228,110,211, 51,167,246, +124,231,231, 75, 22,197, 37,208, 47, 74, 25,181, 82, 1,232,208, 56,172,225,162, 77,219, 14,168, 56,221,109, 32,126, 11,156,157, + 27,225,167,239,230,123,118,233,246,246, 15, 0,154,217,163, 37,242,149,175,104,223,109,168,219, 59,131, 22,150,179, 89,244,102, +237,227,131,145, 34, 66, 72,159,126, 95, 40,242, 51, 19, 28,239,155,227, 87, 0, 24, 90,214, 66, 82,191,126,253,197, 77,155, 54, + 25, 51,126,194,151,196,195,221, 11,209, 49, 81,229,230,205,155, 63, 35, 36, 36,196,120,237,218,181,133,118,152,171,254,237, 91, + 54, 92, 89,185,146,175,138, 82, 1, 69,175,124,157, 9, 35,230,132, 35, 43,199,128,206,173,235, 7, 84,170,224, 28,207,129,130, + 82, 1,177,241,169,124, 96, 21,242,118, 68, 52,221, 87, 82,100,170, 94, 72,235,102,183,195, 47,213,180,164,238, 71, 72,231, 57, + 15, 0,156, 47,246,125,179, 27,103,214,214, 4,214,150,105,223, 9, 33,164, 86,101,240, 79, 47,207, 67,133,250, 31,137, 86,174, + 61,226,158,147,153,248,193,111,219,126,124,247,135,159,127,218,244, 26,166,141,193, 96,252,131,160,148,118, 46, 95,190,124,155, +224,224,224, 86,111,202,100, 73, 36, 18, 37,207,243, 1, 26,141, 38,242, 77,153,172,224,224, 96,183,224,224,224,105,243,231,207, +135,163,163, 35,242,242,242,196, 83,166, 76,153, 22, 28, 28,252, 93,120,120,120, 70, 89, 52,195,194,194,164,245,234,213,171,176, +104,209, 34, 56, 57, 57, 33, 55, 55,151, 76,156, 56,177, 66, 88, 88,152,246,202,149, 43, 22, 86, 58,254, 26,131,245, 32,249,220, +152, 6,230, 76, 61, 0, 60,176,163,192,254,238, 86, 75,163,141, 31,255,253,183, 61, 87,135,213,115, 70,114,186, 25, 71,206,105, + 33, 8, 60, 4,158, 7, 47,240,197, 34, 88,238,104,142,225, 88,190,237, 17,172,130, 48,254, 85,154,207, 99, 17,132, 1, 13, 90, +246,217, 42, 80, 42, 83, 42,200,211,170, 62, 46,149,199, 13, 12, 82,124,214, 47, 16, 70,147,109, 98, 96, 21,114, 42, 34,154,158, +120,149,102, 96,101,151, 79, 70,124,252, 17, 17, 84,181,113,253,242, 65,124, 54,126,234,227,148,244,204,111,180,201,184,182,255, +248,217,202,126, 26,183,153, 75,102, 77, 9,174, 81,175, 35, 58,114, 6,156, 61,119,254, 35, 0, 95,216,147,206,242,206,164,158, +131, 90,241,105, 5, 95,223, 94,147, 39, 79, 18,119,235,209, 79,193,233, 35,128,164,173,224,205, 58, 8,121,177, 40,231,212, 4, +128,224, 83,210,241, 44,194, 81,201,119,104,217,254, 67,142,183,228,155,172,198, 76,163, 33,229,114,158, 41, 55,202,168,114,169, +234,208,188, 73,115, 65,155,184,161,163,189,121,244,162, 72, 21,199,113, 31,141,251, 98, 28,153, 61,107, 46,250,244,127, 7,219, +182,236,196,135, 67, 6,227,243,207,198, 77, 0,176,176, 36, 77,137, 68, 60,120,193,188,121, 42,142, 3, 32,216, 0,250,191,151, + 54, 57, 21, 58,157, 30,229, 28,100,112,119, 85, 62, 91,110,179,154, 68,193,157,190, 28, 5, 96,223,171,246, 61, 34,154,222, 11, +172, 66,206,131,218,106, 82,222, 0, 0,231, 35,162,233,176, 98,230,174,118,131,150,131, 71, 2,248,222,222,227,249,187,178, 80, + 9, 93, 67,107, 57,168, 85,214,251, 72, 56,243, 41,162,120, 37,245,168,243, 33,250,189, 55, 82,245,243,202,149,221, 8, 33,195, + 11,103,251,183, 91,179, 12, 21, 63,211,100,154,255,239, 53,123,247,238, 45, 2,128,237,219,183,243,255,196,116, 74, 36, 18,203, +143, 63,254,232, 57,124,248,240,211,246,154,172,146, 52,121,158,231, 9, 33,145,148, 82,187, 77,150, 29,251, 62,213,217,217, 25, + 10,133, 2, 18,137, 4, 10,133, 2,206,206,206,224, 56,110, 42,128, 49,101,209,180,217,108, 21,157,156,156, 32, 22, 23, 88, 2, +177, 88, 12, 39, 39, 39, 8,130, 80, 17, 64,212, 95,149, 71,255, 90,131, 69, 8,161,148, 82, 82,194,250, 79,188, 28, 37, 13, 96, +181, 2,192,147,210,254,216,189, 40,186,166, 94,117,113,243, 30, 29, 62,251,160, 90, 37, 14,243,127,185,126,230,220, 13, 93,171, +226,235, 52,174, 35, 59,181,120, 92,163, 86, 89,185,102,236, 59,157,184,254, 94, 20, 45, 85,232,161,112,188,150, 91,177, 6,214, +125,240,244, 51,235, 55,205,108,221, 97, 76,255,218,100,247,233,216,201, 0, 78,188, 74,195, 65, 37, 21,145,228,157,200,226,111, + 35, 44,180, 27,174, 92,141,174,118,235,242,238, 77, 91,126,221,200, 15,234,215, 75, 84,189,193,187,208,103,220, 71,220,197,217, +200,123,122, 28, 78, 42,177,212,206,168, 85,131,144,144,144,115,191,172, 90,163,240,242,169, 78,136, 53, 29,200, 59, 3, 91,242, + 81,152,117,233, 48, 25,243, 96, 17, 28,144,151,116, 28, 50, 9,177,251, 10,138,227,248,114, 10,165,131, 45,225,206,170,251,198, +204,123, 6, 91,254, 35,171,148,112, 50,228,223, 23,188,221, 27,130, 16,222,185,180,145, 42,247,242,158,136,142,137,114,158, 63, +127,193,140,228,164,100,226,163,241, 69,223,247,222,133,217,108, 66,159,126,189,160, 86,171,136,131,131,131,171, 93, 1, 69,171, +109,197,231, 95,140,107, 85,169,130,135,136, 82, 10, 65, 40,136, 96,213,171, 85, 5,111,181,108,132, 99,119,175, 98,247,189,168, +194,229, 5, 17,172,184,132,116,157,205, 38,172,179,187,242, 20,108, 0,111,120,161, 1, 43, 75,148, 41, 48,144,168,168, 17, 95, + 53, 10,116, 28, 50,105,160,159,163,131,156,192,104,226, 97, 48, 89,144,127,255, 59,184,251,214,133, 74, 37, 39, 13, 26, 24,196, + 0,172,172, 42, 97, 48,254, 72,131, 6, 13,194, 28, 28, 28,190,164,148,182, 54,155,205, 78,130, 32,160, 89,179,102,185, 34,145, +232, 84,126,126,254,130, 27, 55,110, 92, 41,163,116, 81, 91, 69,223,100,122,253,252,252, 80, 90,147, 85, 18, 90,173,214,160,209, +104, 74,101,178, 94, 16,181,122, 10,192,187,208,216, 8, 58,157, 14,203,151, 47, 47,110,228, 64, 41, 29,222,176, 97,195,145, 28, +199, 37, 93,189,122,181,162, 29,154,141, 0, 72, 11, 53,105, 94, 94, 30, 86,172, 88, 1, 74, 41, 8, 33,176, 90,173, 16, 4,193, + 43, 56, 56,216,155,227, 56,203,181,107,215, 46,255,153,101,197, 78, 15,242,255,207, 96, 21,237,216, 95,177,131, 86, 27, 63,237, +199, 77, 39,222,155,249, 89, 59,241,160, 30,117, 91, 6, 86, 33,173, 34,162,233,233, 66, 51,212,106, 68,239, 90,173,202, 57,200, +240,205,202,155, 54, 94,160,211, 94,247,247, 34,162,105, 90, 96, 21, 50,242,183, 83, 79,163,191,250,168, 46,252, 43, 56,213,179, +179,201,198,168,169, 43, 96,181, 45,179,126, 57,244,109, 73, 88,235, 15, 80,175,201, 33, 81,102,204, 97, 92,255,109, 8,214,252, +118, 73, 47,149, 64,241,126, 11,137,221,179,225, 59,168, 21, 35, 86,174, 92,165,240, 46,175, 34,120,186, 28,188,254, 41,108,134, + 12, 88, 76, 57,200,207,205, 70, 66, 82, 26, 50,117, 28, 18, 51, 68,250,196, 52,227,122,123,117, 5, 42,206,200, 76,188, 37,133, + 57, 9,181,234, 85,105,133,172, 27,128, 75,111,196,223,185, 18,158,156, 26, 37,167, 68,148,105,159, 81, 43, 30,169,234,133,109, + 91,126, 35,253,250,245,197,228, 73, 83,241, 32, 50, 2,191,110,222,129, 94,189,123,224,215,173, 59,209,162,101, 83,228,231,231, +103,218,153, 7,251, 2,171, 16, 71, 0,142,197,253,166,237,109,243,221,183,154,213, 65,248,157, 71,216,178,231,114, 16, 10,158, +245, 84, 68, 78, 68, 52, 53,217,127,121,106, 3,229,141, 40, 30,185, 66,193,224,247, 82, 15,110,175, 85,153,132, 42,229,146, 21, +223, 76,236, 28,216, 50, 80,144, 19, 83, 18, 8, 0,149, 66, 12,147,153, 71, 57,175, 90, 16, 44,121, 84,111, 48,101,223,139,130, + 13, 12, 6,227, 15,209,170,164,164,164,159,220,220,220,250, 14, 24, 48, 64,217,186,117,107,142,227, 56, 44, 94,188, 24,169,169, +169,206,109,219,182,237,177,105,211,166,118, 77,155, 54,253,213,219,219,123,152, 61, 81,173, 98,109,150, 4,128,168,232,204,127, +242,228,137,173, 99,199,142,120,242,228, 9, 87,104,188, 4, 0,150,178,142,143,252,135,154,172, 10,147, 38, 77,130, 78,167, 67, + 98, 98, 34, 98, 99, 99,145,159,159,143,154, 53,107, 34, 42, 42, 10,169,169,169,104,212,168,145,212,193,193, 1, 71,143, 30,173, + 96,167,166,116,202,148, 41, 48, 24, 12,120,250,244, 41,137,139,139,131,193, 96, 64, 96, 96, 32, 30, 63,126,140,172,172, 44, 52, +110,220,152, 56, 58, 58,226,200,145, 35,210, 63,179,188,252,149, 30,228,175,228, 47,127, 84, 78, 68, 52,125,186,231,248,221, 31, + 30, 61, 73, 68,223,246,254,240,112, 85, 62,235, 98,114,119, 81, 44,252,160, 75, 53, 68, 60,201,194,241, 43,137, 63, 68, 68,211, +167,111,232,103,125, 61,220, 28, 0, 34,129,222,104,211,149,102,195, 27,145,105,190,125,199,252, 52, 99,241,236, 97, 16,110,127, +132, 77,191, 76, 69,191,201,251, 63, 59,126, 35,211,131, 35,164, 84,179,186,114, 4,157,189, 43, 4, 16,154,178, 23,230,236, 7, +208,101, 37, 32, 51, 35, 17,249,121, 25,208,235,114,145,151,167, 71,146, 54, 5,135, 47, 37,102,216,120,122,198, 94,221, 60, 3, +119,124,223,142,121, 34,181,171,127,185,196,199,177,183,223,159,229,111,213,134, 31,184, 43, 83,184, 56,159,186,112,217, 41, 79, +207,157,176, 71,199,205,205,213,161, 40, 82,101,177, 88,208,187, 95, 47,184,149,119, 69,227,198,141,113,248,240, 17,124, 48,120, + 32, 92, 93, 92,209,165,107, 7,252,182,115, 55, 56,142,155, 87,138,124, 55, 68, 68,211,148,162, 23,128, 54,129,213, 52, 0,111, + 64,173,170,158, 0,208,166,248,247,165, 50, 87, 64,193,160,246,130, 8, 86,179,192, 42,228, 39, 0,191,134,159, 88, 50, 20,246, +221, 97,248,140,218, 85, 72,167,160, 0,159,125, 7,182, 46,174,223,174,235,135, 10,105,133,254, 68,236,247, 17, 56,199, 64,136, + 37, 82, 56, 86,125, 23,206,181, 71, 99,243,166,149,249,188, 32,108, 45,222, 61,200, 96, 48,158, 25,138, 25,213,171, 87,239,183, +123,247,110,117,229,202,149, 57,189, 94,143, 99,199,142, 97,225,194,133, 48, 26,141,168, 88,177, 34,183,123,247,110,117,245,234, +213,251,105,181,218, 25,118, 52,192,238,110,110,110, 53, 80,240,224, 93, 5, 0, 21, 0,117, 92, 92,156,195,185,115,231, 92,131, +130,130, 92,212,106,181,122,234,212,169,190,159,127,254,121, 15, 0, 30,111, 34,146, 85,190,124,249,211,193,193,193, 53,222,208, + 49, 49, 20,235, 46, 44,245, 24,102,147,201,132,205,155, 55,227,236,217,179,104,213,170, 21,226,226,226, 48,109,218, 52, 60,121, +242, 4, 31,125,244, 17,178,178,178,160,211,149,170,121,131,193, 96,192,154, 53,107,112,250,244,105, 52,111,222, 28,143, 31, 63, +198,248,241,227,113,255,254,125, 12, 30, 60, 24, 57, 57, 57,200,203,203, 99, 5,250,207, 54, 88,181, 43, 16, 49,225,224,101,181, + 24, 96,177, 81, 16, 14,154,218, 21, 72, 89, 93,237,172,101,155, 46,154,148, 82, 27, 6,117,173, 86, 63,176, 10,233, 30, 88,133, +116, 31,220,173,122,125,149, 66,140,229,191, 70,152, 0,204,122, 19, 59, 24, 88,133,120,184, 56, 41,151,116,107, 21,128,216, 20, + 19,162,226,115,119,150,102,251,248, 68,100,198, 39, 98,129,206, 96,133, 72, 44, 70,174,158, 34, 41, 25, 43,227, 19, 97, 42,109, + 90, 68, 28, 14,104, 99,111, 82, 27,113, 66, 94, 78, 58,226,158,198, 32, 38, 38, 17,217, 89,185, 80,200, 8,124,124, 60, 80,179, +102, 13,116,107,236,230, 42, 21,147, 70,246,234, 70,165,153, 70, 69, 68,220,201, 58,123,108,141, 84, 42,150, 40,124, 43, 84,228, +148,234,114, 14, 87,111,222,113,138, 75,204, 73,121,148,106, 26, 97,143, 78, 70, 70,102,126,212,147, 71,248,117,243, 14,112,156, + 8,219,182,238,196,131, 7, 15,112,233,210, 37, 28, 60,112, 8,147, 39, 78,197,172,111,231,226,248,209,211,136,139,125, 10, 65, + 16,104, 72, 72, 8, 13, 11, 11,179,150, 50, 79,106,183,106, 92,125, 94,231,214,181, 1,222,128,174,111,213, 66,179,134,149,230, + 21, 70,157,202, 4,165, 5, 93,132,151, 54,191, 85,243,210,198,102, 67, 47,174, 15,171,105, 78,220, 88,122, 29,224,243,177,125, +253,156, 93, 85,102, 14, 54, 61,136,216, 25,156,186, 26,225, 42,188, 71, 36, 13, 54,144, 4,189, 31,223,187, 95,223,212, 85, 27, +247,175,112, 50, 99, 1,171, 66, 24,140, 23, 52, 44, 28, 55,116,192,128, 1, 42,165, 82, 9,133, 66,129,245,235,215, 99,248,240, +225,144,203, 11,230,127, 84,169, 84, 80, 42,149, 24, 48, 96,128,138, 16,242,137, 61,213, 83, 94, 94,158,195, 59,239,188,227, 87, +100,174,204,102,179, 67,114,114,178, 51,207,243,229,234,214,173,235, 57,125,250,244,128,188,188,188,122,187,118,237, 74, 69, 41, +231, 43, 42, 34, 39, 39, 7, 79,158, 60,193,193,131, 7, 49,108,216,176,124,139,197, 34,115,118,118,158,242,154,209, 25,137,167, +167,167,202,203,203,171,188, 32, 8,181, 40,165,156, 32, 8,149, 74,171, 99, 52, 26, 97,177, 88, 80,175, 94, 61,236,220,185, 19, +163, 70,141,130,159,159, 31,142, 28, 57,130, 35, 71,142, 32, 52, 52, 20, 38,147, 9,165,185,230, 51, 26,141,224,121, 30,245,235, +215,199,214,173, 91, 49,118,236, 88, 84,173, 90, 21,199,143, 31,199,161, 67,135,208,184,113,227, 82,107, 50,158, 51, 88, 37,133, +230,106, 87, 32,245, 60,202,201,110, 77,121, 63,176,185, 56,104, 58,164,111, 29,197,111,107,230, 52,173,225,239,247,160,118, 5, + 18, 86,134, 40, 86,218,185,240,132, 69, 87,239, 38,160, 79,187, 42,240,245, 84,207,243,245, 84,207,235,211,174, 10,174, 70,164, +225,210,157,212, 69, 17,209, 52,237,117,118, 44,176, 10,113, 13,172, 66, 70,213,172,234,113,123,235,146,254,245, 60,221, 93,177, +249,224, 35, 10,192,238, 86,151, 47, 8, 90, 87, 0, 32,163,255,107,128, 65, 56,200, 1,120,240, 2, 74, 21,202,204,201, 55,254, + 56,254,203, 79, 51,162,227, 83,104,154,206, 1, 81,113, 89, 72, 78,207,131,213, 98,134,163,119, 48, 42,214,121, 23, 53, 2, 67, + 81, 55,192, 83,173,113, 35,125,236,213, 13, 15,167,214,116, 29,249,244,232, 85,131,251,137, 27,102, 55,133,144,100,217,124, 36, +193,101,237,129, 88, 85, 74, 6, 55, 60, 60,156,218,101,128, 4, 65, 88,181,100,201, 82,218,167,223,187,112, 41,231,130, 22, 45, +155, 96,239,158,253, 80, 42,149,168, 91,183, 46,122,121,229, 99,135,203, 78,244,116,124, 10,153, 76,134,145, 35, 71, 46, 60,121, +242, 36,120,158, 47,213,205, 18, 42,133,236,187,105,163, 59, 75,108,230,124, 76, 93,184, 29, 54,139, 14,211, 71,181,150, 40,229, +146, 21,101,206,112,161,160,139,176,241,123, 39, 31, 52, 30,120,254,231, 38, 31, 92,121, 32,245,124,187, 84, 18,193,193, 68, 34, + 17,147, 90,181,124, 76, 18, 62,225, 87,240,137,219,168,160,123, 72, 65, 45,128,186, 22, 86,172,152,151,223,237,221,247,246, 68, + 39, 36,183,189, 23, 67,167, 94, 74,160, 38, 86,133, 48, 24, 47,140,140,124, 56, 99,198, 12, 67, 98, 98, 34,130,130,130,144,154, +154,138,206,157, 59,163, 75,151, 46, 80,169, 84,168, 83,167, 14,226,227,227, 49,125,250,116,163,209,104, 28, 82,242, 5, 20, 21, +172, 86,235,189,227,199,143, 43,187,117,235, 22,176,104,209,162,170, 39, 79,158,172,110, 50,153, 42,155,205,230,192,228,228,228, +160,125,251,246, 85,250,229,151, 95,158, 62,125,250,244, 50,165,148, 47, 75,186,167, 79,159,174,219,190,125, 59, 90,181,106, 5, +163,209,152,112,242,228, 73,151, 19, 39, 78, 12,124,157, 99,225,229,229, 85, 85, 44, 22,107, 82, 82, 82,178, 68, 34,145, 53, 57, + 57,249,122,114,114,242,253, 50, 28, 83,112, 28,135, 6, 13, 26,224,210,165, 75, 88,184,112, 33, 34, 34, 34,224,233,233,137,216, +216, 88, 52,111,222, 28,132,148,174,119, 77,175,215,255, 78,115,246,236,217,184,119,239, 30, 60, 61, 61, 17, 19, 19,131,102,205, +154,129,227,254,252,142,174,127, 99,247, 32, 80,108,144,251,139,118,172,118, 5, 34, 3, 48,173,125,152,207,248,119,218,250,139, +120,253,255,177,119,230,113, 81,212,255, 31,127,125,102,102,119, 97,151, 27, 57, 23, 68,192,251, 22, 22, 81,201, 91,188, 82, 60, +179, 50,205, 50,243, 42,173, 52,175,180,180, 44, 53,239, 50,239, 51, 51, 45,175,188, 77,241,206, 11, 88, 80, 20, 5, 15, 20,132, +229,148,251,216,123, 62,191, 63, 96, 9,137, 99, 65,235,219,207,230,249, 96, 31,236,236,206,190,230, 51, 51,159,153,207,107,222, +159, 75, 5,158,231,193, 2,112,178, 97,176,117,203, 6,223,189, 7,143, 95,109,237,197,124, 79, 41,157,123,251, 9, 45,170,197, +182,151,173,249, 37,102,202,174,175,123,216,140, 31,218,172, 9, 0,136, 69, 12,214,252, 18,147, 15,212, 46, 50,208,210,151,116, +149,136,152, 95,141, 60,149, 25,140,244,182,167,187,131,116,112,112,187, 22,131,122,251,113,254, 45, 60, 97, 52,104, 48,127,237, +113,122,224,212,157,169, 49,241, 52,202, 92,221,230, 62,246,136,240, 72,155, 3, 96,190, 41,223, 18, 2,184,185, 64, 12, 96, 70, + 19, 15, 11, 9,106,209, 4, 39, 61,155, 70,186, 58,146, 87,239,220,190, 53,206,195,197,166, 95,255, 14, 86, 46, 46, 54, 84,108, +231,226, 3,137,180, 30,120,125, 33, 10,159,198,193,104, 80,131, 1,239, 83,155, 99, 16,126,199,225,203, 13, 27,190,149,246,234, +213, 75,154,151,151,135, 99,199,142, 89,102, 94,217,129,199,143, 31, 47, 5, 16,100,142, 70, 84, 84,212,180,246,237,219,227, 70, +212,205, 79,250,245,235,135,227,199,143, 67, 42,149,194,218,218, 26,190,190,190,136,200,207,199, 84, 73, 7, 52,113,105,130,224, +224,167,104,213,170, 21, 98, 99, 99,107,107,124,189,134,245,105,213,185,158, 45,139, 31, 15, 92,197,161,208, 59, 7,124,228,214, +195,198, 14,105,137, 30,129,158, 93, 90,250, 18,175, 58, 85, 13,255, 89, 69,248, 71, 76, 60,157,216,210,151,180, 10,232, 59,175, +210,222,131, 85,225, 19, 9, 62,206,151,130, 16, 22, 0, 1, 85, 39,195,248,100, 23,224,251, 33, 61,248,219,225,226,205,155,183, + 44,140,121, 68,133,168,149,128, 64, 13, 68, 70, 70, 30,237,212,169,211,180,183,223,126,123,229,219,111,191, 45,121,231,157,119, +216,171, 87,175,130, 82,138,128,128, 0,108,222,188,217,176,103,207, 30,189, 86,171,253, 36, 50, 50,242,168,153,133,176,134, 16, +162, 60,122,244,104,189, 91,183,110,213, 19,139,197, 78, 60,207, 59, 20, 21, 21,101,104,181,218,167, 57, 57, 57,169, 0,178,234, + 90,109, 95, 92, 92,108,121,247,238,221, 43, 55,111,222,244,248,248,227,143, 91, 4, 7, 7, 55, 87, 40, 20, 29,149, 74,101,157, + 27,119, 51, 12, 35,230,121,190,152, 82, 42, 43,221, 7,181,147,147,147,117,102,102,102, 65,109,181,244,122, 61,100, 50, 25, 30, + 60,120,128,174, 93,187,226,252,249,243,112,113,113,129,171,171, 43,122,244,232,129,219,183,111,195,198,198,166, 86, 38, 75,175, +215,195,202,202, 10,247,239,223, 71,183,110,221,112,249,242,101,184,186,186,194,213,213, 21,189,122,245, 66,116,116,116,173, 53, +159,199,100,189,108,215, 65,149,145,135, 86,245,201, 36,153, 4,171,223, 25,228, 43,246,105,224, 9, 93,134, 18, 81, 15, 10,240, +197,150,192, 24,194, 89,105, 62, 28,219, 87,209, 35,216, 25,221,186, 7, 18,239, 6,246, 31, 45, 89,178,254,131, 86,245,201,167, +183,159,208,239,204,140, 98,229,181,244, 37,223,156,143, 72,249,214,211,185, 24, 20, 20,231, 35, 82,112,243, 94,214, 55, 49,241, + 52,175, 54, 59, 97, 33,102,126, 86,134, 71,187,192, 88,140,212,251,135, 59,186,185, 54, 0,120, 29,244,218, 98, 92,137,188,141, +109,123, 47, 22, 69,220,126, 50,210,140, 49,149, 0, 0,247, 18,115,126,127,240, 36,183,239, 87, 19, 3,209,255, 21,175,113,139, +183, 69,142, 46,187,102, 41,208,163,157,253,163, 81, 61,108,100, 50, 78, 11, 3, 36,136,188,159,123,210,220,180,166,101,209, 8, + 0, 17,238,245,136,109,244,189,244,254, 3,187,184, 44, 15,244, 51,184, 23,166, 71, 34,229,201,125,100, 23, 73,144,146, 77,192, + 3,247,107,115, 12, 84, 42,213, 43,163, 71,143,166, 15, 30, 60, 64, 78, 78, 14,182,109,219,102,250, 60,168, 54, 58, 60,207,127, +197,113,220, 39,129,129,129,184,115,231, 14, 60, 60, 60,224,237,237, 13,185, 92,142,251,247,239,195,198,198, 6, 98,177, 24,161, +161,161, 72, 74, 74, 66,163, 70,141,106,123,241,141,236,219,217,151,192, 88,140,253,191,223,206, 4, 48,242,192,233,187,201, 99, + 7,249, 56,245, 13,114, 39,199, 46, 62, 26, 9, 96,113,237, 47, 78, 35,192, 23,151,207, 95,181,238, 61,184,151, 82, 99,203,134, +228,193,158,208,116,235,215,250,251, 75,197, 34,134, 64,157, 12, 74, 36,100,245,218,237,249,140, 17,155,132,162, 83, 64,192, 60, +174, 94,189,186,177,125,251,246,151,183,109,219, 54,139, 97,152,174, 90,173,214, 5, 0,127,234,212,169, 20,131,193,112,190,168, +168,104,101,100,100,100,108,237,174,115, 74, 81,210, 25, 38, 19, 64,236,139, 76, 47,199,113, 63,103,103,103,127, 1,224,141,223, +127,255,125,205,208,161, 67,113,232,208,161,241, 0,234,108,176,140, 70, 99, 94, 90, 90,218, 67, 15, 15, 15,103, 47, 47, 47,231, +130,130,130, 84, 11, 11, 11,119, 0,247,106,171,165,213,106, 97, 99, 99,131,251,247,239,227,131, 15, 62,128,175,175, 47, 18, 19, + 19,209,189,123,119,244,237,219, 23,107,215,174, 69,189,122,245,106,165,169,211,233, 96,109,109,141,251,247,239,227,147, 79, 62, + 65,139, 22, 45,240,232,209, 35,244,234,213, 11,189,123,247,198,250,245,235,107,173, 41, 96,134,193, 2,240,213,169, 95, 22,137, +193,235,177,111,215, 82,132, 70, 20,105,239, 38, 99, 46,128,213, 64, 33,255,249,242,253, 19,143, 94,120,184,236,189,119, 6,202, +122,118,235,141,158, 93,123,112,173,252,186,125, 14,160,204, 96, 17, 66, 90,215, 48, 86,198,154,141, 7,238, 46,254,229, 88, 28, + 3, 67, 62,222, 24,220,158, 7, 80,109, 53, 81,101,154,148,130,192, 88, 12,228, 94,199,209,211,215,225,230,154,140,123,241, 79, +112,228, 84,196,245,236,188,162,173, 0,246,198,196,211,124,115, 53,115,242,181,239,247,155,122,100,211,235,193,141,250,125,242, + 86, 91, 28, 90,241,170, 36, 62, 57, 15, 70,131, 1,125,218,240, 64, 51,137,140, 18, 35, 46,223,227,232,166, 99, 73,251,181,122, +254, 3,115,210, 89,158,148,167, 52, 15,192,158,102, 94, 44,138, 53,186, 47, 71,244,244,110, 72,224, 72,210, 51,115,177,255,124, +202,213, 39, 25,152, 87, 27, 77,185, 92,126,117,254,252,249, 24, 54,108, 24, 50, 50, 50,224,229,229,133, 29, 59,118, 64, 46,151, + 95, 85,169, 84,157,106,113, 60, 53, 6,131, 1, 23, 46, 92,192,232,209,163,161,211,233, 96, 48, 24,160, 86,171, 17, 24, 24, 8, + 74, 41, 30, 61,122, 4,189, 94, 79,111,222,188, 57,227,246,237,219,203, 89,150, 53,152,155, 78, 39,123,233,152,128, 22,142,184, + 29,151,136,199,170,220,159, 98,226,169,174,165, 47,249,233,102,108,218,180, 87,218,186,192,209, 86, 50,166, 50,131, 85,149,102, +105,187,173,206,224,245,166, 94,132,157, 91,250,146, 86,230,244, 28,172, 76,147,231,241,214,202, 61, 9,243,246,158,203, 28, 60, +243,253,174,182,175,116,236, 39,161,188,142,230, 23,105,244, 49,137, 53, 27,127, 51,242,124,173, 17, 52, 5,205,255,175,154,225, +225,225,119, 0,188,253,255, 97,223,207,157, 59, 55, 25, 0, 20, 10,197,174, 3, 7, 14, 44,255,241,199, 31, 37,182,182,182, 29, +158, 71, 51, 53, 53,245,110,233,122,233,238,238,238,173,178,179,179,111,122,120,120, 52,168,139,102,113,113, 49,164, 82, 41, 40, +165,216,179,103, 15, 2, 2, 2,240,230,155,111,226,238,221,187,216,184,113, 35,108,108,108, 96,101,101, 85,103,205,221,187,119, +163, 93,187,118, 24, 50,100, 8,226,226,226,176, 97,195, 6,200,100,178, 90,107, 10,152,103,176,140,224,245,200, 13,159,143, 13, +199,160,211,234,209,252,246, 19,250,168,220,247,235, 91,213, 39, 71,162,111,223,141, 87, 94,235, 41, 65, 94,116,201,111,106, 65, + 76, 60, 85, 7, 52,231,114, 97,200,119, 64,198, 9,196, 39,231,231,198,196, 83,117,173,157,189,158, 31,233,223,161,227, 94,158, + 66, 98, 48,242, 27, 40,197, 17, 0,241, 49,241,117,155, 51, 46, 49,137, 38, 3,232,239,229, 73,122, 28,190,248,120,197,184,193, +205,219, 78, 26,222, 10,197, 69,249, 96,169, 26,183, 82, 36, 88,123, 56,245,122, 86,190,238,163,196, 36,250, 92,115, 30,197, 38, + 26,247,120, 56,147,240,251,143,115,230, 74, 37,168,103, 52,226,246,163,116,108,127,146, 78, 19,106, 25,193,234, 36,151,203,233, +151, 95,126,249,151,207,107,163,163, 84, 42, 53, 10,133,226,211,115,231,206, 45, 63,119,238, 92,165,235,176, 44, 75,141, 70,227, + 56,165, 82,185, 13,192,138,218,232, 55,244,178,171,207, 65,131, 67,103,227, 0, 96, 87,233,199,187, 14,157, 79,152,214,182,137, + 35, 26,121,217, 54,110,233, 75,164,102, 78,147, 3, 0, 31, 68,156,252,178,185,250,222,231,160, 84,143, 63,214, 57, 52,239, 60, + 57,251, 3,212,113,132,245,187,143,104, 50,128,137, 45,125,200,198,143,190, 57,241,121, 64,235,219,157, 63,157, 56,196, 22,194, +196,232, 2, 2,255, 9,148, 74,101,174, 66,161, 24,217,179,103,207,153, 69, 69, 69,223,190, 8, 77, 74,169,193,213,213, 85,229, +234,234,218, 92,167,211,213,186, 92, 34,132,100,158, 58,117,202,225,207, 7, 65, 30,215,175, 95, 7,207,243, 96, 24, 6, 44,203, +130, 97, 24, 16, 66,192,113, 92,182,153,154,250, 83,167, 78,113,229, 52,201,181,107,215,202, 52, 57,142, 43,171,157,224, 56, 78, + 24,205,253, 5, 27,172, 47, 95, 25, 54,127, 62, 74,198, 21, 89, 80,193, 92, 1, 0,110, 63,161,170, 86,245,201, 39,173,252,186, +153,198,171,250,178,182, 9,208,234,248, 55,218, 43,154,238, 42,125, 63,170, 46, 59, 17, 19, 79, 47,226, 57,187,229, 86, 97,180, +206,121,121, 18,191, 85,187,111,142,252, 53,244,225,250, 25,111,183,179, 94,182,243,105, 65, 74,102,209,232,196, 36,243,231, 53, +172,137,228, 12, 26, 15, 96,236,243,234,168, 84, 42, 66, 8, 89, 0, 96, 62,128, 47, 41,165, 11,234,120,131, 89, 81, 91,227,100, + 46, 97,209,169,107,223,154,245,251,148,152,135,217, 59, 98,226,233,141,210,243,119,163,165, 47, 89,146,160, 42,248, 40,250,126, +214,186, 90,152, 43, 0, 88, 27,208,239, 47,195,165,173,125,222,116,198, 60,162, 55, 0, 12,109,233, 67,122,191, 62,249,251,233, + 4, 80, 9,183, 11, 1,129,255,140,201, 58, 8,224,224,139,212, 76, 75, 75,203, 64, 29,123, 55, 82, 74,221,241,236,192,224,224, + 56, 14, 58,157,142,112, 28, 71, 75,215, 65,233, 64,206,102, 53, 12,182,178,178,186,150,156,156, 76, 36, 18, 9,181,176,176, 0, + 33, 4, 14, 14, 37, 30,238,194,133, 11,229,103,167, 16, 50, 68, 29, 33,127,231,193,123,153,194,230, 94,158,132, 3,208, 8,192, +163,196, 36,170,253, 47,237,251,139,214,108,233, 75, 68, 49,241, 84,255, 95,205, 75,130,166,160, 41,104, 10,154,130,230,203,143, + 80,237, 97, 38,137, 73,212,128, 23,220,168,242,191, 74,109,205,149,128,128,128,128,128,192,255, 55, 24,225, 16, 8, 8, 8, 8, + 8, 8, 8, 8,188, 88, 8,128,214,149,125, 81,155,208, 31, 33,164,117,109, 55, 92,147,190,160, 41,104, 10,154,130,166,160, 41, +104, 10,154, 47,159,102, 77,218, 47, 75,213,163,208, 6, 75,208, 20, 52, 5, 77, 65, 83,208, 20, 52, 5,205,255,185,230,203,134, + 80, 69, 40, 32, 32, 32, 32, 32, 32, 32, 32, 24, 44, 1, 1, 1, 1, 1, 1, 1, 1,193, 96, 9, 8, 8, 8, 8, 8, 8, 8, 8, + 6, 75, 64, 64, 64, 64, 64, 64, 64, 64, 64, 48, 88, 2, 2, 2, 2, 2, 2, 2, 2,255, 26,136, 48, 12,190,128,128,128,128,128, +128,128,192,139,133, 1, 0, 66, 8, 45,125,117, 19, 14,137,128,128,128,128,128,128,192, 63,197,203,234, 65,202,166,202,161,148, + 18, 66, 8, 69,201,224,163, 2, 2, 2, 2, 2, 2, 2, 2,255, 8, 47,163, 7, 97,202, 59, 72, 0,221,133,211, 44, 32, 32, 32, + 32, 32, 32,240, 79,242, 50,122,144,103, 34, 88,194, 41, 22, 16, 16, 16, 16, 16, 16,248,167,121, 25, 61,136,208,139, 80, 64, 64, + 64, 64, 64, 64, 64,224, 5, 35,244, 34, 20, 16, 16, 16, 16, 16, 16, 16,120,193, 8, 17, 44, 1, 1, 1, 1, 1, 1, 1,129,255, + 79, 6,139, 16,210, 90,208, 20, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65, 83, 48, 88, 2, 2, 2, 2, 2, 2, 2, 2, 2,130, +193, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12,150,128,128,128,128,128,128,128,128, 96,176, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +131, 37, 32, 32, 32, 32, 32, 32, 32,240, 63,130, 0,168,180, 39, 0,165,244,150,217, 34,117,232, 77, 80,147,190,160, 41,104, 10, +154,130,166,160, 41,104, 10,154, 47,159,102, 77,218,181,241, 31,255,106,131,245,119, 14, 52, 74, 8,105,253,162, 15,148,160, 41, +104, 10,154,130,166,160, 41,104, 10,154, 47,159,230,203,134, 80, 69, 40, 32, 32, 32, 32, 32, 32, 32,240,178, 24, 44, 66, 8, 67, + 8,225, 74, 95, 12, 33,132,252, 27, 53, 5, 4, 4, 4, 4, 4, 94,118, 34, 34, 34,104,102,102, 38,117,119,119,191, 75, 8,153, + 36, 28,145,231,135,123,145, 98,205, 92,164, 29,189,235,187, 14, 56, 17,241,104,110,117,235, 41, 20, 10,209,128, 1, 3,118, 18, + 66,222, 40,255,121, 72, 72,200, 51,235,137, 68,162,204,236,236,108,247,243,231,207, 27,106,218,182, 66,161, 16, 13, 28, 56,112, + 39,128,231,214, 28, 50,100, 72,154,209,104,116,169,213,129,228,184,244,131, 7, 15,186,214,180,158, 92, 46,127, 5,192,167,102, + 72, 46, 87,169, 84,151,133, 44, 42, 32, 32, 32, 32,240,119,115,250,244,105,140, 31, 63, 30,209,209,209,205,142, 31, 63,190, 78, + 46,151,127,144,146,146,210,131, 82,154, 33, 28,157,255,177,193,106,236,110,221,204,205,217,233,232,183,223,204, 7,128,185,213, + 25, 33, 55, 55,183,157, 94, 94, 94, 3, 86,174, 92,137,163, 71,143,194,199,199, 7, 98,177, 24, 44,203,130, 97, 24,176, 44, 11, +150,101,241,241,199, 31, 59,148,166,209, 80,147,185,114,119,119,223,233,229,229, 53, 96,197,138, 21, 56,118,236, 24,188,189,189, +203, 52,203,235,154,163,105, 52, 26, 93,126,253,245, 87, 88, 90, 90, 2, 0, 40,165,224,121,254,153, 23,165,180,236,101, 52, 26, + 49,122,244,104,115, 13,217,167,119,239,222, 29, 84, 88, 88,248,140,134,105, 27,166,247, 93,186,116, 1, 0,193, 96, 9, 8, 8, + 8, 8,252, 45, 52, 24,182,101, 29,111,208,149, 70,171,236, 1,108, 66,126,126, 62,198,141, 27,135, 67,135, 14,181,232,216,177, +227, 18, 0, 99,133, 35,245, 63, 52, 88,141, 60,164, 30,118,150,178, 83, 27,215,127, 79,244,249,105, 14, 85,173, 71, 8, 97, 6, + 12, 24,176,213,203,203,171,239,202,149, 43,173,196, 98, 49,226,222,123, 15, 57,106, 53,116, 75,151,194,222,217, 25,141,199,143, + 71, 61,131, 1,198, 27, 55,204,218,182, 73,179,126,253,250,125, 87,172, 88, 97, 37, 22,139,145,148,148, 4,173, 86, 11, 23, 23, + 23,200,100, 50, 72, 36,146,178,151,185, 88, 90, 90,226,244,233,211,224, 56,174,236,197,178,108,165,203,174,174,174,181, 57, 92, +203,155, 55,111, 30, 24, 23, 23,231,154,157,157,141, 78,157, 58,165, 1, 8, 43,247,125,224,205,155, 55, 93,133,172, 41, 32, 32, + 32, 32,240,119,194, 27,116,147,218, 5, 4,149, 45,255,120,250,123,104,236,252,145,188, 96, 1, 86,175, 94,141, 38, 77,154, 4, + 10, 71,233,127,104,176, 90,123,217,217, 91, 16,209,169, 77,235, 86, 73,160, 43,116,136, 13,191,140, 86,253, 39, 0,120,182,171, +101,105,123, 40,134,227,184,183,150, 46, 93,202,136,197, 98, 0,128,194,104,132, 92,167, 67,110,203,150,144,218,219,163,190, 78, + 7,162,211, 65, 83,250,125, 69,204,209,100, 89, 22, 98,177, 24, 34,145, 8, 34,145, 8, 98,177,184, 90,131, 85, 85, 79, 8,147, +137, 58,125,250, 52,244,122, 61,134, 15, 31, 94,169,217,170,141,166, 74,165,186, 44,151,203,195, 40,165,131,120,158, 7,128, 48, +149, 74, 53,216,244,189, 92, 46,127,165,109,219,182,159, 2, 88,110,174,230,243, 32,104, 10,154,130,166,160, 41,104,254, 55, 53, + 25, 78,188,254, 70,196,149, 73, 0,144,119,231, 0, 62, 26, 25,132,252,252,251,152, 56,241,115, 36, 39, 39,227,222,189,123,202, +127, 50,157, 47,173,193, 34,132, 80, 74,105,173, 26,133,123,122, 18, 75, 27,163,244,232,186, 85, 75,236,108,172,101,206, 17,167, + 14, 34, 33, 33,181,122,199,204,243,244,196,137, 19,136, 27, 55, 14,126, 70, 35,178,151, 45, 3,145,203,209,106,240, 96,136,116, + 58,228,135,133, 65,108,109, 13,137,181,181,249, 46,188, 84, 51, 57, 57, 25, 28,199,193,218,218, 26, 86, 86, 86,176,176,176, 40, + 51, 86, 98,177, 24, 98,177, 24,230,182,123,167,148,130,227, 56, 68, 71, 71, 35, 33, 33, 1,118,118,118,184,114,229, 10,130,131, +131,159, 49, 87, 44,203,162, 46,109,233, 77, 85,139,149, 25, 48, 8, 85,131, 2, 2, 2, 2, 2,127, 51, 9, 7,198, 77, 38,132, + 44,244,242,242,186,176, 97,241,226,198,189,122,245, 2, 0,156, 57,115, 6,219, 70,142,196, 2,224,237,239, 9, 73,153, 74,233, +156,191, 59, 45,117,241, 32,255, 47, 12,150,105,199,106,179,131,132, 16,210,198,219,117,239,188, 25,239,249,120,249, 54,116,187, +126,236, 87,196,199,171,144,150,150, 93,149,161,160,132, 16, 30, 0,245,241,241, 65,182, 70, 3,185, 86, 11, 86, 46,135,117,189, +122, 96, 75, 35, 87, 34, 43, 43,136,173,173,205, 50, 67,229, 53,189,189,189,161,209,104, 32,145, 72, 96,109,109, 13, 27, 27,155, + 50,131,101, 50, 87,226, 42,162, 98, 85,152, 54,112, 28,135,155, 55,111,162,115,231,206,240,242,242,194,158, 61,123,208,183,111, +223,191, 68,177,234,106,176, 74, 35, 88, 0,158,105,252, 46, 52,110, 23, 16, 16, 16, 16,248, 71, 96, 89,118,201,111,191,253,214, +216,210,210, 18,223,124,243, 13,108,108,108,112,109,225, 66,108, 19,139, 33, 5,176, 94,167,155, 13,224,111, 53, 88,117,241, 32, +255,111, 12, 86, 93, 24, 50,100,200, 10,159,250,238, 93,125, 91, 7, 88, 94, 63,121, 0,247,239, 37, 32, 51, 51, 23, 0,138,171, +243, 21, 0, 32, 18,137, 80,188,112, 33,178, 90,183, 70,235,225,195,193,234,116,200,191,118, 13, 98,107,107,200,252,253, 1,173, + 22,226,180, 52,179,189,138, 73,211,217,217, 25, 98,177, 24,150,150,150,176,180,180,132,133,133,197, 51,230,170,182, 6, 43, 55, + 55, 23,143, 31, 63,198,132, 9, 19, 32,147,201,192, 48, 12,210,210,210,208,160, 65, 3,176, 44,139,228,228,100,156, 59,119, 14, + 62, 62, 62, 96, 89,182,174, 6, 43, 80, 46,151, 31, 2, 16,168, 84, 42, 93, 21, 10, 5, 32, 68,176, 4, 4, 4, 4, 4,254, 1, +154, 52,105,162,240,240,240,192,199, 31,127, 12,245,238,221, 40, 0, 48, 16,192,111, 58, 29, 0,192, 6,152, 46, 28,165,127,208, + 96, 13, 26, 52,232,195,198,141, 27,143, 91,180,104,145,245,183,159,207,204,123, 26, 19,205,234,138,181, 86, 26,189, 65,251, 32, +237,233,247,213,152, 10, 58,104,208, 32,176, 44, 11,107, 7, 7,200,236,236, 32,170, 16,185,130, 86, 11,104,181, 16,137, 68,230, + 26,149, 50, 77,169, 84, 10,137, 68, 82,105,228,170,182, 6, 43, 39, 39, 7,251,246,237, 67, 96, 96, 32,100, 50, 25, 88,150, 69, +155, 54,109,112,231,206, 29, 52,108,216, 16,148, 82,252,246,219,111, 24, 54,108, 24, 30, 60,120, 0,185, 92, 94,107,131,101, 52, + 26,113,234,212, 41, 87, 74,233, 32, 74, 41, 50, 50,132,222,176, 2, 2, 2, 2, 2,255, 28,247,238,221, 11, 75, 72, 72,104,254, +249,231,159, 99,187,135, 7,108,108,108, 48,109,254,252,171, 6,131, 33, 72, 56, 58, 47,192, 96,213, 38, 52, 55, 96,192,128,161, + 46, 46, 46,223, 46, 88,176, 64,154,156,156, 12,143, 38,173,109,143,253,182, 79, 83,207,130, 41, 78,202,200, 25, 19,157, 90,176, +191, 38, 13,134, 97,208,228,147, 79,224,173,213, 34,251,202, 21,136,173,173, 97, 29, 16, 0,104,181,176,120,252, 24, 18,107,107, +176, 82,169,217, 59, 65, 8, 1,195, 48,149, 70,172,202,191, 24,198,188,113, 85, 19, 18, 18, 16, 28, 28,140,224,224, 96, 12, 31, + 62,188,172, 42,176, 93,187,118,248,229,151, 95, 48,116,232, 80,220,184,113, 3,114,185, 28,205,154, 53, 67,179,102,205,112,237, +218,181, 90, 27, 44,158,231,209,183,111, 95, 83, 47,194,192,176,176, 48,161,247,160,128,128,128,128,192, 63,134,209,104,156, 61, +120,240,224,246,223,124,243, 77,139,105,211,166, 1, 0,228,114,121, 39,185, 92, 30,243, 79,141,131,245, 50, 86, 15, 2,229, 70, +114, 55,237, 96, 85, 43,118,239,222,125,243, 43,175,188,242,148, 97,152,253, 33, 33, 33,108, 90, 90, 26,142, 31, 63,142, 99,199, +143, 23, 57,248,182,186, 94, 32,177,109,106,142,185, 50, 25, 34, 75,189,254,217,200,149, 70, 83, 82, 53,104,101, 5, 86, 38,171, +253,142, 48, 76,165,166,202, 20,201,170, 77, 21,158,151,151, 23,254,248,227, 15,188,251,238,187,144,201,100,101,109,174,124,125, +125, 1, 0, 97, 97, 97,184,120,241, 34,186,118,237, 10,142,227, 32,149, 74,145,148,148, 84,171,244,242, 60,111,106,228,110,234, + 69,248, 90, 96, 96,224, 97, 84,210,123, 80, 64, 64, 64, 64, 64,224, 69,211, 96,216,150,117,158, 33,107,211, 89,197,220, 22,211, +191, 59, 3,191, 78,189,177,114,229, 74,116,232,208, 1,135, 14, 29,106,193,178,236,146,127, 42, 45, 53,121,144,255,143,112, 21, +119,176, 10,115,245,142,131,131,195,200,177, 99,199, 74,163,163,163,177,117,235, 86,206,215,215, 87,247,232,209, 35, 3,165,116, +250,137, 19, 39, 55,214,214, 12, 21, 31, 59,134,124, 55, 55,216,181,111, 15,104,181,144,148, 70,174, 10, 60, 61, 65, 53, 26, 56, +228,230,214,218, 96,153,134,100, 40, 63, 44,131, 88, 44,174,114, 40,133,234, 12,160,105,128,210,138,227, 94, 77,156, 56, 17,155, + 55,111, 70, 80, 80, 16, 26, 55,110, 12,142,227,204,142,140, 85, 56,214,207, 52,114, 23,122, 15, 10, 8, 8, 8, 8,252,147, 60, + 51, 14, 86, 64, 16, 46, 31, 88,134, 61,113, 94, 72, 94,184,240,127, 50, 14,214, 75, 27,193,170,138, 14, 29, 58,216,228,228,228, +124, 55,102,204, 24,105, 97, 97, 33,146,146,146,160, 84, 42, 17, 31, 31,127,218,104, 52,182, 58,114,228,200,198,106,140, 74,235, +202,204, 11,195, 48,176,119,113,129,196,198,166,164,205,149, 78, 7,177,149, 21, 56, 43, 43,208,210, 72, 22,165,212,108, 77,224, +207,177,175,202, 71,173,204, 53, 87,149,105,154,134,105,168,216, 99,176,126,253,250, 88,180,104, 17, 6, 13, 26, 84,237, 48, 13, + 85,165,179,180,183, 96, 32,128,242,141,220, 95, 49,211,248,181,126,209, 25, 64,208, 20, 52, 5, 77, 65, 83,208,252,111,106,150, +142,131,133, 27, 17, 87,112, 97,199, 52,124, 48,208, 7, 67,189,239,227,243,207,107, 30, 7,235,239, 72,231,203, 70,141,238,163, +168,168,104, 97,211,166, 77, 37,119,238,220,193,131, 7, 15, 16, 23, 23,135,172,172,172,251, 71,142, 28, 25, 88,215,141,178, 44, + 11, 59, 59, 59, 72, 36, 18,136,146,147, 33, 17,139, 33, 42, 29,247,202, 33, 55, 23,148, 82, 16, 11,139,218, 57, 69,134, 1,199, +113,207,152, 43,115, 27,202, 87,134,209,104, 44, 27,161,157, 16,242,204,139, 97,152,178, 87, 29,134,104,248,244,218,181,107,174, + 9, 9, 9,160,148,226,192,129, 3,174,195,134, 13,251, 20, 66,244, 74, 64, 64, 64, 64,224, 31, 36,225,192,184,201, 0, 38, 19, + 66,222,156, 63,127,254,238,201,147, 39,131,231,121,156, 63,127, 30,107,103,205,194, 2,163,241,237,239, 9, 41,154, 74,233,100, +225,104,189, 64,131, 21, 24, 24,232, 93, 88, 88,184, 83,175,215,251,241, 60, 47,185,112,225, 2,212,106, 53,238,220,185, 83,204, +243,252,190, 58,111,144,227, 82,166, 78,157, 90,223,156,117,197, 98,113, 54,106,152,135,176,212,176,189, 80, 77,142,227,210,107, + 49,183, 32, 0, 64, 36, 18,165,155,185,234,242,142, 29, 59,254,229, 51, 33, 43, 10, 8, 8, 8, 8,252, 47,176, 16,139,223,254, +224,131, 15,240,211, 79, 63,225,224,234,213,232,155,148,132, 61, 98, 49,164, 98, 49,214,235,116,147, 0, 8, 6,235, 69, 26,172, +252,252,252, 69, 89, 89, 89, 29,243,242,242, 12,241,241,241,197,132, 16, 3, 33,164,152,231,249,175,120,158,223, 80,215, 13,238, +223,191,223,235, 69,239,196,129, 3, 7, 94,168,230,193,131, 7,255,182,222,124, 66, 91, 43, 1, 1, 1, 1,129,127, 19, 55,162, +163,251, 2, 64,255,254,253, 81, 60,189,100,216,171, 31,255, 28, 7,107,253,191, 36,153,237, 1, 56,151,190,207, 4, 16, 11, 64, + 1, 64, 10, 64, 3,160, 0,128, 83,185,245,159,150,126,103,250,254, 34, 0,253, 63,153,224, 42,219, 96,197,198,198,190,153,145, +145,193,105,181, 90, 11,163,209, 40, 51, 24, 12,182,122,189,222,205,104, 52,174,167, 85, 53,144, 18, 16, 16, 16, 16, 16, 16,248, +127, 69,211,166, 77,137,147,147, 19,105,218,180, 41,153, 71,233, 51,175,127, 81,245,160, 51, 33,228, 40, 33,228,232,156, 57,115, +122, 0, 8,154, 51,103, 78, 96,233,114, 0, 0, 39,211,247,132,144,163, 0,234, 85,248,190,221, 63,157, 96, 70,200, 90, 2, 2, + 2, 2, 2, 2, 2,255, 31,160,148, 14, 92,178,100,201, 34, 0,236,146, 37, 75, 22,149, 91, 6,165,116, 96,249,255, 21,190,119, +254,167,211, 74, 0,180,174, 98, 39,204,158, 41,187, 46,189, 9,106,210, 23, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,229, +211,172, 73,187,138,223, 15, 32,132, 28,165,148, 14, 44,255,191,188,241, 42,213, 60, 90,254,125,133,239,143,253,211,110,240,111, +123, 1,104, 45,104, 10,154,130,166,160, 41,104, 10,154,130,166,160,249,156,175, 1, 37,150,165,234,255, 85,189, 47,247,217, 63, +153, 94,161,138, 80, 64, 64, 64, 64, 64, 64,224,255, 7,132,144,163,179,103,207,254,236,255, 67, 90,185,127, 67, 34, 66, 66, 66, +236, 1,136,142, 28, 57,242, 66,230, 60,106,217,114,132, 56,131,211,182, 96, 13,176, 83, 51,198,155,185,183,142,229, 60,143, 94, +235, 38,196,147, 55, 96, 8,128, 1,165, 31, 29, 99, 56,252,118,235, 30, 77,170,101,198,112, 45,141, 26,166,189,136,245, 94,244, +111, 5, 94, 14,228,114,185, 20,192, 16,142,227,198, 56, 58, 58, 6,166,167,167, 47, 80,169, 84,171, 94,194, 27, 45,211,174, 93, + 59, 75,150,101,137, 84, 42,229, 37, 18, 9,181,176,176,168,216, 1,199,112,228,200, 17,195,203,122,174,187,119,239,110, 1, 0, +231,207,159,215,252, 63,203,163, 12, 0, 27, 0,249, 42,149,138, 23,174, 90,243, 8, 10, 10, 74,212,106,181,213, 14, 73, 36, 22, +139, 51, 37, 18,137,251,249,243,231, 95,182,124,159,105,170,250, 3,144, 14,128, 45, 93,214,150,254, 79, 43,247, 89, 90, 21,223, +255,247, 12, 22,128, 72, 75, 75,203,250, 33, 33, 33,251, 0, 44, 59,114,228, 72, 84, 93, 68,220, 90, 14,110, 14,137,197, 46,207, + 38, 22,245, 7,182,104, 42,177,148,216, 48, 81,202,244, 34,119,197, 72, 45,111,208,205, 79,187,185,127,155,249, 38,141, 72,161, + 65, 95, 0, 67, 26,121,185, 4,125, 50,241, 53,167,246,175,244,149, 22, 22,235,113,241,236,177,142, 91,127, 58,242,113, 43, 95, +114,149, 7,126, 35,150, 56, 25, 19, 67,139,107, 40, 12, 22, 19,130,153,165,239,151, 82, 74,231, 60,207,122, 53,253,150, 97,152, + 85, 60,207,127,250,130, 11,180, 54,142,142,142,155, 36, 18,137, 21,203,178,247,146,146,146, 22, 83, 74, 35,106,171,227,233,233, +217,154,231,249, 97, 44,203,182, 55, 26,141,225, 12,195, 28, 72, 74, 74,186,245, 28,233, 98, 91,180,104,252, 46, 33,232, 76, 0, + 71, 10,100, 81,138, 63,238,220,185,191,157, 82,106,172, 99,193,197,169, 11, 11,223,102, 25,102, 32, 5,218, 2, 32, 4,184,105, + 48, 26,143, 73,173,173,119,152,123,243,234,212,169, 83,162,193, 96,112,175,205,182, 89,150, 77,215,235,245, 94, 74,165,178,214, +105,151,203,229, 35, 60, 60, 60,182,117,236,216, 81,214,174, 93, 59, 72, 36, 18, 44, 93,186,116, 58,128,127,165,193,114,119,119, +159, 67, 8, 9, 44,125, 40, 8, 75, 73, 73, 89,108,206,239, 2, 2, 2,196, 33, 33, 33,191, 18, 66, 6, 1,168,178,128,102, 24, + 38, 63, 36, 36,196,185, 58,147,229,211,201, 49,130,101, 88,207,170,190, 55,242,198,164, 71, 87,179, 2,158,119, 95,131,131,131, +247, 83, 74,135, 25, 12, 6,176, 44,123,246,236,217,179,189,204,253,173, 66,161,112, 2, 48, 19, 0, 11,224, 91,165, 82,153,238, +239,239, 31, 42,145, 72,122, 1,128,191,191,255,153,200,200,200,224, 10,191, 33, 74,165,178,206, 61,190,187,117,235,246, 37,165, +244, 3,177, 88,156,152,149,149, 53, 58, 42, 42,234,238, 11, 48, 86, 34, 0,211,157,157,157,167,180,111,223,222, 61, 38, 38, 38, + 85, 46,151,127, 15, 96,133, 74,165,210,155,113, 28,228, 0,222, 5,240,118,233,177,216, 3, 96,135, 82,169,124,248, 95, 48, 88, + 6,131,193,253,234,236,217,128,133, 5,140,221,186,129, 39, 4,228,235,175,193,167,165, 65,247,237,183, 48, 0, 24, 56,112,160, + 67,105,217,254,178, 25,172,176,255,111, 9,174,214, 96,249,118,122,251, 33,195, 16,103,202, 83,202,131,130,210,146, 1, 26, 40, + 45,249,163,244,207,207,120,158, 79, 75,141,250,181, 69, 45,162, 86, 31,235,245,250,198, 34,145,104, 13, 0,239, 13, 27, 54,224, +222,189,123,111,236,220,185,243,141,144,144,144,115, 0,150, 30, 57,114,228,148,217,230,170,221,235,159,186,120,120,124,246,205, +220, 41,246,173,155,216, 33, 51, 55, 1,160, 98, 76, 25,229, 37,205,204, 41,194,170, 45, 91,215,184,249,189, 49,218,168,227, 7, +102,196,236, 45,172,214, 92,249,144, 81, 82,169,120,230,148,201, 3,220,251,247, 31, 96,235,232,169,224, 64, 74, 38,139,182,176, + 5,134,141,154,102, 53,228,205,169, 86,241,119,254,240, 60,118,236,104,191,159, 15,158, 83,181,244, 33, 75, 99, 30,209, 93, 85, + 69,149, 8,193, 76,158,167, 76,201, 77,159,204,238,213,171, 87,127, 75, 75,203,103,110, 40,106,181, 90, 68, 8, 90,243, 60, 45, + 45, 28,200, 76, 66,200,119,230, 68,163, 76,219,208,106, 53,140, 72, 36, 1,203, 50,211,253,252,252, 2,210,211,211,207,176, 44, +187,225,201,147, 39,153,207,147, 81,100, 50,217,248,193,131, 7, 47,251,241,199, 31,109, 44, 45, 45,145,146,146,210,252,141, 55, +222,240, 35,132,244,167,148,214,120,227,117,119,119,247, 39,132, 12,119,118,118,126,125,220,184,113,222,189,122,245,130,183,183, + 55, 84, 42, 85,223,115,231,206,125, 17, 16, 16,144,144,146,146,242, 11,165,116,127, 74, 74, 74,100,109,204, 85,203,150, 77,214, + 76,158, 60,165,213,176, 97,195,235, 75,165, 82,139,164,164,196,164, 13,235,214, 58,176,132,248, 17, 66,166,212,214,100, 5, 4, + 4,180,228, 8, 57, 48, 97,236, 88,159,246, 65, 65,156,171,187, 59,212,185,185,120, 16, 27,235, 21, 30, 22,214,247, 80,104,232, + 76, 63, 63,191,215,162,162,162,162,107,210,210,233,116,245, 47,125,243, 13, 88, 39, 39, 80,189, 30,234,198,141,203,234,231, 45, +174, 94, 5,244,250,146,207,123,244, 0,165, 20, 70,163, 17,195,134, 13,115, 5, 32, 2, 80,171,116,203,229,114,121,211,166, 77, +127,154, 51,103,142, 88,163,209, 32, 42, 42, 10, 87,174, 92,225,211,211,211,235, 60, 97,171, 66,161,248, 10,192, 20,123,123, 59, +219,156,156,220, 60, 0,107,148, 74,229, 23, 47,234, 6, 36, 18,137, 58,196,197,197,133, 0, 64,195,134, 13,205, 61, 63, 98, 87, + 87,215, 95,124,124,124,130,191,253,246, 91,242,224,193, 3,182, 69,139, 22,224,121, 30, 6,131, 1, 70,163, 17, 70,163, 17,148, + 82,140, 30, 61,218,166,166,194,134,101, 88,207,203, 7,110,187, 72,165,210,178, 73,216, 77,255, 11, 11, 11,209,119, 76, 71, 76, + 83,182,199, 74, 69,248,115,237, 43,207,243, 3, 54,111,222, 12,142,227, 48,106,212,168,158, 10,133, 66,170, 84, 42,139,205,252, +249,148,113,227,198,125,106,109,109,141,213,171, 87, 7, 43, 20,138,142,132,144, 94,103,206,156, 1, 0,116,233,210,165,151, 66, +161,168, 7, 96, 8,128,215,236,236,236,186, 1,184,160, 80, 40, 94, 87, 42,149,181,142,224,183,111,223,126, 68,235,214,173, 63, + 89,186,116,169,245,237,219,183, 29,191,250,234,171,253, 0,154, 63,167,185, 18,139, 68,162,253,243,230,205, 27, 56,120,240, 96, +112, 28, 7,158,231,221, 46, 94,188,184,248,211, 79, 63, 13,146,203,229, 67,171, 50, 89, 10,133,194, 15,192, 87, 62, 62, 62,125, +199,140, 25,195,190,242,202, 43, 40, 40, 40,192,169, 83,167,230, 30, 56,112, 96,174, 66,161,184, 2,224,115,165, 82,121,254, 69, +229, 77,133, 66,145, 0,192, 52,198, 98,162, 82,169,108,240,175,136,220,218,218, 34,255,213, 87,161,187,127, 31,144, 72, 32, 94, +185, 18,208,233,160,155, 63, 31,144, 72,132, 48,223,255, 23,131,197, 16,226, 28,121,106,179,181,136, 99,160,211, 27,161,213, 27, +161,209, 26, 80,172, 53,160, 72,173, 71,177,198,128,130, 98, 29, 84,153, 5,248,226,203,111,106,245,164,148,157,157,189,106,226, +196,137,248,249,231,159, 39, 2, 64, 94, 94, 30,172,173,173,177,112,225, 66,164,165,165,245,216,179,103, 79,143,144,144,144, 91, + 0, 62, 62,114,228, 72,181, 23,141,107,155, 33, 61,219,180,107,246,197, 15, 95,143,181, 22,139, 8, 68,172, 21,164,146, 70,200, + 43,212, 34, 49, 45, 31,233, 89,177, 24, 51,180,137,212,219, 83,210,101,207,190,168,173, 0, 94,175, 62, 7, 99,206,181,235,119, +154, 49,198, 76, 66, 68,182,149, 31, 27,150, 67,163,214,221,185, 73, 62,173, 29,250,247,237,107, 55,108,204, 39,115, 0,236,170, + 86,245, 79, 83,128,105,211,166,193,197,229,217,193,226,211,211,211,113,254,252,185, 74,127, 99,238,181, 87,126,225,235,175,191, +182,123,250,244,233,160,173, 91,183,246,117,119,119,159,151,146,146, 82,235,155, 15, 33, 68, 10, 96, 64,143, 30, 61,150, 28, 56, +112,192,198, 52, 53,144,171,171, 43, 86,174, 92,233,245,198, 27,111,172, 4,208,183,134, 27,235,207,239,188,243,206,200,224,224, + 96, 52,109,218, 20, 79,159, 62,197,181,107,215,180,235,215,175,127,216,179,103,207,134, 35, 70,140,144,124,244,209, 71, 13, 30, + 61,122, 52,251,208,161, 67,179, 29, 28, 28, 54,101,103,103, 79, 48, 39,125, 45, 90, 52,126,119,210,196,201,173, 38, 76,152,212, + 94,167,211, 22, 70, 71,135,157,101, 9, 33,147, 62,120,223, 38, 37,245, 73, 61, 35,165,239, 2,216, 82, 11,115,213,196, 75, 46, +191,184,228,219,111, 29, 28,157,157,145,154,154,138, 39, 73, 73, 72,185,117, 11, 4, 64,239,222,189, 37,237,218,182,109,180,114, +227,198,115, 10,133,162,155, 82,169,188, 93, 99, 68,202,201, 9,201,254,254, 0,128, 39,231,206,153, 34, 43,240, 8, 9,249,243, +122, 8, 15, 7,203,178,240,244,244,172,203,244, 75,101, 1,179,206,157, 59,139, 41,165,248,244,211, 79,243, 10, 10, 10, 22, 3, +248, 89,165, 82, 37,215,213, 92, 5,118,104, 63,111,214,172, 89,196,205,213, 29,143, 30, 63,180, 91,182,108,249, 60,133, 66,129, +186,152,172,170,162, 85, 6,131, 1,121,121,121,230,230, 71,102,192,128, 1, 63,249,250,250,246,252,246,219,111,101, 98,177, 24, +209,209,209, 72, 77, 77,133,179,179, 51, 44, 45, 45, 33, 18,137,192,113, 92,173,166,202,146, 74,165, 72, 73, 73,129,174,116,112, + 69,131,193,128,130,130, 2,184,185,185,149,134,177, 24,102,218,181, 78,252,202,142, 87,205,141, 86,121, 1,240,174, 16,125, 96, + 76,230, 90,171,213, 66, 38,147,117, 15, 14, 14, 46, 42,253, 58, 43, 52, 52,180,186,188,100,239,238,238,142,144,144, 16,104,181, +218,150,235,214,173,219, 3, 0, 69, 69, 69,229,143,111, 90,151, 46, 93,216,206,157, 59,163, 97,195,134,216,180,105, 83,240,129, + 3, 7,186, 3, 56, 88,219,115,101,107,107,251,214,240,225,195,173,173,173,173,209,161, 67, 7,104,181, 90,207,238,221,187, 91, +212,165, 42, 82, 46,151,115, 0,220, 56,142, 91, 63,117,234,212, 87,187,117,235,134,187,119,239,226,228,201,147, 24, 52,104, 16, +186,119,239,142,185,115,231, 14,248,252,243,207,167, 3,168,234, 97, 96,223,254,253,251,125, 60, 61, 61,193,178,172, 41,141,120, +239,189,247,240,246,219,111,227,248,241,227, 65,139, 22, 45,218,175, 80, 40, 92,148, 74,229,139,138,220,120, 41,149, 74,211,181, +240,194, 7,200,174, 43,250,160, 32,232, 18, 19, 33,110,208,160,196, 88, 61,126, 92, 98,180, 74,151,197, 10,133,224,108,254, 63, + 24, 44, 74, 41,229, 88, 6, 91,142, 68,131, 26, 53, 40, 84,235,145,145,107, 64, 78,129, 1,133,106, 29, 10,139,245, 40, 40,214, + 97, 76,255, 22, 85,253,254, 86,133, 11,237, 84,233, 83,208,183, 30, 30, 30, 8, 14, 14, 70,143, 30, 61,200,131, 7, 15, 16, 26, + 26, 10,103,103,103,240, 60, 15, 7, 7, 7,204,155, 55, 15,105,105,105,173,167, 78,157,186, 23,229, 70,103,173,168,233,220,114, +132,149,189,147,100,215,215,179,135, 88, 71,199,159, 68, 97,177, 1, 1, 77,222, 70, 94,145, 22,185, 5, 90, 92,137,220,129,184, + 7,191, 3, 70,130, 65, 61, 71, 49,177, 45,141,131, 92,218, 14,233,157,126,243,183,211, 85,105, 2,224, 88,171,134, 68,123,110, + 40,207, 58,117, 37,172, 60,132, 16, 11,249, 51, 43, 20, 60,125,140,184,171, 59,104, 66,244, 17, 90,223,111, 52,169,120, 44,203, +107, 82, 74,211, 56,142,219,192, 48,100, 18, 33, 4,126,126,254,105,203,151, 47,175,236, 73, 77,239,231,231,159,198,178,140, 43, +165, 20, 12,195,174, 55, 24, 12,105,213,164,179,252,246,210, 8, 33, 75, 37, 18,139,153, 37, 55, 91,121,218,145, 35, 71,244, 35, + 70,140,192,178,101,203, 36,179,103,207,254,218,211,211,243,141,164,164,164,164,234,206, 81,185,130,172,173,173,173,237, 7, 77, +154, 52, 25,186,112,225, 66,139,126,253,250, 73, 41,165,200,207,207, 71,126,126, 62,138,138,138, 96,101,101, 5,142,227,220,107, + 58,239, 62, 62, 62,175,143, 29, 59, 22,206,206,206,184,126,253, 58,102,205,154,245, 56, 61, 61,125,126,122,122,122,248,207, 63, +255,220,220,215,215,119,193,166, 77,155, 90,118,238,220,153, 9, 9, 9,193,145, 35, 71,186,212,164, 89,102, 94, 8,186, 12, 26, + 60,216, 85,163, 81, 23,168,213, 69, 57,113,119, 35, 30, 63,121,114, 59,203,199,167,149,115,207, 94,157,234, 61,120,240,176, 75, + 85, 6,171,162,230,136, 17, 35, 88, 17, 33, 7,191, 93,182,204,129,225, 56,232,245,122, 52,104,208, 0,209,209,209,200,207,206, + 70, 81, 65, 1,226, 99, 98, 32,247,241,193, 71,163, 70, 57, 44, 92,183,110,191, 66,161,104,169, 84, 42,245,213,165,147,234,159, + 61,213, 44,203,130, 97,152,191,124,102, 42, 56,204,221,247, 74,120,164, 82,169, 96,101,101,133,230,205,155, 91,135,133,133, 93, +170,202, 92, 85,212,172, 44, 82, 5, 96,202,172, 89,179,200, 55, 95, 47,194,232,119, 70,226,167, 29,187, 49,238,253,247,240,225, +228,169, 83, 0,124, 81,219,116, 18, 66, 2, 99, 98, 98, 6, 1, 64,203,150, 45, 77,134,171,125,211,166, 77, 1, 32,141, 82, 26, + 86,157, 38, 41,113,158, 12,199,113,195, 23, 45, 90,196,136,197,226, 50,179, 42, 18,137,158, 49, 86,166, 73,218,205, 61,158, 70, +163, 17, 58,157, 14, 58,157, 14, 60,207, 35, 35, 35, 3,249,249,249,176,183,183,255,243,119, 12, 79, 38, 68, 42,232, 70,127,101, +181,154,193,193,193,159, 57, 59, 59,127,229,230,230,198, 86,136, 80, 99,246,236,217, 40, 40, 40,128,167,167, 39,228,114,249, 49, +134, 97, 64, 41,197,211,167, 79, 17, 28, 28,188, 48, 52, 52,244,139, 42,210,249,205,242,229,203,135, 54,107,214,204,125,236,216, +177,224, 56,110, 64,102,102, 38,126,252,241, 71, 88, 89, 89, 97,235,214,173,240,246,246,102,141, 70, 35,138,139,139,113,225,194, + 5, 92,185,114,165, 16,192,163,186,228,165,156,156,156,237, 71,143, 30,237,220,169, 83, 39,123, 0, 24, 52,104, 16,115,248,240, +225,140, 30, 61,122, 36,230,230,230,190, 94,190,186,176, 42,205,210,234,192, 89,221,187,119,159,222,187,119,111,187,204,204, 76, + 88, 88, 88,224,215, 95,127,197,150, 45, 91, 78,232,116,186,121,251,247,239,255,102,211,166, 77,253, 6, 15, 30,140,205,155, 55, + 79,149,203,229, 75, 85, 42, 21, 95,137,166,188,126,253,250,184,121,243, 38, 28, 28, 28,224,228,228,132,220,220, 92, 92,187,118, + 13, 97, 97, 97,104,222,188, 57, 8, 33,213, 86,141, 85,149,206,231,137, 84,213,102, 56,163, 23,165, 89,151,113,190,107,210, 84, + 40, 20, 62, 0,198, 0, 24, 89,250,209,110, 0, 63, 42,149,202, 71,255,228,190,191,148, 6,139, 16, 98, 58, 99,221, 41,165, 23, +202, 66,218,160,208,234,141,160, 70, 13,166,118, 45, 9, 69,127,178, 39, 0,133,106, 67,153,185, 42, 84,151,188,204,172,102,234, +253,253,143,191,227,244,239, 71,215,236,221,186, 28,201,201,201,208,104, 52,112,118,118, 70,203,150, 45,241,228,201, 19, 92,189, +122, 21,109,219,182, 5,195, 48,112,119,119, 7,128,122,213,223,180, 13,189, 95, 27,161,168,103, 52,230,224,206,195, 40,180,111, + 54, 6,217,249,106,228, 21,234,144, 91,168, 5,195,202, 81,223, 99, 36, 52,122, 75, 92,190,118, 10,157,218, 54,144, 68,221, 74, +251, 12,192,233,154, 99,250,122, 24,211,207, 80, 99,250, 89,202, 56, 4, 16, 86, 62,152,100,231,170, 17,123,101, 27, 85,197,157, +163, 40,205,232,122, 77,205, 79,223, 6,131, 97,178,139,139, 75,209,103,159,125,214,187,113,227,198,250, 73,147, 38, 69, 36, 36, + 36, 76, 42,191, 78,131, 6, 13,214,175, 95,191, 30,247,239,223,207, 88,180,104,209,233,244,244,244, 25,181,188,136,102, 19, 66, + 86, 3,128, 74,165,202, 60,124,248,112,224,165, 75,151,102,175, 90,181,202,253,195, 15, 63,148, 76,153, 50,101, 18,128, 26,123, + 95, 16, 66,252,187,119,239,126,238,167,159,126,178,118,115,115, 35,132, 16,232,116, 58,100,100,100, 32, 35, 35, 3, 57, 57, 57, + 40, 42, 42, 66, 65, 65, 1, 24,134,185,107,198,121,103,243,242,242,144,147,147,131,192,192, 64,132,133,133,121, 95,190,124,121, +231,134, 13, 27,140,111,191,253, 54,211,189,123,119,146,153,153,137,131, 7, 15,242, 41, 41, 41,140,133,133, 69,129,249, 17, 54, + 56, 88, 90, 90,136,175, 93, 61,126, 56,254,254,141,212,132, 39, 55,179, 9,161, 36, 41, 73,153,213,162, 69, 15, 71, 80, 56,152, +171, 21, 31, 31, 63,250,227,137, 19, 27,217, 57, 56,192, 96, 48,192,201,201, 9, 73, 73, 73, 40, 42, 42, 66, 97, 94, 30,138, 11, + 10,160,206,203,195,221, 51,103,208,233,213, 87,209,183, 93, 59,175, 99, 81, 81,239, 3, 88, 87,157,174,182,105, 83, 60, 57,119, + 14,132, 16,212,239,222,189,236,243,167,215,175,151,153, 45,219,222,189, 65,100, 50,136, 62,171,123,231, 24,149, 74, 21,217,160, + 65,131,227,253,250,245,123,117,252,248,241, 76, 90, 90,218, 73,185, 92,254,138, 74,165,138, 49, 55, 82,229,234,234,134, 71,143, +226,237,150, 47, 95, 62, 47, 49, 33,145,184,185,186, 99,244, 59, 35,161, 86, 23,227,205, 81, 35, 96, 97, 33, 33,246,246,118,182, +102, 70, 46,230, 0, 8, 44, 93, 12, 51, 25,153,228,228, 18,207, 39, 18,137, 58, 68, 71, 71,187,150, 68, 34, 91,152,221,254,138, +231,121,250,224,193, 3,220,190,125,187,228,216,217,218,194,202,202,170,108,146,119,147,185,170,202, 96, 85,134,169, 74,209,100, +174, 50, 50, 50,240, 32, 33, 14,251,207,254, 8,189, 81,231,116,240,163,184, 84,177, 88,124, 51,167, 32,235, 51,217,230,246,145, + 53, 84, 23,142, 93,182,108, 25, 91,122,255,122,134,164,164, 36,228,230,230,194,198,198, 6,246,246,246,101, 85,154,153,153,153, +248,232,163,143,198, 86,102, 92, 1, 64,169, 84,166, 41, 20,138,193,211,167, 79,255,227,199, 31,127,148,140, 26, 53,170,172, 42, +212,104, 52,162,160,160, 0,103,206,156,193,165, 75,151,160, 84, 42,179, 52, 26,205, 65, 0,223, 43,149,202,152,218,230,163,192, +192, 64, 71, 43, 43,171,101,147, 39, 79,182, 53, 25,195,209,163, 71, 75,223,120,227, 13, 40,149,202,150,107,214,172,217, 3,160, + 77, 77,213,129,142,142,142,135,247,237,219,215,183, 73,147, 38, 37,247, 73,189, 30,151, 47, 95,198,248,241,227,159,234,116,186, +215, 85, 42, 85,161, 92, 46,159,123,236,216,177,126,237,218,181, 67,235,214,173,221,158, 60,121, 98, 3, 32,183,138,243, 14,163, +209, 88,118,126,182,110,221,250,140,121, 5, 0,157, 78, 71,218,183,111,239, 19, 30, 30,254,232, 5, 68,170, 18,203, 45, 39,254, + 47, 11,106,133, 66, 97, 5, 96, 56,203,178, 44,183,111, 31,196,239,191, 15,221,131, 7,207, 68,174, 76,145, 44,221,224,193,102, + 53,174, 54,105, 2,120,199,201,201,169, 75, 80, 80, 16, 17,137, 68, 24, 50,100, 8,142, 29, 59,246,197,201,147, 39, 63, 87, 40, + 20,127, 0,216, 1, 96,159, 82,169, 44,252,187,246,175, 42, 15,242,210, 68,176, 40,165,164,116, 39,203,234, 39, 40, 79,169, 70, +103, 64,161,250,207, 39,240, 66,181, 30, 5, 69,122, 20,168,245, 40, 82,235, 64, 41, 80,164, 49,111,122, 31, 75, 75, 75,232, 96, +137,142,189,134, 99,208,144,215,112,236,252, 57, 36,220,190,136,144,129,253,193,243, 60,156,157,157, 49,102,204, 24,236,219,183, + 15,118,118,118,176,180,180,172, 57,148,237,100, 8,105,238, 43,231,120,163, 8,221,253,166,195, 72,109,145,157,175, 65,110,161, + 22, 15, 31, 95, 67,118,110, 54,138,138,117, 40, 42,206,128, 78,235,131, 22,246,109,192, 48, 39,124,107,233,255,193,103,135, 83, + 62, 59,156,158, 57, 21,247,151,111,117, 26,243,170, 55, 88,150, 93,121,226,196,137,206,175,188,242, 10,215,187,119,239, 0, 15, + 15, 15, 69,114,114,178, 18, 0, 60, 60, 60, 20,253,251,247, 15,112,118,118,198,234,213,171,213, 44,203,174,172,227,211, 79,249, +246, 90, 87,229,114,249,188, 3, 7, 14,108,155, 48, 97, 2,220,220,220,252,204,209,176,179,179,155,180, 99,199, 14,107,119,119, +119, 98, 48, 24,160, 86,171,145,150,150,134,236,236,108,100,103,103, 35, 49, 49, 17, 89, 89, 89, 72, 73, 73, 41,124,252,248,241, + 47,230,166,237,243,207, 63,135,193, 96,208,191,255,254,251,162, 30, 61,122, 96,231,206,157,108,124,124, 60, 54,109,218,100,220, +187,119,239, 99,134, 97,184,225,195,135, 55,168,229,165,153,145,148,244, 40,165, 32, 63,189,120,112,223,192,185, 25,143, 83,225, +236, 61, 24, 7, 78, 30,249, 58, 33, 49,142, 39, 12, 49,187,103,170, 37,199,245, 15,232,216, 81,148,154,154,138, 70,141, 26, 33, + 57, 57, 25,247,238,221,131, 86,171, 69, 97,110, 46,244,121,121, 48,102,103,131,230,229,225,241,197,139,104,209,168,145,228,247, +168,168,126, 53, 25, 44,158,231, 65, 8,169, 50,106,197, 48, 12,136,149, 21, 96,101, 5,202,212,110,228, 20,185, 92, 62,216,214, +214,118, 86, 94, 94,222,113,149, 74,245,181, 94,175,255,112,241,226,197,237,191,250,234, 43,167,153, 51,103,218,206,154, 53,107, +175, 92, 46,247, 83,169, 84,213, 85,237,252, 37, 82, 53,242,173, 55,201,204, 79,103, 35,238,126, 44,126,218,177, 27,111,142, 26, +129, 61,187,246, 34,184, 79, 15,148, 70,184,204, 42,171, 31, 61,122, 52,168, 52,138,217, 8,128, 67,155, 54,101,229,114, 32,165, + 20, 6,131, 1,169,169,169,230,230,109, 74, 8,225, 9, 33,180, 73,147, 38,200,206,206, 6,203,178,176,178,178,130,181,181, 53, +154, 55,111,142, 39, 79,158, 60, 99,176,204,173,110, 53,181,187, 50, 21,222,167,175, 28, 69,102, 97, 10,182, 44,219, 13, 15,183, +250, 12, 0,231,228,212, 39,189,223,157, 62,162,195,161,143, 30, 46,193,242, 78,139,171,169, 46,220, 54,107,214,172,111, 42, 54, + 1,240,244,244,196,132, 9, 19,112,244,232, 81,220,191,127,255,153,241,114,158, 62,125,202, 3,168,182, 19,142, 82,169,140, 80, + 40, 20,111,189,246,218,107, 63,248,248,248,184, 82, 74,209,182,109, 91,188,245,214, 91, 88,190,124, 57, 46, 92,184,240, 11,128, +205, 0, 46, 1, 96,149, 74,165,182, 14, 5,121, 61,169, 84,122,125,237,218,181,222, 13, 27, 54,100, 84, 42, 21,174, 94,189,138, +160,160, 32, 0, 64,227,198,141,161,215,235, 61,107, 50, 87,118,118,118,135, 14, 30, 60,216,183, 97,195,134,184,123,247, 46, 46, + 93,186, 4,103,103,103, 72,165, 82,132,132,132,212,251,229,151, 95, 62,148,203,229, 43, 69, 34,209,194,254,253,251,195,104, 52, + 34, 34, 34, 34, 5, 64,126,117,231,168, 42,212,106, 53, 40,165, 16,139,197,171, 9, 33,175, 43, 20,138, 62, 74,165,242,185, 26, + 69,255, 91,218, 92,181,106,213,106,186, 84, 42,253, 50, 40, 40, 72,118,245,234, 85,208,226, 26,155,237,177,133,133,133, 31, 1, +248,182,170, 21,130,131,131,103,136, 68,162,249, 65, 65, 65, 50,119,119,119, 20, 22, 22, 34, 43, 43, 11,153,153,153,152, 53,107, + 22,166, 77,155,134,169, 83,167,146, 43, 87,174,116, 57,122,244,104,151,203,151, 47,175, 81, 40, 20,179,149, 74,229, 15,127,215, +126, 86,230, 65, 94, 26,131, 85,186, 99,221,159,181, 21,128, 90,107, 64, 90,142,161, 52,114,165,135,234,169, 14,170,251,127, 64, +172, 77, 68,161,154,131,196,163, 59,138, 53,230, 87,121,171,178,212,184,122, 59, 5, 46,246, 28, 2,218,116, 68,239,158,254,184, +124,237, 14,238,222, 61,132,161, 67,135,194,194,194, 2, 57, 57, 57,200,207,207,135, 76, 38,171, 57, 50,164,231, 90,186,215,243, +129,157,117, 11,164,102, 21, 34,183, 64,131,188, 34, 45,242, 10,180,136,141, 61,130,236,204, 88,232,181, 90, 24,180, 6, 48, 18, +111,100,105, 7,195,218,198, 86,210,168, 81,127,201,131, 7, 39,180, 47,226, 32,234, 53,121,102,197,108, 83, 82, 82, 82,229,114, +249,254,168,168,168, 55, 94,127,253,117,156, 59,119,110, 42, 74,122,195,192,194,194, 98,234,235,175,191,142,168,168, 40,196,196, +196,236, 79, 73, 73, 73,125, 17,105,227,121,190, 80, 95, 90, 69,101,105,105, 41, 54,211, 8,246,115,113,113, 33, 58,157, 14, 79, +159, 62, 69,102,102, 38,158, 62,125,138,226,226, 98, 20, 20, 20,192, 96, 48, 64,175,215,227,250,245,235,169, 70,163,241,106,109, +210, 19, 27, 27,235, 57,109,218,180,137, 61,123,246, 92, 16, 18, 18,130,195,135, 15, 99,215,174, 93,239, 2,248, 37, 40, 40,232, + 78,109,247,207,192,211,171, 27,214,253,224, 56,238,253, 55, 60, 46, 69,132,175,254,117,127,254,123, 65,129,155,150,121, 53,104, +231,178,101,235, 57, 43, 35, 79,207,152,111,163,209,174,158,171, 43, 30, 63,126,140,240,240,112,168,213,106,104, 52, 26,104, 52, + 26,232,178,179,161,207,202, 2, 41, 44,132,133,193, 0,245,147, 39,104,216,186, 53, 64, 72, 43, 51,110, 28,213, 86, 11, 50, 12, + 3, 88, 89,149,152,172, 90,152, 2,185, 92,174,240,243,243,251,117,227,198,141,226,233,211,167,119,144,203,229, 63,168, 84,170, + 4,185, 92,222,107,217,178,101, 97, 95,127,253,181,197,168, 81,163,154,109,216,176, 97, 12,128,141, 85,233,216,219,219,217, 86, +140, 84,217,218,216,226,149, 87, 94,193,137, 99, 39,240,238,123, 99, 96, 97, 33,193,160,161, 3,176,115,199, 46,148, 86, 31,154, +251,100,138,140,140, 12, 0,112,136,140,140,116, 21,139,197, 40,141,136,186,250,249,249,165,181,105,211,230,112,105,148, 43, 80, + 46,151, 31, 50,163, 39, 33, 53,233, 58, 57, 57,149, 85, 9,154,170, 11, 93, 93, 93,145,155,155, 91,167, 8, 86,110,110, 46,114, +115,115,113,255,241, 93,100, 22,166,224,244,238,171, 48, 26,141,101,209, 17,185,171, 39,206,236, 9,179,233, 49, 34, 96,206,143, + 19,174,159, 93,121, 11,149,134,177, 66, 67, 67, 23, 5, 7, 7, 31, 74, 75, 75, 43, 63, 53,199, 43, 58,157,110,161, 94,175, 71, + 66, 66, 2,238,220,185,243, 13,128,242,121,243, 73,104,104,104,141, 81, 23,165, 82,121, 64,161, 80, 28,141,138,138,242, 1,240, +150,163,163,227, 60,131,193, 0,158,231, 1,224, 55, 0, 81, 0, 78, 57, 59, 59,119, 81, 40, 20,191, 42,149,202, 81, 53,156, 31, + 18, 24, 24,248,186, 84, 42, 29, 87, 88, 88,184, 75, 42,149,206, 91,183,110,157,183,175,175, 47,147,152,152, 8,189, 94,143,196, +196, 68, 62, 60, 60,188, 48, 32, 32,192,230,244,233,211,249, 12,195,108,171, 38, 79,138,172,173,173,127, 59,112,224, 64,191,134, + 13, 27,226,194,133, 11, 88,188,120, 49,154, 52,105,130,109,219,182, 33, 40, 40, 8, 13, 27, 54,132,163,163,227, 71,121,121,121, +157,150, 44, 89,242,170,191,191, 63, 14, 30, 60,136,244,244,244, 53,213, 13,217, 96, 48, 84, 93,206, 20, 23, 23,131, 82,138, 94, +189,122,141,255,228,147, 79, 48,104,208,160, 83, 1, 1, 1,129, 17, 17, 17,247,204, 56,253,255,154, 72, 85, 21,251,253,149,147, +147,147,244,225,195,135,160,148, 66, 55,106, 20,116, 67,134,252, 37,114,197, 53,104,128, 75,245,234,193, 93,161, 64,198,211,167, +223, 40, 20,138, 85, 74,165, 82, 87, 69,176, 99,209,132, 9, 19,184,132,132, 4,220,189,123, 23, 89, 89, 89,127, 49,176, 28,199, +161, 75,151, 46,240,242,242, 66,247,238,221,101, 11, 22, 44, 88, 9,224,111, 51, 88,149,121,144,151, 59,130, 69, 65,139,212,122, +228, 22,232, 81, 80,172, 71, 78,110, 46,116,143,246, 97,233,167,239,161,121,171, 22,136,139,127,132, 69,223,172, 65,102,154,163, +217, 27, 76,206, 84,195,152,242, 43,210,115, 60,240,196,186, 13, 94,111,176, 29,106,191,207,241,211,186,227,101,166, 42, 63, 63, + 31, 5, 5, 5,176,182,182,174, 81, 79, 93,108,113,235, 73, 74,145,127,113,113, 52,142,158,223, 4,222,104, 1,119,249, 80,232, +121, 7, 88,217,117, 71, 70,114, 44, 12,106, 61, 0, 10, 74,164,224, 41, 69, 81, 97,129, 49,169, 38,115, 69,205, 55,141,122, 77, +126,109,110,228,219,126,250,233,167, 33, 43, 87,174,148, 12, 28, 56,176,185, 92, 46,239, 10, 0, 35, 70,140,104,110,107,107,139, +159,126,250, 73,107, 52, 26,183,189,160, 12,203,184,187,187,191,219,185,115,103,164,165,165,225,209,163, 71,102,153, 33,134, 97, + 78,220,184,113,227,189,250,245,235,147,196,196, 68, 36, 37, 37, 33, 43, 43, 11,118,118,118,112,116,116,132,155,155, 27,120,158, + 71,113,113,177,235,173, 91,183, 20, 0, 78,152,155,166,148,148,148, 44, 0,203,139,139,139, 23,112, 28, 7,181, 90, 13,177, 88, +188, 95,167,211,213,105, 44,156, 59,119,238,111, 23,177,164,157,133,165, 70,218,171,123, 91, 75, 7,123,123,198,197,153,183,187, +112,225,166, 77,106,106, 78,218,237,219,247,205, 63,150,148,146,226,236,108,168,110,222, 68, 94,118, 54,138,243,243,161, 46, 40, +128, 33, 39, 7,238, 77,154, 0,133,133, 96,212,106,112,106, 53, 68, 60, 15,169,149, 21, 64,105,141,110,200,226,234, 85,184, 15, + 44, 25,190, 37, 43, 44,172,204, 84,217,244,237, 11,200,100, 32, 50, 25,244, 7, 14,128,101, 89, 80, 7, 7,160, 92,213, 71, 53, + 5,153,147,155,155,219,225, 53,107,214,136,179,178,178,112,251,246,237, 27, 42,149, 42, 87, 46,151,219, 0,224,239,221,187, 23, + 26, 27, 27, 59,208,215,215, 23, 0, 26, 85,167,149,147,147,155,247,232,113,188, 93,249, 72, 85,143, 94, 93,113,249,242,101, 72, +165, 82,132,134,158,129,157,157, 45, 60, 60, 60,241,240, 65, 60, 0,164,181,111,223,158, 18, 66,248,176,176, 48,182, 38,115,105, +106, 56,110, 52, 26, 17, 29, 29, 13,134, 97,254, 98, 54,111,222,188,233, 10, 96, 80,219,182,109,107,140, 98, 13, 30, 60, 24,148, + 82,132,135,135,227,210,165, 75,184,116,233, 18, 30, 63,126, 92, 62, 2,139,211,167, 79,163, 71,143, 30,102,159,250,162,162, 34, +184,187,187,195,222,222, 30, 7,206,237,196,150,101,187, 97, 52, 26,145,159,255,231,181,157,153,153, 9,153, 76,134,175,167,175, +178,126,111,246,107, 11, 1,244,169, 74, 47, 52, 52,244, 46,128,187,165,209, 2, 2, 96, 89,112,112, 48,244,122, 61, 58,119,238, +140, 27, 55,110, 12, 4, 48, 63, 52, 52,180,214, 67,113, 40,149, 74,157, 66,161,112,117,118,118,158, 57,102,204, 24, 24, 12, 6, +244,237,219, 23,113,113,113, 63,103,102,102, 38,189,247,222,123,222,221,186,117,195, 23, 95,124,241,150, 66,161,248,162,186,118, + 52,175,188,242,202,103, 35, 70,140,152, 59,100,200, 16,203, 75,151, 46,117, 42, 46, 46,102, 61, 61, 61,153, 7, 15, 30,192,104, + 52,226,242,229,203,134, 83,167, 78, 37,233,116,186, 37,183,110,221, 10, 42, 42, 42, 58,168, 84, 42,143, 84,147,188,233, 59,119, +238,236,223,180,105, 83,156, 60,121, 18, 19, 39, 78, 60,106,107,107,219, 58, 36, 36,196,203,202,202, 10, 55,110,220,128, 94,175, +135,187,187,187,235,236,217,179, 7,246,237,219, 23,103,206,156,193, 87, 95,125,117, 20,192,138,154, 76, 48, 87,218, 54,178,226, +131, 74, 84, 84, 20,122,246,236,137, 89,179,102,129, 16,130,208,208, 80,219, 62,125,250,220,234,222,189,187,109, 77, 13,243,171, +138, 84,253, 91,122, 17,202,100, 50,246,240,225,195,248,245,215, 95,177, 99,199, 14,108,220,184, 17, 67,135, 14,133,233,105, 89, +171,213,226,200,145, 35,184,171, 80,192,162,117,107,180,175, 95, 31,199,143, 31,103, 81,205, 92,195, 41, 41, 41,220,176, 97,195, +112,245,234, 85,120,120,120,224,222,189,123,136,142,142, 46, 51,177, 60,207, 35, 54, 54, 22,247,239,223,199,253,251,247,193,243, + 60, 40,165,162,191,115, 63, 95,234, 8, 86,229,143,138,148, 22,169,245,200, 43, 40, 70,198,163,171,240,181,203,196,234, 95,182, + 34,238,201, 31,184, 28,253, 59,180,122, 41,222,154, 56, 26,187, 55,254, 2,106,100,107, 60, 40, 60,207,163, 30,137, 70,223,183, +250,227,196,185, 43, 8,139,183,196, 23,197, 99,225,228,196, 66,171,213,150,153,170,188,188, 60,228,231,231,155,101,176,120,189, +230,236,245,168,172, 81,131,123,251,138,210,211, 30, 66,171,209,128, 21, 7,130,114,150,208,179,141, 33,171, 63, 23,185,247,231, + 2,212, 8, 43,231,158,200,200,202,131,193,200,215,248,148, 66, 13,102, 55, 3, 50,171, 13,150,137,180,180,180,108,119,119,247, +159,175, 92,185, 50,118,232,208,161, 56,125,250,244,135, 0, 48,116,232, 80, 92,185,114, 5, 15, 31, 62,252, 57, 45, 45, 45,187, +150, 70,202, 25, 37,131,170,149, 69,189, 92, 93, 93,125,189,188,188, 62, 26, 63,126,124,167, 54,109,218, 96,231,206,157,128, 57, +237,206, 74, 10,146,245,211,167, 79,239, 55,109,218, 52,119, 66, 8,137,139,139, 3, 33, 4, 46, 46, 46,168, 95,191, 62, 28, 29, + 29,145,147,147, 3,133, 66, 97,221,160, 65,131, 33,230, 26,172,210, 39,164,250,168,208,198,130, 82, 42, 1, 96, 79, 41,229,234, +112, 81, 26, 91,182,108,180,246,206,157,172,159, 29, 29,210, 53, 28,167,203,248,237,200,237,150,209,183,115, 29,140, 70,238,205, + 90, 13,209, 64,200,141,135,113,113,190,148,231, 81,144,157, 13,109,126, 62, 12,217,217, 48,100,101,129,184,187,131, 83,171,193, +106, 52, 96,181,106, 88, 90,202,144,155,158, 14, 66, 72,141, 13, 61,203, 55,114,175, 44,106, 69,172,172,254,172, 42, 36,196,172, + 70,172, 18,137,228,231,141, 27, 55,186,187,187,187, 99,198,140, 25,112,119,119,111,222,171, 87,175,162, 14, 29, 58, 72,157,156, +156,208,180,105, 83, 4, 4, 4,224,236,217,179, 0,240,160, 6,185, 53,203,150, 45,155,247,214,168,145,196,206,214, 14, 61,130, +187,226,183, 3,135, 33,149, 74,209,174, 93, 59,120, 63, 13,195,199, 86,103,113,197,122, 0,194,197, 98,140, 29, 59,118,237, 91, +111,189,133,206,157, 59, 51,102,156, 31,147,193,146,181,111,223,190,124,245,181, 76,169, 84,186, 82, 74, 7, 5, 4, 4,192,104, + 52, 62, 99,146,204,185,151,112, 28, 87,118,204, 42,137,194,254,197,196, 85,153, 47,121, 99, 82,191,119, 58,253,121, 61, 27,116, + 78, 30,110,245, 25, 83,228, 10, 40,233,229,108,138,232,212,171, 87, 15, 58,173,174,109, 45,178,233,187,141, 27, 55, 86,116,236, +216, 17, 9, 9, 9,104,215,174, 29,154, 52,105,210,250,222,189,123, 19, 80, 67,245,114, 21, 5,127, 83, 59, 59,187, 35,223,124, +243,141,216,214,214, 22, 81, 81, 81,104,209,162, 5,150, 47, 95,206,197,197,197,121, 55,107,214, 12,119,239,222, 69,114,114,242, +195,234,204, 85,105,228,252,131, 15, 62,248,192,242,201,147, 39, 24, 62,124,184,101,124,124, 60,110,223,190, 13, 74, 41, 34, 35, + 35, 13, 7, 15, 30, 76, 42, 44, 44, 12,140,138,138,202, 4,176,169, 6,211,207,248,250,250,126,212,184,113, 99,156, 57,115, 6, +147, 39, 79, 62, 97, 48, 24,134,103,101,101, 77,208,106,181,223, 15, 28, 56, 16, 65, 65, 65,136,141,141,197,160, 65,131,202,242, +231,140, 25, 51,142,233,245,250,225, 53,140,131,117,239,252,249,243,173, 3, 2, 2, 80, 88, 88,136,252,252,124,136, 68, 34,216, +219,219,227,206,157, 59,104,210,164, 9,102,205,154,133,149, 43, 87, 98,218,180,105,124,159, 62,125, 12, 58,157, 78, 44,121,190, + 97, 11,254, 53,189, 8, 9, 33,104,214,172, 25, 22, 47, 94,140,180,212, 84,172,157, 62, 29,214, 51,102, 64,103, 52, 34,113,212, + 40,200, 90,183,134, 77,135, 14,144, 72, 36,102, 71,192, 9, 33,176,176,176, 64,163, 70,141,224,237,237,141, 86,173, 90, 33, 58, + 58, 26, 51,103,206,132,143,143, 15, 30, 63,126, 12,163,209, 8,177, 88, 12, 91, 91, 91, 8,212,209, 96,209,210,167,112, 90,225, +105,156, 26, 13,204,207, 91,150,192,141,215, 96,242,228, 65,104,219,174, 25, 34,239, 29, 70,145, 58, 15, 4, 34, 24,140, 58, 20, +106, 11, 49,252,221, 81, 88,178,100, 95,205,103,149, 0, 29, 90,186, 65,103,204, 66,243, 70,114,156, 60,158,136,172, 2,111, 52, +211,104,161,211,233, 80, 80, 80,128,252,252,124, 60,120,240, 0, 77,155, 54,133,149,149,149, 25, 37,172,241,204,217,179, 23,178, + 7,245,238,232,226,229,166,192,237, 59,103,161, 49,216,163,168,184,164, 29, 86,126,177, 24, 70, 86, 14,142,102,162,161,175, 31, +162,148,215,243, 41,111,220, 90,227, 61, 87,147, 69, 25,207,183, 8,159,114,144,194,168,174, 34,212,195, 66, 36,177, 70, 81, 97, + 30,143, 90,140, 89,100,105,105,185,115,247,238,221, 35, 58,117,234,100,213,163, 71,143,198,165, 55, 58,253,238,221,187, 11, 45, + 45, 45,119,214,242,194, 91, 64, 8,230,129,130,145, 72, 36,191,215,171, 87,239,148,181,181,117, 96,223,190,125, 27,247,237,219, + 23,141, 26, 53,194,254,253,251,113,224,192,129,211, 41, 41, 41,127,152,105, 90,162, 8, 33,131, 30, 61,122, 52,198,221,221,189, +127,219,182,109,221,125,125,125, 45,237,236,236,192,113, 28, 10, 11, 11,145,153,153, 9,173, 86, 11,163,209,216,200,220,180,122, +123,123,195,221,221,125, 14,128,249,165, 85, 61, 4, 0, 68, 34,145, 78,175,215,191,225,225,225, 97, 85,151, 76,156,147, 83,188, +105,241,226,105,109,123,245,234,133,188,188, 60, 28, 59,118,204, 59, 37,109, 7, 30, 63,126,252, 35,128, 32,179,141, 50,165, 39, + 34, 34, 34, 6,116, 9, 10,178,120,164, 84,194,144,147, 3, 99,118, 54, 56,157, 14, 92, 97, 33, 88,141, 6,164,184, 24, 94,126, + 50,128,119, 69,216,195, 36,131,142,231,127, 55,215, 96, 81,134, 41, 43,248, 89,150, 5,177,182, 46, 49, 88, 50,217, 51, 6,171, +166, 27,164, 92, 46,151,245,233,211,167,151,191,191, 63, 40,165, 88,182,108, 25,180, 90,173, 68,175,215, 67,175,215, 67,167,211, + 33, 63, 63, 31, 7, 14, 28,192,142, 29, 59,174, 0,216, 94,195, 19,252, 23, 10,133, 2, 55,111, 68,127, 62,112,224, 0, 28, 61, +122, 12, 82,169, 20, 86, 86, 86,104,216,176, 33, 34,243,242,240,161, 72,129, 22,238, 45,208,167, 79, 6,218,182,109,139, 59,119, +204,171,205,229,121, 30, 58,157, 14,177,177,177,214, 98,177,216,218, 84,213,211,164, 73,147, 52,131,193, 96,125,239,222, 61, 0, + 72,243,247,247, 15, 43,205,123, 97,230,234,246,234,213, 11,125,250,244, 41,171, 14,116,113,113,129, 86,171,133,193, 96, 48,219, + 92, 1,192,163,171, 89, 1,211,148,237, 1, 99,201,143, 14,126, 20,151, 10,160,172,122, 47, 55, 55, 23, 79,158, 60, 65, 66, 66, + 66,169, 1,211,131, 82,243,158,178,131,131,131, 25, 0, 95,142, 30, 61, 26, 41, 41, 41, 88,176, 96, 1,230,206,157,139,225,195, +135, 99,209,162, 69,243,131,131,131, 55,135,134,134,234,107,153,229,223,157, 50,101,138,181,139,139, 11,182,110,221,138,195,135, + 15,167,181,109,219,214,245,189,247,222, 67,211,166, 77, 17, 19, 19,131,213,171, 87,103,234,116,186, 33,102, 84, 63, 61, 12, 11, + 11,115,211,233,116, 72, 78, 78, 46,139, 92, 36, 39, 39,243, 23, 46, 92, 72, 42, 42, 42, 50,153, 43,115,176, 9, 8, 8,112,141, +139,139,195,238,221,187,161,211,233,230,169, 84, 42,157, 92, 46,223,245,195, 15, 63,204,247,245,245,117,236,218,181, 43,130,130, +130, 64, 41,197,145, 35, 71, 48,127,254,252, 99, 58,157,110,152, 74,165,170,169,167,212,208,133, 11, 23, 46,172, 87,175,222,235, +163, 70,141, 98, 20, 10, 5, 34, 34, 34, 96, 52, 26,209,171, 87,175, 50,115,117,242,228,201,159, 79,158, 60,249, 26, 0,177,181, +181,181,165, 57,195, 74, 16, 66, 66, 0,152,218,163, 20, 81, 74,143,252,155, 11,109, 87, 55, 55,188,245,249,231,200,207,207,199, +143, 63,254, 8,107, 63,191,178, 42,242,210, 26,136,218, 27, 1,142,131,151,151, 23, 60, 61, 61,177,121,243,102,220,184,113, 3, + 98,177, 24, 38,131,250, 28, 67,199,152, 29,189,170,204,131,188,212, 17, 44,194,176,116,241,162, 5, 72, 74,143, 69, 86,110, 50, +174,220,220, 95, 46, 83, 82, 48,132,130, 33, 0, 43, 22,129,144,154, 79,170,209, 96,132,133, 37, 69, 81,174, 22,205,154, 52,132, +207,217,195,136, 76,171, 7,134, 33, 16,151,246, 74,147,201,100, 72, 73, 73,193,241,227,199,141, 45, 90,180, 96,107,210, 76,191, +125, 56,221,181,221,107,243, 86,111,222,183,106,252,219,159, 88,169, 53, 50, 36, 38, 41, 97,176, 12, 68,110,129, 22, 26,157, 1, + 86,245, 94, 67, 11,111,123,164,167,103,210, 39, 15, 99, 99,210,110,252,186,185, 6,217,213, 35,134,245,156,249,249,140,241,110, + 45,154,205,182,164,233,199, 65,115, 35, 41, 76,193, 16,194, 64, 98,229, 4,202, 74,168,242,238,211,252,115, 55,139, 51, 1,172, + 54,247,160,199,199,199, 23,202,229,242,109, 83,167, 78,253, 54, 60, 60,204,181,180,144, 75, 75, 78, 78,158,165, 82,169,204,238, +169, 65, 8,113, 32, 4,115,121,158,178, 0, 32,149, 90,246,251,228,147, 79, 60,130,130,130,116, 98,177, 24,137,137,137, 88,186, +116, 41, 46, 95,190,252, 83, 74, 74,202,247,180, 22,253,123, 41,165,145, 0, 34, 9, 33,159, 71, 71, 71,247,233,217,179,231,178, + 38, 77,154,212, 55, 24, 12,200,205,205, 69,118,118, 54,238,221,187,135,226,226,226,184,154,180, 18, 19, 19,127, 79, 74, 74,234, + 59, 97,194, 4, 4, 5, 5,141,219,177, 99,199,232,242, 23, 82,227,198,141,163, 67, 66, 66,234,219,217,217,137,139,139,139,245, +247,238,221, 59, 87,155, 76,172, 82,169, 94, 25, 61,122, 52,125,240,224, 1,114,114,114,176,109,219, 54,211,231, 65,181,209,105, +208,160,193,206, 35,161,161, 51,218, 53,107,214,204,219,199, 7,113,167, 79, 67,172,213, 66,100, 48,128, 45, 42,130, 72,167,129, +183,194, 10, 98,169, 19, 82, 30, 23, 99,119, 76,204, 99, 74,233,166, 26,171,159,186,118, 69,174, 82, 9,150,101, 97,243,234,171, + 32, 50, 25,168, 76, 6,195,222,189,101,198,138, 91,184,176,196,108,245,236,105,206,254, 22, 53,110,220, 56,226,238,221,187,237, +155, 53,107,134, 47,191,252, 18, 79,158, 60, 1,207,243,200,204,204, 84,167,167,167, 39, 63,125,250,244, 49, 74,198, 63,218,108, +206, 84, 36,165, 38,235,243,192,192, 14,184,125, 59, 6,114,185, 28, 62, 62, 62,240,240,240, 64, 92, 92, 28,108,108,108, 32, 22, +139, 17, 26, 26,138, 39, 79,158,160,113,227,198,230,230, 35,232,116, 58, 60,124,248,176,108, 95, 75, 11, 0, 89,135, 14, 29, 76, + 17,173,108, 0, 97, 42,149,106,113, 45,242, 39, 88,150,253, 75,143,193,218,154, 43, 19, 43, 21,225,152, 16,169,224,165, 6,142, +112, 28, 23,149,156,250,164,175,220,213, 19,233,233,233, 72, 76, 76, 68, 98, 98, 98,217,126, 63, 74,120, 8,137, 68,124,195, 76, +233,238,222,222,222, 30,158,158,158,216,180,105, 19,212,106,245,131,223,126,251,173,209,219,111,191,141, 6, 13, 26, 56, 63,126, +252,184, 15,128, 99,181,141,172,200,100, 50, 20, 23, 23,227,200,145, 35, 79, 1,120,223,188,121,243,205,153, 51,103,174,242,244, +244,180, 77, 72, 72, 72,213,233,116, 61,149, 74,101,108, 77, 66,121,121,121,163,103,206,156,185,159,231,249,134,173, 90,181,226, + 6, 13, 26,100,229,233,233,137,240,240,240, 66,141, 70,243,117, 45,204, 21, 0,228, 95,186,116, 41,173,101,203,150,174,114,185, + 28, 34,145,104,137, 92, 46,255,154, 97,152,229, 33, 33, 33,142,191,254,250, 43,246,237,219, 7, 43, 43, 43,196,199,199,171,238, +222,189,187, 26,192,119,230,140,224,174, 84, 42,227, 1,140, 84, 40, 20, 11, 86,175, 94, 61,143, 16, 50,250,212,169, 83,101, 99, +157,153,204,149,143,143,207,152,189,123,247,142,170,109, 45,156,105,200, 1, 66, 72,235,242,183,174,127, 73,219, 44,189,193, 96, +144,120,120,120, 32, 53, 53,181,172,138,212,198,198,230, 25,227,195,113, 28,108,108,108, 76, 61, 98,141,168,102,134, 3, 0, 6, +189, 94,207,121,122,122, 34, 45, 45,173, 76,147, 97, 24,232,116,186, 50, 99,197,113, 28,108,109,109, 77,215,212, 75, 59,229,212, +255,172,138,240,145,234, 38, 24,194,192, 74,234, 0, 75,137, 53, 12, 70, 61, 12, 70, 29,212, 90, 30, 5,106, 64,162, 6,178,138, +180, 85, 25,128,214,229,199,202,200,203,203,187,188,106,253,190, 87,134, 12,106, 15,137,184, 0,111,190,218, 26,141,110,158, 66, + 70, 14,240,123,244, 77, 88, 88, 88, 32, 36, 36,196, 52, 34,115,211,232,232,232,143, 42,102,236,138,154, 0,144,118, 99,223, 22, + 55,191,145, 61,151,229,230,190,250,218,176, 17,214,245,189,115,145,152, 73,144, 95,172,131,149,165, 8, 82,139,250,136,185, 29, +173,141,189,117, 86,165,215,232,134,215,148,206,152,120,186,169, 85, 3,114,118,212,164,121,159,250,183,242,237, 63,125,194, 96, +167,166,245, 7, 91,208,156,235,212,194, 38, 31, 98, 43,103,196, 62,202, 44, 58,118, 85,245, 52, 51,207,120,138, 24,176, 60, 38, +129,198,215,148,206,242, 60,125,250,244, 66,106,106,138, 75,185, 81,219, 93, 68, 34,241,133, 26, 12,213, 95, 52, 73,133,250,106, +173, 86,139, 83,167, 78,225,226,197,139,186,251,247,239,159,229,121,254,183,212,212,212,168,218,104, 86, 40,200,242, 0,236,181, +182,182,230, 53, 26,205, 87,253,251,247,111, 70, 8,193,131, 7, 15,112,246,236,217, 51, 25, 25, 25, 95,215,164,153,159,159,255, +254, 71, 31,125,180, 41, 56, 56,184,223,155,111,190,137,101,203,150, 73,238,221,187, 7, 74, 41,218,183,111,143,160,160,160,134, + 58,157,142,191,122,245,234,211, 99,199,142,237,210,104, 52, 75,107,147, 78,185, 92,126,117,254,252,249, 24, 54,108, 24, 50, 50, + 50,224,229,229,133, 29, 59,118, 64, 46,151, 95, 85,169, 84,157,204,221,247,189,123,247, 26, 3, 2, 2,134,124,183,109,219,149, + 41,195,135, 59,118, 12, 9, 65,242,213,171,208,170, 84,144, 24,141,144, 72, 44,161, 47,114, 65,150, 74,141, 45,183,111,231,106, +244,250, 97,229,199,192,170, 42,157, 60,207,255, 57,206,149, 76, 6, 88, 91,131, 41, 87, 45,104,138,102,177, 54, 54,128, 72,244, +151,167,197,202, 52,139,138,138,134,143, 31, 63,254,230,241,227,199, 29, 70,142, 28,137, 65,131, 6, 69,170,213,234, 30, 42,149, +202,172, 6,129, 85, 29,207,208,208, 80,140, 30, 61, 26, 58,157, 14, 6,131, 1, 69, 69, 69, 8, 12, 44, 25,105,225,201,147, 39, +208,233,116,136,142,142,254, 32, 38, 38,102, 45,199,113,124, 77,154, 38,131,101, 50, 86,166,125,190,123,247,174,181, 88, 44,182, + 38,132, 64,175,215,187, 54,109,218, 52,176, 54,233,164,148, 62, 99,174, 56,142, 67, 81, 81,145, 89,230,170, 42,205,141,254, 74, + 76,187,214,137,230, 21,229,204,123,119,250,136, 78,161,187,175,219, 88, 89, 89,149, 21, 62,141, 26, 53, 2,199,113,216,114,224, +251,194,167, 57,153,243,204,204,159,163, 58,116,232,128,162,162, 34, 68, 70, 70, 26, 1, 12,189,117,235, 86, 84, 65, 65,129,168, +109,219,182,120,252,248,241, 91, 85, 25,172,106, 52, 31, 36, 39, 39,195,199,199, 7,246,246,246,118,217,217,217, 6,165, 82,185, + 93,161, 80,236,189,127,255,126, 67, 0,143,149, 74,101,190, 57,154, 81, 81, 81,137, 0, 2,186,119,239,206,221,186,117, 43,189, + 75,151, 46,144, 72, 36,104,220,184,177,205,131, 7, 15,222, 70, 13, 61, 27,203,107,170, 84, 42, 94, 46,151,127, 23, 22, 22,182, +216,207,207, 15,111,189,245, 86,239,176,176,176,222,254,254,254,240,245,245, 69,118,118, 54,206,159, 63,255, 19,207,243, 19, 1, +168, 85, 42, 21,173,237, 57, 82, 42,149,247, 1,188,173, 80, 40, 94, 47, 45,252, 89,149, 74,197,158, 58,117, 10, 0,198,239,221, +187,215, 88,215,123, 93, 37,219,106, 80,215,188,244,156,213,129, 21, 53, 23,142, 28, 57,114,209,236,217,179,217, 54,109,218, 32, + 43, 43, 11,233,233,233, 48, 24, 12,160,148, 66, 34,145,192,219,219, 27,150,150,150,120,252,248, 49,162,162,162,140, 90,173,118, + 97,249, 6,238,149,104,206,123,235,173,183,190,153, 57,115,230, 95, 52, 75,107, 84,208,160, 65, 3, 88, 90, 90, 34, 62, 62, 30, + 81, 81, 81, 70, 0,243,254,238,125,255, 79, 25, 44,131,129, 79,237,247,230, 70, 90,133,251, 34,207, 22, 34,212,156, 94,111,221, +207,254,118,228,157,179,191, 29, 89,220,115, 72, 72,189, 33,131,218,163, 79,175, 14, 0, 8, 78,255,186, 31, 69, 69, 69,191,252, +240,195, 15, 35,108,109,109, 83,143, 28, 57,242, 16,192, 20,115,119, 36, 53,106,247,155, 46,173,135, 15, 94,181,234,251,117, 30, +245, 27,136, 29, 93,220,172, 89, 86, 34,122, 18,167,202, 75, 81, 37,240, 26,141,250, 23,171,252,252,105,230,246, 28,188, 93, 98, +152, 38,181,244, 37,254, 35, 63, 88, 49,163, 75,251,134, 65, 31,188, 25,224,152,203,231,210,223, 14,221,123, 26,159, 92,120, 13, +192,178,152,120, 26, 89,151, 3,175,211,233,116, 21,163,174, 58, 83,107, 96,243,159,226,179, 9, 33,223, 48, 12,153, 7, 10, 34, +145, 72,174,173, 93,187,118, 43,195, 48, 73, 90,173,246, 74,102,102,102,241,139,202, 40, 5, 5, 5,251, 9, 33, 17, 15, 31, 62, +156, 73, 8,113, 48, 24, 12,183,211,211,211,127,166,148,214, 56, 74,120,233, 96,151,253,229,114,121,143,139, 23, 47,174, 24, 52, +104, 80,219, 87, 95,125, 21,105,105,105, 96, 89, 22, 55,111,222,212, 30, 57,114,228,106,110,110,238,103,148,210,235,181, 77,155, + 74,165,234, 36,151,203,233,151, 95,126,249,151,207,107,171, 21, 17, 17,113, 47, 32, 32,160,219,215,219,183,239, 31,208,172,153, +119,211,134, 13,197, 13, 90,182,132, 84, 38, 67,238,211,167,184,241, 56,197,184, 51, 54, 54,190, 72,167, 27, 17, 21, 21,117,219, +204,115, 13, 39, 39, 39, 80, 74, 33,157, 51, 7,148, 16,240,148,162,128,144,178,177,125, 44, 58,116,128,129,101,145,157,159, 15, +115,178,129, 74,165, 74,146,203,229,195, 63,252,240,195, 51, 63,254,248, 35,211,189,123,119,191, 19, 39, 78, 60,239,164,185, 31, + 92,188,120,113,237,197,139, 23, 43,253,146, 97, 24,240, 60,255,129, 82,169, 92, 7, 51,219, 14, 21, 23, 23, 87,106,176,238,223, +191, 95, 49,162, 85,187, 71,122,189,254,153, 97, 14, 76, 67, 62, 60, 47, 43, 59, 94, 5, 54,183,143,252,109,234,131,197, 61, 95, +111,255,217,194,105, 43,173,157,156,157, 96, 48, 24,240, 40,241, 33,182, 30, 88, 83,152,175,206,254, 38, 59,166,230, 57, 56,131, +131,131, 45, 24,134, 25,234,231,231,135,168,168, 40,104,181,218,115,161,161,161, 49,193,193,193,191,223,188,121,115, 96,211,166, + 77,193,178,108, 72,112,112,176, 85,104,104,104,109,198, 24,122,144,156,156, 12,131,193, 0,103,103,103, 46, 59, 59,187, 1,128, +135, 74,165,178, 8, 64,116, 93,246,251,252,249,243,134, 46, 93,186,220,187,117,235, 86, 7,111,111,111,114,253,250,245, 66,181, + 90,189,179, 14, 82, 43,142, 29, 59,214,133, 82,218,207,223,223, 31, 94, 94, 37, 1,160,152,152, 24, 92,188,120,113, 55,207,243, +239,188,160,201,157, 41, 33, 4,121,121,121,166, 90, 14,157,181,181,117, 93,117,139,202, 69,174,138,254,109,133,180, 82,169, 92, +170, 80, 40, 14, 78,156, 56,113, 94,131, 6, 13, 70, 77,159, 62,157,109,222,188, 57,242,242,242,208,161, 67, 7,184,184,184,224, +238,221,187, 56,117,234,148,241,233,211,167,191, 0, 88,168, 84, 42,239,213,160,249,173, 66,161, 56, 48,113,226,196,121, 62, 62, + 62,163,166, 77,155,198, 54,111,222, 28,185,185,185,232,216,177, 35,156,157,157, 17, 19, 19,131, 19, 39, 78, 24,115,114,114,118, + 1,248,250,191, 50,223,227, 11, 53,203,117, 25, 21,246, 57,156,184, 41,226,192, 1,120, 7, 64,153,209,250,240,157,121, 80,169, + 84, 36, 36, 36,196, 5,128,225,200,145, 35, 89,117,121, 98, 32,132,144,122,173, 67, 26,179,148,243, 7, 33,245, 0, 26, 46,146, +177,209, 73, 87,247,170,159,231, 41,164, 85, 67, 18, 76, 41, 38, 1, 0, 79,176,238,238,195,234,187,255,155,163,201, 48,100, 49, + 74, 38,112, 5,128,101, 60, 79,103,215, 69,179,178, 70,238,207,123,142,254,142,243, 94,122,238, 9,128,145, 18,137,100,253,136, + 17, 35,172,183,111,223,174,201,200,200,152, 4,224,167,234, 26,164,155,147, 78, 66,200, 2,148,180,239,250,146, 82,186,224,121, +210, 89,126,178,103,148, 78,246, 12, 51, 38,123,174,168,217,177, 99,199, 52,189, 94,239, 82,171,167, 30,142,203, 52, 24, 12,238, +166, 41, 63,106, 56,158, 35,235,215,175,191, 36, 57, 57,249, 64, 82, 82,210, 39,255,166,243, 94, 97,160,209,154,168,180,138,176, +178,116,142, 24, 49,226,190, 78,167,243, 54, 71, 84, 36, 18,165,107,181, 90,175, 35, 71,142, 24,107,179,239, 19, 34, 21,216,255, +110, 84,123, 71,187,122, 11,181, 26, 93, 59, 66, 64,197, 98,241,205,167, 57,153,243, 42, 51, 87,149,105, 6, 7, 7, 59,214,171, + 87,239,233,130, 5, 11,176,126,253,122,220,185,115,103, 76,104,104,232,206,224,224,224, 17,222,222,222,191,142, 26, 53, 10,235, +215,175,199,211,167, 79, 3, 66, 67, 67,149,230,158, 35,133, 66,209,178, 73,147, 38,183,230,204,153, 67, 22, 46, 92,136,248,248, +248,150, 74,165,242,206,243,158,247,192,192, 64,111,145, 72,180,219,104, 52, 54, 36,132,108,185,118,237,218, 92, 74, 41, 95,135, +243, 46, 6,240, 81,253,250,245,167,185,186,186,186,166,165,165, 37, 60,121,242,100, 49,128, 45,230,154, 43,115,206,145, 66,161, +208, 0,144, 0,128, 57,237,173,254,233,123,221,223,161,169, 80, 40, 26, 2,152, 87,191,126,253, 81, 19, 39, 78,100,239,223,191, +143,147, 39, 79, 26,211,211,211,171, 53, 86,230,104, 54,104,208, 96,212,248,241,227,217,216,216, 88,156, 60,121,210,248,244,233, +211,106,141,149, 16,193,250,151, 26,172, 74,140,214, 2, 0,113, 42,149,170,215,191, 45, 67,255,221,154,132, 16,215,210,104, 84, +218,127,105,223,229,114, 57,151,147,147, 19,104, 52, 26,239,104,181,218,220,255,218,121, 23, 52, 95,126,205,210,225, 25, 78,216, +219,219,247,205,201,201,185, 9,160, 99,104,104,168, 38, 56, 56, 88, 4, 96,191,157,157, 93, 72,110,110,238, 5, 0, 61, 67, 67, + 67,249, 90, 22,138,223,112, 28, 55,210, 96, 48,252, 84,155,121, 33,255,201,227, 89,250, 48, 37,169, 97,144, 91, 33, 47,213,205, + 92, 54, 4,240, 17, 74,134, 98,248,190,166,136, 85, 45, 53, 1,224,187,154, 34, 86,130,193, 50,227, 97,249,127,185,113,149, 74, +101, 64,201, 60,113, 91,254,171, 39,192, 28, 99,245, 50, 82,122,238,175, 8,151,160,192,203, 74,104,104, 40, 5,208, 47, 56, 56, +216, 43, 52, 52, 52,177,220,231,250,224,224,224, 97,185,185,185, 14, 0,178, 43, 51, 87, 53,161, 84, 42,231, 2,152,251, 47,191, +198, 41, 0,141,144, 19, 94, 60,165,230,103,202,191, 93, 83, 48, 88, 2, 2, 2, 2, 2,127,167,209, 74,172,228, 51, 3,128, 12, +225,232, 8, 8,188,188, 16, 0,173, 43,251,162, 54,161,191, 10, 93, 91,205,194,140,246, 52,130,166,160, 41,104, 10,154,130,166, +160, 41,104,190,100,154, 53,105,191, 44, 85,143,255,211, 54, 88,130,166,160, 41,104, 10,154,130,166,160, 41,104, 10,154, 47, 35, +140,112, 8, 4, 4, 4, 4, 4, 4, 4, 4, 94, 44,102,183,193,106,221,132,120,242, 6, 12, 1, 48,160,244,163, 99, 12,135,223, +110,221,163, 73,117,221,184, 92, 46,111, 9,224, 29, 66,200,155, 0,120, 74,233,110, 0, 59, 84, 42, 85,108, 93, 53, 21, 10, 69, + 75, 0,111, 17, 66, 94, 3, 0, 74,233, 62, 0, 63, 43,149,202, 24,115,126, 47,149, 74,211,212,106,181, 11, 0, 88, 90, 90,166, + 55,111,222,220, 13,127, 14,230, 73, 0,144,162,162, 34, 20, 21, 21,209,194,194, 66, 90, 84, 84, 68,181, 90,109,181, 97, 64, 11, + 11,139, 52,173, 86,251,151,174,250, 34,145, 72,103,111,111,159, 93,175, 94,189,108, 23, 23,151,108,177, 88, 28,157,145,145,113, +246,198,141, 27, 97,148,210,148,218,236,119,215,174, 93,191,178,180,180,156,166,213,106,127, 56,127,254,252,236,191, 59,227, 16, + 66, 58,212,151,187,238, 48, 24, 12,198,148,244,167,115, 41,165,135,106,121,158, 36, 0,136, 82,169,124,166, 17,236,250,113,196, + 29, 0, 51,105, 75,205,227,107, 9, 8, 8, 8, 8, 8,252,191, 52, 88, 45, 91, 18, 41, 52,232, 11, 96, 72, 35, 47,151,160, 79, + 38,189,238,212, 62,168,143,172,176, 88, 71, 47,158, 61,214,113,235, 79, 71, 62,110,229, 75,174,242,192,111,196, 18, 39, 99, 98, +104,149, 3, 91,126,247,169, 40,205, 96, 52,184, 0, 0, 5, 87,176,106,175,243,125,133, 66,225, 63,125,250,116,116,232,208, 1, + 60,207,227,194,133, 11, 51, 87,173, 90, 53, 83, 46,151,135, 1,216, 1,224, 23,149, 74,149,107, 70, 97, 93, 31,192,155, 0, 70, +118,236,216,177,245,164, 73,147,208,184,113, 99,168,213,106,132,133,133,205,222,181,107,215,108,133, 66,113, 11,192,110, 0,123, +148, 74,229,147,170,180,212,106,181,139,169,218,148, 16,226,226,239,239,207,155,230,119,211,233,116, 80,171,213,183, 53, 26, 77, +164, 78,167, 11,147, 72, 36,151, 87,172, 88, 17, 11,192,216,204,213,170,163,143,135,211,128,227,202,199,127,233,217,163,213,106, + 93,212,215,175, 3, 70, 35, 12,137,137, 80,247,234, 5,157, 78, 7,189, 94, 47,102,251,247,119, 53, 48,140, 43,242,243, 31, 20, +110,223,190,166, 85,171, 86,101,221,109,171,211,172,176,255, 36, 32, 32, 96,246,236,217,179, 69,163, 70,141,122, 95,161, 80,204, + 51,141,161, 84, 17,115, 53,107, 48, 87, 22, 29, 3,218,158, 59,178,127,143, 37, 33, 12, 6, 15, 27,182,155, 16,242, 54,165,116, +127, 37,105,115, 66,201, 88, 95, 34, 0,223, 42,149,202, 84,133, 66,113, 84, 44, 22, 15, 40,253,254,178, 82,169,236, 92,106,174, + 22,149,174, 75,214,143, 35,223, 77,218, 66,167, 61, 79,230,174, 48, 14, 83,173,166, 98, 17, 16, 16, 16, 16, 16,248, 91, 12, 86, + 75, 31, 50, 74, 42, 21,207,156, 50,121,128,123,255,254, 3,108, 29, 61, 21, 28, 72,201,160,185, 22,182, 32,195, 70, 77,179, 26, +242,230, 84,171,248,187,151, 61,143, 31, 63,218,111,215,254,179,170,150, 62,100,105,204, 35,186,171, 50, 61,131,209,224, 50,253, +189, 73, 0,128, 21, 91,215, 91,199,198,198,250, 91, 91, 91, 63, 51, 45, 72,223,190,125,209,187,119,111, 36, 38, 38, 6,238,223, +191, 63,112,251,246,237,171,229,114,249, 28,149, 74,181,170, 26,115,177,196,195,195, 99,230,244,233,211, 73, 64, 64, 0, 44, 44, + 44,202,190,179,182,182, 70,175, 94,189,208,171, 87, 47,164,166,166,182, 62,127,254,124,235,159,127,254,121,177, 66,161, 88,170, + 84, 42,205,138,242,188,249,230,155,200,202,202,194,211,167, 79,145,151,151,167, 42, 44, 44, 76,211,104, 52, 42,177, 88, 28,251, +250,235,175,199,181,106,213,202,216,204,213,170,153,147,147,227,209, 37,223, 44, 0,170,233, 58,173, 10, 42,153, 26,175,248,214, +159,213,214, 82, 74, 41, 35,145,220,229, 82, 82, 14, 84, 48, 87,102,105,150,226,248,232,209, 35, 94, 44, 22,163,105,211,166,226, +184,184,184,180,238,221,187,111, 56,127,254,252,188, 10,230,170, 54,154,213,209, 97,254,140, 15,196,153, 15,163,112,247,202, 41, + 12,246,175,111, 25,117,235,222,215, 0,246, 87,178,238,148,119,222,121,231, 83, 7, 7, 7,172, 90,181,170,175, 66,161, 8, 4, + 16,124,242,228, 73,136, 68, 34,244,234,213,235, 21,133, 66, 33,183,183, 80,191, 54,164, 9,153, 61,249,147,137, 4, 0, 54,253, +176,233,227,245,227,200,234, 73, 91,232,147,231, 72,103, 96, 82, 82,210, 32, 66, 8, 60, 60, 60,132,171, 93, 64, 64, 64, 64,224, + 95, 16,193, 34,152,115,237,250,157,102,140, 49,147, 16,145,109,165,171, 48, 44,135, 70,173,186,113, 19,189, 91, 57,244,235,221, +199,110,216,152, 79,230, 0,216,101,206,134,109,108,108, 42,215,100, 24,120,123,123,227,211, 79, 63, 69,187,118,237, 36, 99,198, +140,249, 10,192,170,106,164,102,238,221,187,151,148,205,245, 86, 5,110,110,110,232,221,187, 55,220,220,220,200,140, 25, 51,102, + 2,168,212, 96, 89, 90, 90,166, 19, 66, 92, 0,192,209,209, 17, 27, 55,110,132, 86,171,229,139,139,139,111, 22, 23, 23, 71,106, +181,218,107,132,144, 43,215,175, 95,191, 95,106, 90, 60,164, 82,139, 83,155,214,127, 15,125,126,154, 99, 85,219, 55, 38, 85, 90, +147,154,195,202,100,143, 69,241,241,191, 74,114,115,195,202, 25, 33,179, 52, 75, 13,166,131,173,173,237,245,181,107,215,138,196, + 98, 49,222,127,255,125, 43,149, 74,101,181,108,217,178,143, 80,110,238,168,218,104, 86, 19,185,122,165,115, 7,197,169,239,151, +124, 33, 85,116,232,140,107,251,215, 33, 39,167, 16,133,249, 69, 48,242,188,101, 21, 63,179,119,119,119,199,208,161, 67,161,209, +104,154,172, 91,183,110, 47, 0,166,176,176,176,108, 6,120,119,119,247,196,174, 65, 10,150,137,255,234,185, 50,243,250,113, 37, +131,182, 78,218,242,231,216, 98,117,157,252, 87, 64, 64, 64, 64, 64,224,239, 49, 88, 0,199, 90, 53, 36,218,115, 67,121,214,169, + 43, 97,229, 33,132, 88,200,159, 89,161,224,233, 99,196, 93,221, 65, 19,162,143,208,250,126,163, 73, 69,189,242, 61, 12, 88,150, +203, 88,177,117,189, 51, 0, 88, 72,157,176,119,239, 94, 4, 7, 7, 99,255,247, 45,145,159, 91,210,220,200,198,206, 29,195,167, +198, 32, 54, 54, 22,151, 47, 95, 70,211,166, 77,129,146,170,165, 74, 53,203,172, 96, 68, 4, 50, 94,121, 5,146,172, 44,200,100, +178,178,153,192, 77,196,197,197,225,226,197,139, 72, 72, 72, 64,195,134, 13, 75,126, 83,133,102,113,113,177,235,219,111,191, 93, + 52,122,244,104,233,142, 29, 59, 16, 23, 23,103, 23, 25, 25,153, 87,217, 1,106,230,106,101,207,177,236,169,205,235,191, 19, 65, + 87,232, 24, 27,126, 25,173,250, 79,168, 52,157,234,110,221,202, 34, 87,210, 14, 29, 64,124,124,116, 68, 44,142, 43,216,177,163, +107,171, 86,173,244,181,213,236,220,185,243,124,158,231, 63,230, 56,206,114,221,186,117, 34, 39, 39, 39,102,229,202,149,250, 83, +167, 78, 25, 41,165,140, 88, 44,254,174, 46,233,172, 14, 75,137,104,199,250,165,243,164, 68, 95,140,200,227, 59,145,244, 56, 17, + 55,239, 39,235,127,185, 20, 99,212,234,141, 99,171, 56, 71,223,172, 92,185,114,104,211,166, 77,221,199,142, 29, 11,142,227,122, +103,102,102, 98,207,158, 61,176,178,178,194,250,245,235,225,237,237,205, 26,141, 70, 68, 30,125,138,245,223,173, 5,165, 20,133, + 58,241,238,153, 59, 13, 79,170, 57,239, 21,205,213, 98, 0, 51, 74,223, 47,251,250,164,123, 62,128, 64,111,111,111, 0, 72, 3, + 16, 86,241, 55,127, 71, 15, 24, 65, 83,208, 20, 52, 5, 77, 65,243,111,161, 61, 0,103,148,140, 31, 23, 94, 97, 25,165,239, 81, +201,114,102,105,153, 95,175,156, 86, 38, 0, 90,186,142,177,180,124,200,254, 91, 12, 22, 33,164, 27,128,243,168,108, 14, 55, 94, + 15, 99,250, 25,106, 76, 63, 75, 25,135, 0,194,202, 7,147,236, 92, 53, 98,175,108,163,170,184,115, 20,165,237,149,244,154,188, +106, 55,180,108,143,179,151,149,149,149, 58, 54, 54, 22,103,206,148, 76,227,119,224,192, 1,228,231,166,160, 92,213, 33,150, 47, + 95, 94, 22,117, 48,119,238, 99,170, 41,105, 39,173,213,106,161,213,106, 65, 2, 3, 33,234,218, 21, 15, 62,248, 0,161,161,161, +200,200,200,128, 88, 44,134, 88, 44, 54,107, 66, 88,157, 78, 71,210,211,211,161,209,104,248,162,162, 34,125, 21,230,202,146, 16, + 28,253,126,197, 66, 91, 91,107,169,107,196,169,131, 72, 72,168,122, 42, 64,189,254, 79, 25,210,176, 97, 49,195,178,225,146,168, +168,159,189,159, 53, 87,102,107,242, 60,255,233,238,221,187,173,178,179,179, 33,145, 72,176,116,233, 82,253,133, 11, 23,146, 13, + 6, 67,160, 82,169,204,172,107, 58,171,141, 58,218, 57,108, 30,241,238,212, 37,179, 94,235,136,226, 34, 53,126,251, 35, 6,161, + 55, 31, 13, 2,240, 7,165,180,210,201,106,149, 74,101,154, 66,161, 24,252,233,167,159,254,177,115,231, 78,201,168, 81,163, 96, + 52, 26,203, 94,133,133,133, 56,119,238, 28,254,248,227, 15,132,135,223,200, 17,243,205, 78,185, 89, 21,110,223,117, 42,225,116, +117,105, 41,223,190,202,217, 90,127,119,252, 43,152, 49,233,227, 73, 44, 0,172, 95,189,126,134,157,212, 24,122,233,250, 29, 87, +134, 97,208,178,101, 75,161,253,149,128,128,128,192,191,148,106, 61,200,159, 56, 19, 66,142, 82, 74, 7, 2, 8, 6, 32, 41,183, + 12, 66,200,209, 82,227,247,204,242,236,217,179, 63, 91,188,120,241,109,211,178,105,157, 57,115,230,180, 90,178,100,201,162, 78, +157, 58,237,185,114,229, 74,252,223,102,176, 0,156,167,148,146, 26,108, 12,248,236,112,202,103,135,211, 51,167,226,254,106, 74, +106, 48, 88,149, 81,191,126,125,220,174, 48, 69,105,121, 3,100,174,193,194, 43,175, 0, 41, 41,128,187,123, 73, 74, 83, 82,160, + 3,176, 97,206, 28, 72, 36,146,178,170, 40, 0, 48, 26,141,102, 25,172,140,140, 12, 90, 88, 88,120,163,168,168,200, 80, 73,102, + 32,109,124, 92,247,206,153,242,110, 3,239,134,141,228,215,143,253,138,248,120, 21,210,210, 42, 63, 63,214,214,214,249,122,189, +222, 84, 39, 26,201, 16,146,105,113,227,198, 47, 44,112,171,174,154, 12,195, 28,123,235,173,183, 6,119,232,208,129,180,104,209, + 66,114,230,204, 25,131,209,104,124,198, 92,213, 86,179, 58, 20, 10, 69,223, 65,131, 6,125,253,238,187,239,226,131,247,198, 96, + 64, 43, 55, 36,164,229,232, 1,156,174,110,146,230, 82,147, 21,161, 80, 40, 70,142, 24, 49,226, 7, 95, 95, 95, 55, 0,104,215, +174, 29,222,122,235, 45,124,247,221,119, 56,125,250,244,126, 0,155, 0, 92, 80,195,130, 57,123, 37, 70,107, 70,146, 2, 99, 98, + 98, 6, 17, 66, 16, 20,208, 84, 82,149,169, 21,170, 7, 5, 4, 4, 4,254,245,152,225, 65,202,202,181,163,148,210,129,229, 13, + 83, 69,163,101,122,111, 90,111,241,226,197, 3,203,155, 47, 0, 88,178,100,201,162,114,203, 69,127,199, 78,153, 12, 86,119, 66, + 8, 5,208,157, 82,122,161, 46, 66,122, 77, 94,157, 70, 44,181,144,214,195,138,173,235, 75, 76, 3,247,108,187, 44,173, 86,107, +150, 70,109, 6, 75, 53, 51,130,197,103,103,103, 63, 42, 40, 40, 8, 47, 44, 44,252,139,121, 24, 52,104,208,138, 70, 13, 60, 58, + 55,105,215, 65,118,253,228, 1,220,191,151,128,204,204, 92,128, 66, 93,153,158,163,163,227, 83,102,210, 36, 27, 89, 74, 74, 54, +195,243, 73, 13,162,163,135, 60,175,230, 31,127,252,241,166, 66,161, 8,184,114,229,202, 37, 59, 59, 59, 0,160,229,205, 85, 93, + 52, 43, 49, 85,175,176, 44,123,138,101, 89,105,187,118,237, 48,105,210, 36,252,240,195, 15,198,212,156,130,175, 87, 28,122,252, +126,145, 86,255, 94, 77,230,170,156,201, 58,168, 80, 40,142,222,184,113,195, 7,192,155,142,142,142,243,245,122, 61,120,158, 7, +128, 67, 0, 34, 0,156,112,118,118,238,166, 80, 40,126, 85, 42,149,163,106,210,100, 89, 22, 9, 9, 9,200, 45,102,181, 0,150, +173, 95,189,126, 70,233, 87,203,114,139,217,124,127,127,127,109,105,148, 43, 80, 46,151, 31,130,208,147, 80, 64, 64, 64,224,223, +136,217, 30,196,100,154, 42,154,172,218,152, 51, 0,197,179,103,207,254,140, 16,114,180, 52,194, 85, 12, 64,245,162,119,138, 41, + 77,240,133, 82,247,120,254,217, 61, 49,152, 45,164,215,228,215, 41, 1,141,186,254, 12,197,224, 11,120,164,155,140, 52,102,226, + 51,166,201,236, 42,194, 3, 7, 74,162, 87, 41, 41,127, 70,178, 74,163, 89,117, 49, 88,133,133,133, 55,179,178,178,110, 20, 20, + 20, 92, 41, 42, 42,122,102, 34,214,144,144,144, 15, 27, 54,108,248,222,162,101,171,108,143,156, 60, 91, 24, 30,126,171, 48, 45, + 61, 7,197, 90,189,238,102, 82,202,119,149,233,185,186,186,102,241,132, 60,101,245,250, 83, 22,183,110,237,169,248,125, 93, 52, + 77,145, 33, 66,200,161,147, 39, 79,198,177, 44,187,226, 69,104,150, 55, 87,246,246,246,191,127,251,237,183,210,111,191,253, 22, + 99,198,140,193,170, 85,171,112,243,230,205, 55, 82, 82, 82, 22, 20,106,116,114, 74,233,239,230,158,231, 31,222, 35,238,227,253, + 35,221, 0,184, 57, 58, 58,206, 25, 53,106, 20, 12, 6, 3,122,244,232, 1, 39, 39,167, 29,132,144,168,113,227,198,245, 90,185, +114, 37,231,235,235,251,150, 66,161,240,173, 73,147,231,249,178,170,215, 73, 91,232, 28, 0, 30, 0, 60, 76,237,175, 76,235,221, +187,119,207,245,254,253,251,131,202,127, 38, 32, 32, 32, 32,240,239,160, 74, 15, 82,141,201,170,227,118, 76,191, 19, 45, 94,188, +248, 54,165,116,224,146, 37, 75, 22, 1,144,254,109, 17,172, 82,231, 8, 0,221,159,245, 87, 5,181,137, 96, 85,251,253,204, 55, +211, 19, 13,198, 20,172,154,206,194, 66, 90, 15,141,186,254,108, 78, 36,201,188,131,166,209, 84,229, 86,255,178,108,142,193, 42, + 42, 42, 10, 79, 79, 79,191,159,148,148,116, 94,167,211,149,133,199, 6, 12, 24, 48,196,197,197,229,219, 47,191,252, 82,154,156, +156,140,250, 77,218,218,157,252,237,128,198,201,130, 83, 39,100,101,143,185,149,156,191,175, 50, 61, 75, 75,203, 24, 26, 31,127, +219, 50, 46,238, 56,128,232,242,223,213, 85,211,196,213,171, 87,223,172,248,217,243,106, 42, 20,138, 87, 28, 28, 28,126,159, 59, +119,174,236,206,157, 59, 96, 89, 22, 86, 86, 86,184,115,231, 14,148, 74,229,254,218,102,178,117,239,147, 5, 44,193, 92,163, 17, + 76, 87,239,116,195,155,179, 54,136, 29, 29, 29, 17, 21, 21,133, 22, 45, 90, 96,197,138, 21, 92, 92, 92,156,119,179,102,205,112, +239,222, 61, 36, 39, 39, 39, 2,120,100,198,197, 98, 50, 88,165, 17,170, 50, 83, 29,120,231,206, 29, 87, 0,104,209,162, 5,120, +158, 71, 86, 86,150,112, 23, 19, 16, 16, 16,248, 23, 82,149, 7,169,134, 99,248,115,208,115,148,143,102,149, 55, 95,166, 8, 85, +249,229,138,235,151,126,175,254, 59,246,139, 43,221, 88,101,117,159, 70, 94,147, 69, 25,207,183, 8,159,242, 27,133,177,138, 49, + 68, 25, 22,156,196, 26, 69, 5,121, 60, 74, 90,227, 87, 30, 57, 50, 26,157,203, 55,102,103, 89,182,202,246, 80, 44,203,194,206, +206, 14, 5, 5, 5, 0, 80,147,203, 50,234,135, 15,103, 37, 67,134, 64,231,230, 6,170,211,149, 68,177, 0,224,179,207,158, 49, + 87, 98,177, 24,154, 18, 51, 86,109,181, 86, 94, 94,222,213,155, 55,111,254,161,215,235,211, 0,160,123,247,238,155,245,122,253, + 16, 7, 7, 7,135,144,144, 16, 93, 90, 90, 26, 78,156, 56,129,139, 23, 47, 22, 59, 52,108, 29,145,155,153, 50,250, 86,114, 66, +149, 35,218,167,167,167,159,242,138,141,253,181,252,103,207,171, 89, 25, 47, 66, 83,161, 80,188, 82,175, 94,189,223, 63,251,236, + 51,217,221,187,119, 33, 18,137, 96,101,101,133,172,172, 44,176, 44, 91, 92,219, 12,182,117, 28,113, 32,192,156, 9, 83, 39, 48, + 12,195, 48,155,214,110, 22,219,203, 40,118,238,220,137,125,251,246,165,181,106,213,202,245,189,247,222, 67,211,166, 77, 17, 27, + 27,139, 85,171, 86,101,107,181,218,193, 74,165,178,198,122, 95, 83, 4, 43, 50, 50,210, 85, 34,145, 12, 34,132, 64,175,215,163, +109,219,182, 48, 26,141, 72, 41,201, 7,105,205,154, 53, 51,245, 32, 12, 19,110,101, 2, 2, 2, 2,255,186, 8,150, 57,237,175, + 50, 75,205, 83, 90, 37,203,108, 57, 99, 85,113, 57,189,194, 50, 0,104, 43,124,127,227,111, 51, 88, 85,176,122,196,208,158, 51, + 63,159, 53,193,173, 69,211, 89,150, 52,253, 4,104,174,146,194,212,228,134, 48,144, 88, 57,129,178, 22, 84,121, 55, 35,255,220, + 77,117, 38,128,213,230,110,184,121,243,230, 72, 77, 77,125, 38,178,192, 48, 12, 28, 29, 29, 33,149, 74, 17, 30, 30,142, 63,254, +248, 67, 15,224,139, 26,164, 22,142, 25, 51,230,139,201,147, 39, 51,129, 99,199, 66,119,233, 18, 12,127,141, 32, 65, 42,149, 34, + 57, 57, 25,177,177,177, 60,128,133,213, 9, 62,126,252,248,146, 94,175, 79, 47, 53, 45,239, 56, 56, 56,140, 28, 59,118,172,244, +230,205,155,216,186,117, 43,231,235,235,171,123,252,248,177,193, 96, 48, 76, 63,126,252,196,134,154,246,245,238,221,187,215, 43, + 24,161,231,214,172,196, 92, 61,183,102, 64, 64, 64,144,139,139,203,239,115,230,204, 41, 51, 87, 50,153, 12, 89, 89, 89,216,179, +103, 79,161,209,104,236,247, 34, 50,157, 90,173,198,254,253,251,243, 1,248,222,190,125,123,232,172, 89,179,190,247,242,242,178, + 79, 76, 76,204,208,106,181,193, 74,165,242,150,153, 23, 37,244,122, 61,226,226,226,192,178, 44, 24,134, 41,107,212,222,186,245, + 51,147,180, 11,109,175, 4, 4, 4, 4,254,127, 19, 86,195,242,191,142, 42,187, 88,197,196,211, 77,247, 31, 60,233, 51,106,226, +220,157,227,166,124,150, 20,151, 89, 79, 67,220, 6, 19, 88,202, 97, 97,227, 14, 27,247, 54,120,148, 41, 42, 90,115, 80,245,228, +200, 53,245, 47, 69, 69,232, 31, 19, 79, 55,149,215, 32,132,148,149,114, 28,203,166,175,216,186, 30, 43,182,174,135,145, 23,105, +223,125,247, 93,100,102,102, 34,254,143,209, 80, 30,234, 6, 31,241, 58,184,209,141,200,200,200,192,186,117,235,104,104,104,232, + 94,141, 70,211, 76,165, 82,173,174, 74, 19, 0,148, 74,229,151,201,201,201,126,159,125,246,217,201, 73,121,121,184,179,118, 45, + 36, 99,198,128,105,211, 6, 50,153, 12,206,206,206, 40, 40, 40,192,197,139, 23,113,243,230,205,147, 90,173,214, 79,169, 84,126, + 89,157,166,201, 92,117,232,208,193, 38, 39, 39,231,187, 49, 99,198, 72, 11, 11, 11,145,156,156, 12,165, 82,137,248,248,248,211, + 6,131,161,213,177, 99,199,170, 52, 45,229, 53, 41,165,137,166,247, 47, 74,179, 60, 47, 74, 83, 44, 22,207,216,180,105,147,172, +184,184, 24, 34,145, 8,214,214,214,200,206,206,198,238,221,187, 11,181, 90,109, 63,165, 82,121,217,156, 76, 85, 94,243,189, 45, + 52,155, 18, 44,222,248,253, 70,126,253,234,245,148, 58,118,131,212,206, 3,118,118,118,214, 40,105,152,191, 75,171,213,122,220, +191,127,191,141, 86,171,109, 82,149,185,170,108,223, 77, 17, 44,211, 84, 70,166,247,145,145,145,136,137,137,193,157, 59,119,112, +227,198, 13, 87, 84,209,246,170,170,227,249, 60, 8,154,130,166,160, 41,104, 10,154, 2, 53, 69,176,112, 59,129,198, 3,152,212, +210,151,248,143,252, 96,197,140,174,237, 27, 6, 77,126, 83,225,152,107,204,161,191,253,118,255,105,124,114,225, 53, 0,203, 98, + 30,209,200,154, 54,244,209,114,131,107,249,229,239,228,242, 14, 99,199,142, 93, 58,109, 68,122,231,242, 85,135, 63,239,253,249, + 60,128,153, 42,149, 74,105,238, 78, 40,149,202,104, 0,253, 21, 10, 69,215, 79, 63,253,244,219,161,158,158,129,163,186,119,135, + 72, 36, 66,120,120, 56,178,178,178,194, 0,204, 82, 42,149, 23,107,115,112,138,138,138, 22, 54,109,218, 84,114,231,206, 29, 60, +120,240, 0,113,113,113,200,202,202,186,127,228,200,145,129,117, 61,224,255,102, 77,157, 78,183,104,205,154, 53,125, 62,250,232, + 35, 11, 43, 43, 43, 68, 71, 71,227,231,159,127,174,149,185,170,140,201,155,233,130, 31,222, 35,155, 66, 31, 55,122,189,173,188, +211, 74,131,193, 0, 23, 23, 23,146,147,147,227, 11, 32, 70,169, 84, 22,163,220,144, 21,230, 82, 92, 92, 92, 54, 20, 3,195, 48, +224,121, 30, 12,195, 32, 54, 54,246, 47, 17, 45, 1, 1, 1, 1, 1,129,127,141,193, 42, 23,205,138, 4,240, 70,171,134, 36,248, + 98,248,195, 73, 0,192, 19,172,187, 27, 79,207,212,117,195, 42,149,234, 58,128, 46, 43, 62, 33,180,194,231, 61,234,170, 89,106, +160, 58, 40, 20,138,161, 7,129,207, 16, 31, 15, 0,139,148, 74,229,193,218,232, 4, 6, 6,122, 23, 22, 22,238,212,233,116,126, + 70,163, 81,114,225,194, 5,168,213,106,220,185,115,167,152,231,249,125,117, 73,219,255, 7,205,136,136,136,112,133, 66, 17, 76, + 8, 9,157, 48, 97,130,197,172, 89,179,158,219, 92,153,248,112, 43, 77,217,161, 80,132, 74, 98, 99,169, 78,167, 35,165,157, 13, +158,199,253,132, 5,149,206,237,104,206,186,194,165, 46, 32, 32, 32, 32,240,175, 51, 88, 38,110, 63,164,161, 0, 66, 95,104, 2, + 74,170, 14, 93, 76,239, 95,132,102,169,161, 58, 88,215,223,231,231,231, 47,202,202,202,234,152,151,151,103,120,244,232, 81, 49, + 33,196, 64, 8, 41,230,121,254, 43,158,231, 55,188,204,154, 74,165,242,114,251,246,237,187,132,133,133, 77,211,104, 52, 63, 40, +149,202, 43, 47,234, 92, 43,149,202, 24,133, 66,241,213,184,113,227,222, 54, 24, 12,191,152,219,214,170, 10,131, 46,180,169, 18, + 16, 16, 16, 16,120, 57, 12,214,223, 65,197,170,195,127, 3,177,177,177,111, 2,120,243,191,168, 9, 0,225,225,225, 17,127,135, +110,169,201, 90, 0, 96,129,112,233, 9, 8, 8, 8, 8,188,204, 8, 13, 84, 4, 4, 4, 4, 4, 4, 4, 4, 94, 48, 4, 64,165, + 61, 1,106, 51, 83,118, 93,122, 19,212,164, 47,104, 10,154,130,166,160, 41,104, 10,154,130,230,203,167, 89,147,118,109,252,199, +191,218, 96,213,102, 30,191, 90,139, 19,210,250, 69, 31, 40, 65, 83,208,252, 39, 52, 73,201, 52, 0,164,228, 90, 55,255, 34, 17, +142,167,160, 41,104, 10,154,130,166, 0,240, 47,104,131,245, 95,131, 16,194,224,207,170, 89,190,182, 5,184,192,223,126,126, 76, +198,138, 3,192, 2, 48, 18, 66, 12,194,121, 18, 16, 16, 16, 16,248, 91, 13,150, 66,161,104, 12, 0, 74,165,242,254,191, 97, 7, +252,253,253,175,251,250,250, 54,184,127,255,190,158, 16, 2, 66, 8, 24,134, 41,155,135, 80, 36, 18, 93,186,122,245,234, 91,255, +134,180,182,108,217, 82,220,179,103,207,223,165, 82,233, 51,243, 45,133,132,132, 0, 37, 37, 56, 95, 88, 88, 40, 59,127,254,188, +230,101,203,104,214,214,214, 60,195, 48,132, 97,152,178, 49,170,202,255,175,236, 51, 66,136,117, 76, 76, 76, 97, 85,154, 35, 70, +140,176,213,106,181,131, 9, 33, 17,148,210, 0, 66, 72, 4,195, 48, 1, 60,207, 63,243,159,227,184, 51,123,247,238, 85,153,153, +159, 44, 93, 92, 92, 30,179, 44,235, 92,241, 59,211,121, 58,114,228, 8, 17,110, 29, 47, 23,110,110,110, 93, 25,134, 89, 3,160, + 85,133,175,238, 2,248, 72,165, 82,157, 17,142,146,128,128,192, 11, 53, 88, 10,133,162, 41,128,110,165,175,174,205,155, 55,119, + 45, 42, 42,130, 66,161, 72, 3,112, 17,192, 5, 0, 23,148, 74,101, 92, 77, 90, 65, 65, 65,183,181, 90,109,203, 90, 37,144,227, +242, 56,142,243,188,124,249,114,165, 51, 79,187,186,186,250,238,218,181,171, 94,116,116, 52,172,172,172,158,121,113, 28,135,142, + 29, 59,118,252,183,152, 43,119,119,247,211, 46, 46, 46,157,183,111,223,142,155, 55,111, 66,161, 80,148,125,111, 52, 26, 49, 98, +196, 8,198,206,206,206, 2,128, 89, 6,171, 99,199,142,137,122,189,190,126,109,210, 33, 22,139, 51, 37, 18,137,251,249,243,231, +107,156,245,186, 67,135, 14, 54, 0,102,176, 44,219,147,231,249, 86, 0,192,178,236,109,131,193,112, 22,192,178,235,215,175,231, +155,187, 93,134, 97, 72,102,102, 38,246,236,217,131,214,126, 29, 65, 1,180,107,217,168,204, 8, 95,143,188, 3,163,209,136, 63, +206,159,196,167,211,167,195,207,207, 15, 5, 5, 5,213,230, 79,145, 72,116, 78, 36, 18,249,153,150,203, 79,238, 93,225,125, 56, +170, 24,205,189, 66, 94,151,186,186,186, 38, 88, 88, 88,212,219,189,123, 55,174, 93,187,134,198,141, 27,195,104, 52,130, 82, 10, + 74, 41, 62,252,240,195, 23,146, 31, 8, 33, 65, 0,222, 5,144, 1, 96, 27,165,244,225,255, 42,111,182,107,215,238, 74,135, 14, + 29,154, 69, 70, 70,234, 40,165,101,199,206,244,192, 98, 52, 26, 85, 17, 17, 17,254, 47,232,129,104, 63, 33,100, 88,233, 3,197, +153,200,200,200,224,186,106, 57, 58, 58,218,200,100,178, 25, 18,137,164,167, 94,175,111,197, 48, 12, 56,142,187,173,211,233,206, + 22, 20, 20, 44,203,202,202,170, 77,254, 92,189,101,203,150, 86, 94, 94, 94, 72, 75, 75, 67, 70, 70, 6,114,115,115,145,159,159, +223,124,203,150, 45,235, 0, 52, 22,138, 11, 1, 1,129, 23, 98,176, 20, 10,197,113, 0,221,154, 55,111, 46,237,221,187, 55,252, +253,253,209,160, 65, 3, 88, 90, 90, 2, 0,178,178,178, 92, 99, 98, 98, 94,143,138,138,122,253,234,213,171, 80, 40, 20,197, 0, +254, 80, 42,149,125,171,210,228,121,190,254,201,147, 39,225,228,228,100, 86,226,120,158,199,171,175,190, 42,206,202,202,146, 1, +168,212, 96,165,164,164,240, 95,124,241, 69,206,229,203,151,117,165, 5, 3, 41, 87,205, 3,163,209,248,244,127,125,144, 9, 33, + 76,207,158, 61, 79,150,154, 43,134,227, 56, 68, 68, 68, 32, 57, 57, 25, 46, 46, 46,176,178,178,130,133,133, 5, 12, 6, 3, 40, +165, 57, 33, 33, 33,124, 65, 65, 65,141,145, 44,163,209,232,126,225,194, 5, 88, 89, 89,153,149, 14,163,209,136,206,157, 59, 59, +148,158,119, 67, 13, 5, 97, 15,137, 68,242,203,132, 9, 19,236,131,130,130, 56, 79, 79, 79, 16, 66,144,154,154,218,241,202,149, + 43, 1,235,215,175,159,224,239,239,255, 70,100,100,228, 57, 51, 11, 48,252,248,227,143, 88,184,112, 33,166,207, 91,134, 15,223, +123, 13,132, 16, 88, 88, 88, 32, 55, 55, 23, 29,252, 91, 96,253,143,135,176,103,207, 30,168,139,139,193,113, 28,236,236,236,170, +213,148,201,100, 45,214,174, 93,139, 79, 62,249, 4,171, 86,173, 42,251, 63,109,218, 52,172, 92,185, 18,211,167, 79,199,138, 21, + 43, 48,125,250,244,246,239,190,251,174,197,246,237,219, 53,213,157,163,254,253,251, 63, 46, 53, 87, 68, 44, 22, 35,187, 91, 55, + 36, 0,176,137,137,129,181,181, 53,180, 90,173, 41,146, 69,159, 55,146,229,228,228,244,211,129, 3, 7,188,245,122, 61,230,204, +153, 51,141, 16, 18, 66, 41, 61,253,130,242, 91, 95, 0,179, 75, 23,151, 80, 74,127,175,225, 33,198,115,221,186,117,246,119,239, +222,133, 88, 44,134,133,133, 5, 36, 18, 9, 36, 18, 9, 44, 44, 44, 16, 28, 28,108,172,107, 90,252,252,252,156, 24,134,217, 8, + 64,202,178,236, 84, 66,200,128,211,167, 79,131, 97, 24,244,233,211,167,151,159,159, 95,115, 66,200,114, 43, 43, 43,170, 86,171, +223, 11, 15, 15, 79, 51, 71,215,195,195,163,135,189,189,253, 47,179,103,207,182,239,220,185, 51,231,236,236,140,176,176, 48,216, +219,219,119,188,116,233,146, 98,211,166, 77, 19, 60, 60, 60,222, 72, 78, 78, 62,103,102, 82,155,213,175, 95, 31,159,127,254, 57, +108,109,109,225,232,232, 8, 7, 7, 7, 56, 58, 58,194,221,221,189,225,219,111,191,157,147,149,149, 85, 16, 29, 29, 61,143, 16, +114, 54, 41, 41, 73, 37, 20, 31, 2, 2, 2,117,141, 96,245, 63,127,254, 60, 12, 6, 3,108,108,108,192,178,108,197,167, 71,116, +237,218, 21, 29, 58,116, 64,112,112, 48, 98, 99, 99,165,223,126,251,109,239,154, 54, 40,147,201,112,245,234, 85, 24,141, 70, 68, + 68, 68, 32, 63, 63, 31, 33, 33, 33, 16,139,197, 16,137, 68,224, 56,174,236,191,171,171, 43, 36, 18, 73,181,133,152,157,157,157, +252,216,177, 99,140,133,133, 5,181,182,182,166, 23, 46, 92,160, 0, 40,158,163,205,140, 66,161,112, 19,139,197,223, 26, 12,134, + 17, 60,207, 75,170, 90,143,101, 89,189, 88, 44,254,173,168,168,104,102, 84, 84, 84, 98, 21,133, 29, 1,192,200,100,178, 30,155, + 55,111, 6,199,149, 28,114, 83,225,101,105,105, 89,246,223,193,193, 1, 31,125,244, 17,190,248,226, 11,179, 35, 89, 82,169, 20, + 23, 46, 92, 0,203,178,104,209,179, 39,136, 94,143, 39, 97, 97,224,100, 50,184,249,249,129,232,116, 40,184,127, 31, 34, 43, 43, +184,186,186,254,229, 60, 86, 97,174,250,122,122,122, 30,248,238,187,239,164, 44,203,226,222,189,123, 32,132,128,101, 89,164,167, +167,163,115,231,206, 92,235,214,173,157,230,204,153,115,212,223,223,127, 88,100,100,228,239, 53,105,178, 44,139, 49, 99,198, 96, +249,242,229,152, 50,238, 53, 48, 12, 3, 11, 11,139, 50,211, 2, 0,147,198, 12,198,246,117,139,241,249,231,159,227,248,241,227, +176,182,182,174, 54,122, 23, 24, 24, 40,201,200,200,128, 84, 42, 69,122,122, 58,100, 50,217, 51,255,165, 82, 41,210,210,210, 32, +147,201, 16, 21, 21,149,212,189,123,119,183,202, 34,119,165,231,136, 99, 89,214,121,247,238,221, 16,139,197, 0,128, 34, 0, 70, + 0,206,206,206,208,104, 52,101,147,134,207,157, 59, 23,115,231,206,125,174, 11,175, 97,195,134, 30,157, 59,119,134, 70,163,193, +153, 51,103, 36, 33, 33, 33,199, 8, 33,171, 0,172, 43, 63,119,101, 29,153, 77, 41,237, 90, 46,146, 87,237,249, 49, 24, 12, 73, +147, 39, 79,182,170, 38,130,149, 86,215,132,176, 44,187,230,200,145, 35, 67,116, 58, 29,198,142, 29,123,199,215,215,151,179,179, +179,195,214,173, 91,225,224,224, 0,141, 70, 19,189, 98,197, 10, 46, 33, 33, 1, 63,252,240,195,118, 0, 53, 78, 40,238,238,238, +222,215,215,215,247,192,222,189,123,165, 0, 16, 31, 31,143,164,164, 36,252,254,251,239,120,243,205, 55, 49,124,248,112, 81, 80, + 80,144,211,148, 41, 83,142,186,187,187, 15, 75, 73, 73,249,221,156,180,218,219,219, 27,103,205,154,197,202,100,178,103, 34,225, +199,142, 29, 35,223,126,251,173,221,234,213,171,109, 7, 14, 28, 56,107,195,134, 13, 65, 30, 30, 30, 11,147,147,147,147,133, 34, + 68, 64, 64,160, 46, 6, 11,214,214,214, 8, 15, 15, 7, 33, 4, 54, 54, 54,176,181,181,133,157,157, 29,242,242,242, 16, 19, 19, +131,187,119,239,226,209,163, 71, 96, 24, 6, 13, 27, 54,132, 41,106,100,162,178, 30, 6,166,130, 58, 33, 33, 1,169,169,169, 96, + 24, 6, 23, 47, 94, 68,255,254,253,159, 49, 87, 34,145,168,210, 52, 85,212, 60,127,254,188, 97,250, 24,247, 43,122,109,129,179, +209,160,189,116,158,210,247, 20, 10,197,117,103,103,231,250,237,218,181, 51,154, 10,139,234,218,101, 85,212, 20,137, 68,203, 39, + 77,154,244,198,235,175,191,206,152, 12,145, 41, 2,164,209,104,202, 38, 22, 46, 46, 46, 22,237,223,191,127,248,177, 99,199,100, + 0, 6, 84,151, 78,163,209,136, 91,183,110,225,230,205,155, 96, 24, 6, 14, 14, 14,176,181,181,133, 84, 42,133, 84, 42,133, 68, + 34,129, 76, 38,131,133,133, 5, 24,134,129,209,104,204,233,215,175, 31, 31, 23, 23, 39,123,252,248,177,166,170,227, 89,154,222, +146, 57,247, 76,251,199,113, 96, 57,174,236,100,112, 28, 7,142,227,158,169, 54,171, 42,157, 10,133,194, 86, 36, 18,237, 90,185, +114,165, 52, 61, 61, 29,209,209,209,104,219,182, 45,230,206,157,139,194,194, 66,172, 88,177, 2, 15, 30, 60,128,139,139, 11,230, +204,153, 35,157, 49, 99,198, 46,133, 66,225,171, 84, 42,243,170, 59,239, 12,195, 96,203,150, 45,101,115, 7, 2,128, 70,163,129, +133,133,197,179,233,225, 41,230,207,159,255, 23, 35, 88,201,241,116,119,117,117,197,249,243,231, 97,105,105,137, 11, 23, 46,148, +253,183,176,176,192,197,139, 23, 97,105,105,137,139, 23, 47, 66, 38,147,129,231,121,251,138,145,187,114,154, 4, 37, 13,218,113, +227,198, 13,164,116,232,128, 34, 0, 54,135, 15,195,214,219, 27,112,118,134, 19,128,194,204,204,178,115, 84, 85, 36,171, 22,221, +147, 75, 76,229,164, 73,152, 49, 99, 6,206,156, 57, 35,250,227,143, 63,102, 14, 31, 62,188, 11,128,142, 53, 93, 71, 21,180,218, +185,184,184,108,107,214,172, 89, 91, 0,232,218,181,107,141,219, 47,175,121,227,198,141, 32, 0,216, 50,137,124,238,226,211,245, + 11,213,253, 63, 56, 74,249,242,171,187,172, 31, 87, 50,165, 21, 97, 96, 16,179, 88, 58,118, 61,157, 91, 83, 94, 42,253, 76, 18, + 27, 27, 11, 27, 27, 27,108,218,180,137,115,116,116,132, 82,169, 4,199,113, 24, 61,122, 52,218,180,105,195, 73,165, 82,156, 63, +127, 30, 5, 5, 5, 53,230, 79, 95, 95, 95, 91,137, 68,178,107,207,158, 61,210,217,179,103, 35, 32, 32, 0, 77,155, 54, 5, 33, + 4,195,134, 13, 3,165, 20, 57, 57, 57,112,118,118,198,242,229,203,165,227,199,143,223,229,235,235,235, 27, 31, 31,159, 87,195, +241,164, 26,141,134, 90, 90, 90,150, 61,244, 88, 88, 88, 64, 44, 22, 35, 55, 55,151,206,156, 57, 51,151,101, 89,118,200,144, 33, +141, 62,248,224, 3,102,193,130, 5,193, 0,182,215,246,188,215, 6, 65, 83,208,252,175,105,214, 64,123, 0,229,219,198,106, 1, +152, 2, 32,153,165,247,241,122, 21, 62, 7, 74,154, 97,160,220,111, 43, 46,103, 2,136, 1,208,162,244, 51, 35, 74,166, 87,203, +126, 33, 6,139,144, 63,231, 3,164,148,146, 74, 14, 36,242,242,242,144,151,151,135, 39, 79,158, 96,253,250,245,101, 70,136,227, + 56, 48, 12,131,210,185,229,204, 66, 36, 18,225,201,147, 39,104,215,174, 29, 92, 92, 92,176,125,251,118,132,132,132,148,233,149, + 55, 4,230, 76,214,251, 74,143,145, 45,134,180,136,179,157,188,228, 52, 5, 74,218,101,253,246,219,111,245,238,221,187, 87, 22, +117,144, 74,165,176,180,180,132, 72, 36,170,177, 93, 22,207,243, 67, 71,140, 24,193,156, 62,125, 26, 6,131, 1, 28,199, 65, 44, + 22, 67, 44, 22, 63,243, 94, 44, 22, 35, 36, 36,132, 57,112,224, 64,239,238,221,187,115,149, 69, 71, 40,165,148, 16,194, 19, 66, +160, 80, 40,144,153,153, 9,177, 88, 12, 27, 27, 27,216,217,217, 65, 42,149,150, 85,201, 88, 89, 89,193,210,210, 18,110,110,110, +152, 48, 97, 2, 62,255,252,115,179, 34, 89,205,186,119, 47,139, 92,177, 82, 41,220,253,253,203, 34, 87,156, 76, 6, 75,111,111, + 64,167, 3, 85,171,107,206, 16, 28,247,233,216,177, 99,109, 45, 44, 44,112,235,214, 45, 88, 88, 88,160,176,176, 16,131, 7, 15, + 70, 65, 65, 1, 12, 6, 3, 44, 44, 44,160,209,104,224,230,230,134,224,224, 96,235, 83,167, 78,125, 10,224,243,154, 34, 88,227, +198,141,195,218,181,107,241,221,230, 95,241,209,251,175,255,101,157,117, 59, 14,130, 16,130, 47,191,252, 18,231,207,159,175, 49, +173,189,123,247,198,197,139, 23, 33,151,203,145,149,149, 5, 79, 79, 79,228,228,228,160, 65,131, 6,200,201,201,129,143,143, 15, +242,242,242,208,173, 91, 55,156, 56,113,162,218,123, 69,233, 69,133, 86,173, 90,193,136,146,238,157,182,222,222,168, 87,175, 30, + 44, 80,210,237,211,194,194, 2, 50,153,236,133, 68,178, 74,163,102, 72, 73, 73, 65,247,238,221,227, 39, 76,152,224,235,239,239, + 15,134, 97, 36,181,212,241,107,222,188,249,249,179,103,207,218,184,186,186,194, 96, 48, 64,175,215,163,160,160, 0,111,188,241, + 6, 0,236, 53, 91,140,199,180,129,211, 67, 57, 68, 14, 6,120, 93, 85, 7,138,219,182,227,220,199, 0,204,218,113,150,101,167, +205,154, 53,107,192,160, 65,131, 56, 91, 91, 91,136, 68,162,178,234, 71,177, 88,140,199,143, 31, 67,175,215, 99,223,190,125,148, + 97,152,143,106,210,211,235,245,159,206,153, 51,199, 86, 36, 18,161, 89,179,102,248,248,227,143,241,243,207, 63, 67, 46,151, 67, + 34,145,192,201, 42, 21,132,112,208, 24,101,104,220,184, 49, 6, 14, 28,104,125,240,224,193, 26,243, 39,128,155, 90,173, 54,192, +116, 61,154,140, 22, 0,168, 84,170,219,151, 46, 93,106,227,234,234,218,178, 89,179,102,219,187,117,235,214,214,201,201,169, 3, + 33,100,135,208,179, 84, 64,224,249,169,201,131,152, 12, 17, 33,228,104,185,245, 6,154,150,103,207,158,253,217,226,197,139,111, + 19, 66,142,150,255,220,180, 94,233, 54,142, 86,182, 92,250,219,122,115,230,204,105,189,100,201,146, 69,157, 58,117,218,115,229, +202,149,248, 23,102,176, 74, 60, 0,161,213,236, 88,165, 79,223,229, 49,199, 96,153,170, 28, 52, 26, 13, 50, 50, 50,208,167, 79, + 31, 88, 90, 90,130, 97, 24, 36, 37, 37,161,113,227,198,224, 56, 14, 55,110,220,192, 23, 95,124,129,150, 45, 91, 66,167,211,213, +152,166,223,143,110, 44,190, 18,202, 23,243, 70,154, 6, 0,169,169,169,116,241,226,197,249,167, 79,159,214, 86, 40,207, 64, 41, + 37, 53,181,203,162,148,114, 28,199,149, 69, 91,202,247,114,235,209,163, 7, 46, 93,186, 84,246, 89,105, 52,131, 65,245,237,154, +104,169,113,131,139,139, 11, 36, 18, 9,202,223,200, 77, 5,142, 41, 58, 98,250,174, 22,185,179,228,100,178, 44, 56,145,232, 47, +145, 43, 16,243,155, 10,177, 44,219,171, 75,151, 46, 92, 92, 92, 92, 89,186,116, 58, 29,186,117,235, 6,134, 97,144,152,152, 88, +246, 57,165, 20,126,126,126,226, 75,151, 46,245,170,169, 0, 99, 24, 6,235,215,175,135, 94,175, 7, 0,252,176,237, 0, 62, 28, + 59, 12, 26,141,166,108,217,180,222,220,185,115,205, 50,214,109,219,182, 69,126,126,126,217, 57,226, 56,174,210,255,142,142,142, +168,174, 28, 44, 53,193, 6, 83, 62,182,141,137,129,139,139, 11,224,228, 4, 9, 0,169,193,128,140,140, 12, 56,149, 26, 44,139, +114,255,159,227,134, 66, 76, 15, 47, 25, 25, 25,109, 22, 46, 92,248, 10,128,250, 0, 78,215, 66,195,213,100,174, 40,165, 24, 48, + 96, 0, 62,254,248, 99,180,111,223, 30,249,249,249,152, 62,125, 58,114,114,114,214,182,105,211,102,213,173, 91,183,102, 80, 74, +191,175, 86,144,193,202,163, 43,130, 43,139, 96,253,185,205,146, 8,214,106,115,210,103,106,208,222,166, 77, 27, 76,156, 56, 17, +251,247,239,199,246,237,219, 97, 52,150, 52,233, 26, 58,116, 40,134, 12, 25,130,140,140, 12,184,186,186,146,228,228,228,123,254, +254,254,213, 54,124,183,176,176,232,213,185,115,103, 46, 33, 33, 1,157, 58,117,194,248,241,227, 49,110,220, 56, 28, 62,124, 24, + 94,110,128,242,240, 72,180, 9,222, 4,177,149, 24,132, 16,116,238,220, 89,124,234,212, 41,115,242,231, 71,189,122,245, 90,142, +146, 94,132,229, 47,152, 59, 0,102, 0, 64, 90, 90, 90, 76, 72, 72,200,163, 94,189,122, 41, 26, 54,108,232, 28, 29, 29,205, 1, +208, 11,197,163,128,192,115, 71,195,204,246, 32, 38,131, 84,209,104, 45, 94,188,120, 96,197,207,202,155,169,202,222,151,255,237, +146, 37, 75, 22,149,211, 46,122, 17,251,245,194,198,193, 50, 21,156, 53,161,209,104, 16, 21, 21,133,198,141, 27,195,210,210, 18, + 28,199,193,207,207, 15, 74,165, 18,205,155, 55, 7,165, 20,159,125,246, 25,230,207,159,143,189,123,247,226,246,237,219,156,139, +139, 75,181,154, 27,247, 23,184,151, 95,182,177,177,113,223,187,119,239,115,181,203, 34,132,148, 21,208,131, 6, 13,194,241,227, +199, 33, 18,137,202,170, 56, 21, 10, 69, 89,117,159, 25, 25,130, 14, 28, 56,176,172, 61, 91,197,134,196, 18,137, 4, 12,195,148, + 53,118, 47,255,244, 92, 83, 67,111, 0, 72, 10, 15, 7,203,178,101,145,171,252,123,247, 32,178,178, 42,139, 92,113, 25, 25, 16, + 89, 91,131,152, 97, 8, 12, 6, 67, 43, 15, 15, 15,196,197,197,149,165,209,203,203, 11, 83,166, 76, 65, 81, 81, 17,182,108,217, +130,156,156, 28, 72, 36, 18,136, 68, 34, 52,106,212, 8, 26,141,166,149, 25,198, 13, 19, 39, 78,196,182,109,219,176,110,249, 23, + 96, 89, 22, 27, 86,206, 7,195, 48,207, 12,207,192, 48, 12, 22, 45, 90,132, 30, 61,122,152, 29, 13,221,185,115, 39, 76,109,135, + 76, 26,166,215,148, 41, 83,202,122, 0,214,112,142,248,144,144, 16, 80, 74,203,162,139,134, 82,231,108,170,174,100, 89,182,204, +252,154, 34, 89,207,243,208,102, 50, 88, 0,116,148,210, 83,117,208,232, 63,123,246,108, 27,158,231,209,163, 71, 15,140, 29, 59, + 22, 1, 1, 1, 88,179,102, 13, 46, 95,190,140,205,155, 55,227,231,159,127,134,193, 96, 16,247,237,219,119, 6,128,106, 13,214, +184,245,116, 33,128,133, 21, 76,236,149, 14, 29, 58, 52,139,138,138,210,241, 60,111,122, 72,122,111, 99, 96,224,123, 60,207, 87, +219,187,208,212,160,221,193,193, 1, 17, 17, 17,144, 72, 36, 32,132,192,218,218,218,242,252,249,243,154,181,107,215,234,165, 82, + 41, 39,145, 72,240,197, 23, 95, 64, 34,145, 96,220,184,113,189,186,119,239,110, 81, 85, 7, 15,157, 78,215, 74,165, 82,225,248, +241,227, 24, 56,112, 32,222,127,255,125, 60,121,242, 4,163, 70,189,133,197, 83,197,104,237, 63, 22, 98,251, 46,101, 15, 24, 45, + 90,180,128, 90,173,174, 49,127, 38, 37, 37,133, 3,232, 34, 20,117, 2, 2,255,250,104,215,209,138, 38,235,121,180,102,207,158, +253, 25, 0, 58,123,246,236,207, 76,203,139, 23, 47, 46, 6,240,220, 29, 89, 94,152,193, 50, 39,130,213,165, 75, 23,233,186,117, +235,224,238,238, 14, 63, 63,191,178,182, 86,166, 66, 97,236,216,177, 56,113,226, 4, 90,180,104,129,126,253,250,161,107,215,174, +104,221,186,230, 81,250,103,140,245,140,208,107,242, 28,244, 90,205,181,181, 7,116,163,242,243,243,195, 27, 53,106, 36, 79, 76, + 76, 52,228,231,231,195,223,223,191,204, 52,181,111,223, 30, 44,203, 94,187,118,237,218,240, 26, 15, 14,199,225,181,215, 94,195, +111,191,253,134,161, 67,135,226,212,169,146, 50,176,125,251,246,184,115,231, 14,100, 50, 89,149,109,197, 42, 51,108, 70,163, 17, +150,150,150, 16,139,197,101,141,220, 37,146, 63,107,132, 42, 70,176,136, 25,145,167,242, 70,176,170,200, 85,217,178,249,153, 14, + 98,177, 24, 12,195,148, 85,229, 20, 20, 20, 32, 55, 55,183, 44,237,166,151,185, 85,195, 44,203, 98,205,154, 53,208,235,245,152, +252,233, 87, 96, 89, 14,147,198, 12, 1,203,150, 24,212,245, 63, 30,130,209,104,196,175,219,191,195,236,217,179,205, 50,174,166, +125, 27, 55,110, 92, 89,196,170,178, 40, 86,109,113,173, 95, 31, 20,128, 69,169, 41,211, 19,130,122, 37, 33,200, 23, 25,193, 66, + 57,131, 85,215,106,166,131, 51,103,206,156,160,215,235, 91,182,111,223, 94, 58,126,252,120, 60,121,242, 4,171, 86,173, 82,103, +101,101,125,215,187,119,239, 9,214,214,214,246,133,133,133, 5,143, 30, 61, 90, 92,167, 27, 68,105, 15,195,155, 55,111,150,153, +127, 83,117,251,128, 1, 3,106,236, 93,104, 52, 26,177,105,211,166,178,170,193,202,242, 69,249, 60,101, 14, 45, 91,182,132,149, +149, 21, 40,165,208,235,245,248,246,219,111,241,250,240,190, 56,254, 7, 69,239, 49, 51,193,243, 4, 34,145, 8,219,182,109,131, +175,175,111,141,122, 85,140,129, 37,140,127, 37, 32,240,239,140,118, 13,124,145, 90,166, 8,214,226,197,139,111, 47, 94,188,248, + 47,209,176,191,213, 96,177, 44, 91, 22,210,175,170,160, 48,183, 13,214, 31,127,252, 81,124,246,236, 89,155,164,164,164, 50, 99, +192,113, 28, 26, 54,108, 8, 66, 8, 78,156, 56,129, 93,187,118, 97,222,188,121,224, 56, 14,182,182,182,240,247,247,215,215,212, + 89,167, 83,215,215, 27,149,182,193, 50,150,222, 48, 61,247,238,221, 91, 93, 27, 44, 63,115, 34,109, 34,145, 8, 71,143, 30, 69, +159, 62,125,112,254,252,121, 72,165, 82, 0, 64, 76, 76, 12,218,181,107,135,123,247,238,153,109,176, 74,202,103,254, 25, 99,101, +234,173, 86,222, 96,177, 44, 91,214,200,214, 92, 76,189, 5,243,239,221, 3, 39,147, 65,234,227, 83, 22,185,226,172,172,160,177, +183,135, 70,171,133,157, 25,109,176,196, 98,113, 76,106,106,106,160,139,139, 11,178,178,178, 32,145, 72,158, 49, 41, 28,199, 61, + 19,125,187,117,235, 22, 44, 45, 45, 99,106,210, 53, 69,147,126,249,229, 23, 0,192,164, 49, 67, 32,147, 73,161,213,106,161, 86, +171, 49,105,204, 96,172,255,241, 16, 24,134,193,226,197,139,209,183,111,223,106,243, 93,249, 8,214,182,109,219,192,243,252, 51, +145, 43, 83,190,252,228,147, 79,192, 48, 12,234,210, 84, 38, 53, 53, 21, 64, 73,171,201,138,231,168,214,213,184,127, 94, 47, 34, + 0,190, 93,186,116, 33,229, 30, 76,248, 90,106,124,208,178,101,203,217,150,150,150,137,105,105,105, 63,187,185,185, 77,251,238, +187,239,188, 18, 18, 18, 96,107,107,139, 19, 39, 78, 88, 78,157, 58,245,163,176,176,176, 97,148,210,147,207,249,224,148, 52,121, +242,100,171,168,168,168,191,244, 48,228,121,190,166,222,133,191,247,235,215,111,144,173,173, 45,198,142, 29, 11,177, 88,140,161, + 67,135,194,206,206, 78,189,105,211, 38, 4, 4, 4,128,101, 89, 72, 36, 18,204,159, 63, 31, 9, 9, 9, 32,132,252, 94,221,240, + 36, 18,137, 36, 38, 33, 33, 33,208,202,202, 10, 90,173,182,236,250, 59,118,226, 34, 88, 78, 84,102,174,196, 98, 49,166, 76,153, +130,139, 23, 47, 66, 42,149,198,212,144, 55, 87,108,217,178,165,149,139,139, 11, 84, 42, 21,178,178,178,144,159,159,223,124,221, +186,117,223, 3,164, 5,190, 4,193,124, 80,185,220,189,241,164, 73,147,234,243, 60,207, 63,122,244,232, 41,106, 24,234, 68, 64, + 64,224,239,137, 96,149, 55, 90,229,162, 80, 85,145, 81,190, 93, 86, 85, 6,173,124,155, 44,152, 57, 22,165,217, 6,171,146,186, +207,123, 55,110,220,104,210,170, 85, 43, 36, 38, 38, 34, 39, 39,167, 82, 1, 43, 43, 43, 72,165, 82,220,191,127, 31, 0,238,213, +224, 22,193, 48, 76,217, 77,177,124,143,193,207, 62,251, 12,179,103,207, 70,112,112, 48,130,130,130,106,181, 19,191, 31, 89,159, +247,199, 41, 90,200,243, 52,169,180, 96,228, 23, 46, 92, 88,112,234,212, 41,173,169,221,151,169,144, 47,125,170, 78,169,225, 4, + 26,242,243,243, 57, 83,149,198,229,203,151, 33, 18,137, 32, 18,137, 16, 19, 19, 3,145, 72,132,199,143, 31, 67, 44, 22, 67,167, +211,153, 10, 72,131, 25, 25,163,172,205, 85,101,198, 76, 38,147,149,173, 99, 42,188,205,169, 34,124, 81,145, 43, 0,208,233,116, +103,174, 95,191,238, 31, 28, 28,204, 21, 22, 22,254,197, 96,153, 10, 68,147, 81,188,118,237,154,182,184,184,184,198,167,124,150, +101,177,106,213, 42,232,245,122, 76,121,175,100,152, 6, 83,251, 43,211, 88, 88,147,198, 12,198,193, 93,107, 49, 99,198, 12,179, +162,119,166,125,156, 56,113, 98,165,145, 43,211,123,115,134,166, 40,159, 78, 77,126, 62, 36, 18, 9, 92, 77,231,136,231,159, 57, + 71,229,163,141,181,188, 49, 12,112,118,118,254,238,141, 55,222,240, 9, 10, 10, 66, 78, 78, 14,212, 37,166,183, 86,227,105,249, +248,248,204,141,138,138,114,203,206,206,246, 56,122,244,104,144,139,139, 11, 44, 44, 44, 48,100,200,144, 34,158,231,153,239,190, +251,206,114,195,134, 13,150, 51,103,206,220, 12,192,163, 38, 61,211, 64,163, 21,170, 1,193,243,188,234,230,205,155,117, 30, 96, + 84,169, 84, 14, 14, 12, 12,244, 54, 26,141,247,219,182,109,203, 37, 36, 36, 96,224,192,129,144, 74,165,101,231,165,176,176, 16, + 90,173, 22, 42,149,138,178, 44,219, 52, 44, 44,172,218, 25, 34,180, 90,237,153, 75,151, 46,249,189,249,230,155,162,220,220,220, +178,235, 18,164,196, 88,155,134,123, 49,253, 63,119,238,156, 57,249,179,133,167,167, 39,230,207,159,143,122,245,234,193,197,197, + 5,190,190,190,112,115,115,109,250,214, 91,126, 57, 69, 69, 69, 90, 62,196,120,249,131,201, 29, 61,186,118,235,214, 38, 38, 38, + 38, 62, 61, 61,253,186,208,192, 93, 64,224,133, 70,166,106,186, 15,102, 84, 48, 71,218,114,203, 25, 40,153, 91,121, 96,233,123, +148,123, 31, 14,160,125,133,117, 77,223,107, 43,252, 55,125,127,227,239,142, 96,189,250,254,251,239,111,232,221,187,119,175,233, +211,167,195,218,218, 26, 41, 41, 41,101,145, 42,137, 68,130,250,245,235,163,184,184, 24, 23, 47, 94, 68, 78, 78,206, 89, 0, 19, +106,218,160, 94,175, 55, 77,131,242, 76,143, 65, 95, 95, 95, 28, 58,116,232, 47,134,192,156, 40,198,198, 3, 69, 94,229,151, 35, + 35, 35, 93, 0,224,171,175,190,170,219, 65,225,184,223,246,237,219,247,122,223,190,125, 25, 83, 4,207,116, 47, 45, 63,148,132, + 70,163,193,206,157, 59,169, 84, 42, 61, 93,211,200,232, 28,199,233, 71,142, 28, 41, 50,181, 11,145,201,100,101,145, 53, 83,116, +205,193,193, 1,132,144,178, 2,200, 28,244,122, 61,242,239,223, 47, 59,142, 34,145, 8,108, 70,198, 51,189, 60, 77,145, 43,115, + 76,139,209,104, 92,182,126,253,250,137,254,254,254,142,238,238,238, 40, 42, 42, 2, 33, 4,206,206,206,207, 52,236,151, 72, 36, +184,123,247, 46, 78,157, 58, 85,168,215,235,151,153, 19,193,250,228,147, 79,112,232,208,161,103,170,255, 76,230,202,100, 86, 40, +165, 88,182,108, 25, 6, 12, 24, 80, 99, 84,212,148,135, 54,109,218, 84,102,222,203, 71,175, 24,134,193,204,153, 51,107,101, 50, + 71,142, 28, 89, 82,226,182,104, 81,214, 22,174,252,171, 94,189,122,207, 68,178,106, 97,174,250, 15, 30, 60,248,232,230,205,155, +225,232,232,136,194,194, 66, 60,124,248,208,148,175,234, 1, 72, 55, 87,235,209,163, 71,107, 66, 66, 66,190, 25, 60,120, 48, 9, + 14, 14,134, 84, 42,197,188,121,243,112,231,206,157,247, 1,220, 60,124,248,240,221,241,227,199,195,199,199, 71,110,102,126,247, + 92,183,110,157,253,189,123,247,158,169,254, 29, 60,120,176,241,121,111, 48, 70,163,113,229,178,101,203, 56,153, 76, 6,181, 90, +141,244,244,244,103,182, 81, 84, 84, 4, 55, 55, 55,124,248,225,135,100,245,234,213,223,161,134,113,176, 88,150, 93,182,121,243, +230,137, 93,186,116,113,116,117,117, 5,207,243,207, 24,170,242,239,111,220,184,129,195,135, 15, 23, 18, 66,106,202,159,196,221, +221,157,159, 59,119, 46, 99, 99, 99, 83, 54, 36,205,129, 3, 7,200,242,229, 43,108,191,251,238, 59,188,246,218,240,161, 60,207, +243,119,238,220,141, 95,191,126,253,101,158,231,207, 10, 69,162,128,192, 63, 74,248,255,232,183, 47,222, 96, 41,149,202,120, 0, +193, 10,133,226,173, 11, 23, 46,172,156, 62,125,186,115,231,206,157,145,149,149,133, 6, 13, 26,192,221,221, 29, 17, 17, 17,184, +113,227, 70, 38,165,116,122, 68, 68,196, 79,149, 20, 42,127,153,109,251, 94,204, 89,252,252,235, 89, 20, 22,105,254,210, 32,185, + 98, 21,207,160, 65,131,254, 98, 10, 42,211,172,216, 6,203,223,223, 63,170,126,253,250,242,196,196, 68, 67,249, 8,150,233,125, +197, 54, 88, 21, 53,213,106,245,167,123,247,238, 21,253,244,211, 79,131,120,158, 23, 85,115,179, 55, 88, 90, 90,158, 84,171,213, + 31,213,180,239, 7, 15, 30, 20, 3,192,160, 65,131,232,251,239,191, 15,123,123,251, 42, 35, 89,166,246, 87,230,236,251,189,219, +167,177,110,203, 49,240, 60,173,246,120, 50, 12,131, 97,195,134,161,166,116, 42,149,202, 60,127,127,255,119,102,206,156,249,235, +151, 95,126, 41,117,118,118,134,193, 96,192,154, 53,107,192,243,124, 89, 53,231,221,187,119, 49,125,250,244, 34,181, 90,253, 78, +100,100,100, 94, 77,233,100, 89, 22, 75,151, 46,133,193, 96,192,119,155,247,226,163,247, 71,148, 13, 52,106,105,105, 9,181, 90, +141,109,191,156, 0,195, 48,152, 62,125,250, 95,204, 75,101,154, 58,157, 14, 34,145, 8, 83,167, 78,173,182, 23, 97, 85, 6,171, +162,166,105, 60,171,144,144, 16, 58,125,250,244, 50, 19, 80, 85,180,209, 28,205,114,140,253,225,135, 31,224,232,232,136,167, 79, +159,226,225,195,135, 8, 15, 15,199,205,155, 55, 99, 41,165,233, 53,152,179,103, 52, 41,165,139, 9, 33, 63,254,254,251,239,195, + 44, 44, 44, 94,119,113,113,241, 76, 76, 76,220, 69, 41,221, 3,148,140,173,165,215,235,107,170,218, 47,211, 44, 95, 13, 88, 33, +130, 85,171, 1, 70, 43,219,119, 66,136,246,240,225,195,176,182,182,198,193,131, 7, 13,142,142,142,220,151, 95,126, 9,137, 68, +130, 5, 11, 22, 32, 49, 49,209, 48,110,220, 56,142,231,121, 80, 74,181, 53,105,198,199,199,231,121,120,120,188,243,225,135, 31, +254,242,221,119,223,201, 76,205, 11,182,111,223,142,137, 19, 39, 62, 99,174,198,142, 29, 91,164, 86,171,223, 73, 78, 78,174, 41, +127, 82,163,209, 72,203, 87,125,139,197, 98,228,231,231,209, 57,115,102,231, 23, 20, 20,106,151, 44, 89,114, 45, 33,225,113,182, + 74,149, 26,198,243,252,233,180,180,180, 4, 51,207,251,243, 84,133, 8,154,130,230,127, 74,243,101,163,198, 71,123,165, 82,249, +179, 66,161, 56,177,120,241,226, 37, 7, 15, 30,124,127,234,212,169,196,214,214, 22,123,247,238,165, 89, 89, 89,219, 37, 18,201, +140,171, 87,175,154, 53, 94, 4,199,113,177, 77, 93, 98, 2, 67, 6,244,128,214, 96, 89,118, 35, 47, 63, 65,115,249,151,193, 96, +128, 70,163,225,181, 90,109, 65,117,186, 47,186, 13, 86, 84, 84, 84, 10,128,215,254,142, 3, 46, 18,137,244, 31,126,248,161, 72, + 36, 18,161,109,219,182,101, 85,134,166,129, 13, 37, 18, 9,236,236,236,202,204, 85,117, 85,132, 98,177, 56,161,133, 91, 84,195, + 33,131, 67, 0,194,213,120, 60,213,106, 53, 24,134,201,119,114,114,170,182,203,103,100,100,228,177,128,128,128,225, 83,166, 76, +217, 53,112,224, 64,171,246,237,219,139, 27, 52,104, 0,142,227,144,152,152,136, 75,151, 46,105, 79,158, 60, 89,164,213,106, 71, + 69, 70, 70,154,213,198,135, 97, 24,204,152, 49, 3, 12,195,160,105, 67, 47,156,186, 16, 94, 86, 69, 8, 0,135, 79,253, 1, 55, +151,122,104,217,170, 21,150,126,251, 45,134, 12, 25, 82,163,166,193, 96,128,155,155, 27, 74, 11,103,148,111, 35, 84,222, 96,213, + 38,210, 84,230,134,198,142, 53, 43,146, 85, 11, 44,119,239,222,141,193,131, 7,227,214,173, 91,248,237,183,223,112,224,192,129, + 7,122,189,126,100, 29,195,233, 41, 0,214,148,190,158, 33, 53, 53,181, 72,167,211,201, 82, 82, 82,204,234,218,107, 26,104,180, + 50,202, 87, 31,154,142,111, 77,189, 7, 43, 68,176,166,252,254,251,239, 98,148, 78,149,147,145,145,113, 75, 44, 22, 75, 36, 18, + 9,146,147,147, 97, 48, 24,218,108,220,184,113, 57, 33, 68,199, 48,204, 68,115, 52,147,147,147,143,185,185,185,189,246,238,187, +239,238, 26, 54,108,152,172, 91,183,110,146,166, 77,155, 34, 63, 63, 31, 81, 81, 81, 56,117,234,148,246,208,161, 67, 69,133,133, +133,163, 82, 83, 83,205,201,159,119,180, 90,109, 59, 71, 71, 71,136, 68,162,178,104,106,114,178, 42,246,194,133, 75, 45,241, 37, +200,151, 0,246,237,163,188, 80,100, 8, 8, 8,152,109, 66,107,211,140, 64,161, 80,116, 42,237, 34, 41,226,121,126, 64, 84, 84, +212,165,218, 56, 92,133, 66, 97, 43,149, 74, 47, 21, 23, 23,183, 54,103,123, 18,137, 36, 91,171,213, 6, 43,149,202,168,234, 92, +243,132, 97,178, 68,153,132,178,197, 26,253,189, 13, 7,245, 61,253,253,253,211, 95,125,245, 85,203,170,218, 96,233,116,186,123, + 17, 17, 17,175,252, 47,221,253,192,129, 3,233,154, 53,107,224,232,232, 88,101,148,100,240,224,193,112,112,112,176,223,190,125, +123,110,101,154,237,219,183,119,149, 72, 36, 87,212,106,181,143, 89, 37,188,165,165,170,184,184,184, 91,100,100,228, 67,115,210, +217,169, 83, 39, 7, 74,233,116, 11, 11,139, 96,141, 70,211, 18, 0,164, 82,105, 76,113,113,113, 40, 33,100, 69, 85,198,186, 50, +205,182,109,219,242, 44,203,146,242, 67, 50, 84,246,191,252,251,252,252,124,235,243,231,207, 23, 86,166, 25, 20, 20,148,168,213, +106,205,158,232, 90, 34,145,100,138,197,226,103, 38,185,174,233, 28,133,132,132,208,109,219,182, 85, 27,201, 26, 52,104,208, 51, + 35,185, 87,167, 73, 8,249, 0,192, 64, 0, 41, 0,148, 0, 54, 83, 74,245,207,155,151, 42, 89,127,114,211,166, 77, 63,139,139, +139, 91, 90,213,216, 87,230,106, 6, 4, 4, 60, 9, 15, 15,247,124,244,232, 81, 89, 15,215,144,144,144,148, 63,254,248, 67, 94, + 23, 77,133, 66,113, 8,192,160,210,245,127,143,136,136,232, 87,215,125,247,244,244,116, 96, 89,118,186, 76, 38, 11, 46, 46, 46, +110, 89, 26, 89,140, 41, 46, 46, 14,213,235,245, 43,146,146,146,204,202,159, 47,162, 23,161, 16,201, 16, 52, 5, 77,129,231, 50, + 88, 66, 70,121,113,154, 3, 6, 12,208, 49, 12, 83,109, 23, 68,177, 88,204, 91, 91, 91,203, 76,147, 20,255, 47,247,189,220,192, +152,244,191,114,142, 76, 83,225,212,160,129,195,135, 15,147,151, 53,207,215, 38,130, 37,228, 79, 65, 83,208, 20, 52, 5,254,132, + 19, 14,193,255,134, 99,199,142,137,255, 63,165,247,191,216, 99,170,124,100,234,191, 74,117,213,135, 66,254, 20, 16, 16, 16,168, + 26, 70, 56, 4, 2, 2, 2, 2, 2, 2, 2, 2, 47, 22, 2,160,117, 21, 79,132,181,105,243,209,186,182, 27,174, 73, 95,208, 20, + 52, 5, 77, 65, 83,208, 20, 52, 5,205,151, 79,179, 38,237,151,165,234, 81,104,131, 37,104, 10,154,130,166,160, 41,104, 10,154, +130,230,255, 92,243,101, 67,168, 34, 20, 16, 16, 16, 16, 16, 16, 16,120,193, 8,141,220,235,128, 92, 46,151, 2, 24,194,113,220, + 24, 71, 71,199,192,244,244,244, 5, 42,149,106,213,191, 33,109,193,193,193, 75,244,122,253,116, 66, 8, 39,145, 72, 12,182,182, +182, 43,126,253,245,215,217,207,177,175,205, 0,140, 33,132,188, 5, 0,148,210,221, 0,118,168, 84,170, 88, 33, 39, 8, 8, 8, + 8, 8, 8, 60,135,193, 34,132,176, 45, 90, 52,126,151, 16,116, 38,128, 35, 5,178, 40,197, 31,119,238,220,223, 78, 41,173,211, +116, 26,221,187,119,231,212,133,133,111,179, 12, 51,144, 2,109, 81, 50,131,222, 77,131,209,120, 76,106,109,189,163,166,169,103, + 0, 96,196,136, 17,108, 82, 82, 82,162,209,104,116,169,213, 78,115, 92,202,213,171, 87,189,234,104, 56, 70,120,120,120,108,235, +216,177,163,172, 93,187,118,144, 72, 36, 88,186,116,233,116, 0,102, 27, 44,210,189, 59,231,146,227,248, 54, 43, 18,133, 80, 74, +219,130, 2, 32,236, 77, 94,175, 59,150,238,240,116, 7, 53, 99,223, 77,180,118, 35, 93,197, 34,188,107,164,216,203,186,248,223, +112,113,113,153,181,111,223, 62,216,217,217, 33, 47, 47,143,251,240,195, 15,103,117,232,208, 97,213,245,235,215,107,156,138,229, +251,153,226, 68,189, 94, 95, 58,182, 20, 87,184,122,191, 83,108,187,118,126, 1,159,126,250, 41, 58,117,234, 4,158,231,113,241, +226,197,153,171, 86,173,154, 41,151,203,195, 0,236, 0,240,139, 74,165,202,173,205, 49,108,223,190,125, 91, 0,179, 9, 33,129, + 60,207,123,112, 28,151, 12, 32, 76,167,211, 45,139,140,140,140,172,237, 57, 33,132,144, 14, 29,252, 94,179,177,193, 64, 2,248, +131,128, 48,160, 81, 89, 57,204,241,240,240,200, 95, 40,173,251, 0,145, 10,133,226, 24,128, 87, 75, 23,143, 43,149,202, 1, 47, +250, 34, 92, 63,142,204, 33, 64, 32, 0, 80, 32,108,210, 22,186,248,121,244,172, 92,155,181, 98, 37, 86, 51,169,209,240, 42, 97, + 68,167,141,154,226, 37,133, 25, 49, 55,255,151, 55,154, 78,157, 58, 89, 26, 12,134, 15, 88,160, 55, 5,218, 0, 0, 1,162,141, +192,105,142,227,214, 94,189,122, 85, 45,220,142, 5, 4, 4,254, 83, 6,139, 16,194,182,108,217,100,205,228,201, 83, 90, 13, 27, + 54,188,190, 84, 42,181, 72, 74, 74, 76,218,176,110,173, 3, 75,136, 31, 33,100, 74,109, 77, 86, 64, 64, 64, 75,142,144, 3, 19, +198,142,245,105, 31, 20,196,185,186,187,163, 56, 55, 23, 15, 99, 99,189,194,195,194,250, 30, 10, 13,157,233,231,231,247, 90, 84, + 84, 84,116,117, 58,153,153,153, 34, 17,207,187,158, 91,180,136,101, 28, 28, 64, 13, 6,168, 27, 53, 42, 25,213,219,104,132,197, +245,235,128, 94, 15,106, 52,162,184,107, 87, 0, 37,163,127,135,132,132,212,175,203,193,146,203,229,242,166, 77,155,254, 52,103, +206, 28,177, 70,163, 65, 84, 84, 20,174, 92,185,194,167,167,167, 47, 49, 87,195,181,205,208,150,110,156,219,190, 33, 67,250,123, + 15,232,237, 42,241,114,115, 6,165,150,136,141,215,121,157,186,168,236,119,252,228,169, 25, 46, 45,135,142, 72,143, 57, 24,109, +142,158, 88,132,215, 47, 79,195,152,110,223, 65,172,167,116,136,189,189,253, 51, 83, 3,217,219,219,131,231,249, 5,132,144, 15, +106, 50, 26, 6,163,193,253,163,119,198,131, 99, 89,172,218,190,217,234,230,205, 27, 1, 14, 14,206,207, 76,217,211,167, 79, 31, +244,238,221, 27,137,137,137,129, 7, 14, 28, 8,220,182,109,219,106,185, 92, 62, 87,165, 82,173, 48,199, 84, 23, 20, 20, 44,116, +116,116,252,104,202,148, 41,150, 13, 27, 54,132, 76, 38, 67,106,106,106,131,184,184, 56,175,159,126,250, 41, 36, 40, 40,104,141, + 88, 44,158,123,222, 76,147,169, 80, 40,124,251, 4,251,239, 27, 50,172, 91, 11, 55,183,150, 98,145,200, 9,148, 82,232,245, 89, + 77, 51,210,239,188,102,103,135,217,129,129,129,195,107,154, 68,184,156,158, 43,128, 13, 0,196, 0,166, 0,120,245,228,201,147, + 48, 26,141, 24, 48, 96,192,171, 10,133,194, 23,192, 26, 43, 43, 43, 90, 88, 88,248,158, 82,169, 76,123,222,139,144,101,217, 14, +227,103,125, 21, 2, 94,139, 13, 75,190,122, 46, 45,107,247,198,205, 26,120, 55,186,254,249,151,139, 45,155,248,122,145, 83,127, +220, 28,177, 97,213,215, 3,172,156, 91,190, 82, 91,147,229,239,239,239, 47,147,201,150,102,103,103, 15,138,137,137, 41,244,155, + 28,234, 2, 66,108, 64,161,137, 90,215, 43,169, 22, 38, 53, 80,204,178,251,151,207,124,207,189,121,155,182,140,133,179, 19, 72, + 66, 26,178,141,234,224, 43,209,119,186,175, 94,191,235, 35,133, 66, 49, 92,169, 84,134, 9,183,100, 1, 1,129,255,140,193,106, +209,162,241,187,147, 38, 78,110, 53, 97,194,164,246, 58,157,182, 48, 58, 58,236, 44, 75, 8,153,244,193,251, 54, 41,169, 79,234, + 25, 41,125, 23,192,150, 90,152,171, 38, 94, 30, 30, 23,151, 44, 89,226,224,232,236,140,212,212, 84, 60, 73, 74, 66,202,173,146, +182,114,189,123,247,150,180,107,211,166,209,202, 77,155,206, 41, 20,138,110, 74,165,242,118,117,122, 12,195,128, 88, 89, 33,217, +223, 31, 84, 36, 66,210,169, 83, 37,133,150,193, 0,121, 72, 8, 0,128,138, 68,200,185,114, 5, 44,203,162,126,253,250,207,115, +188, 58,117,238,220, 89, 76, 41,197,167,159,126,154, 87, 80, 80,176, 24,192,207, 42,149, 42,217,156, 31, 59,181, 25,212,196,213, +197,245,226,138,133,227, 29,252,154, 54, 1, 1,143, 39,233, 42, 0, 86,240,245,100,241,206, 48,127,241, 43, 10, 73,227, 21,107, +207,156,119,109, 61,184,107,218,173, 67,183,107,136, 4,165,241,182,141, 93,130,214, 62, 69, 30, 47,126,211,197,194, 66,223,168, + 81, 35,204,159, 63, 31, 28,199, 65, 44, 22,195,219,219, 27, 17, 17, 17, 99,219,181,107, 55, 49, 48, 48,176,216,104, 52,246, 81, + 42,149,151,205, 48,214,176,181,181,173,116,130,104, 66, 8, 26, 52,104,128,105,211,166,193,223,223, 95, 50,122,244,232, 37, 0, +106, 52, 88,133,133,133,223,116,236,216,241,163,133, 11, 23, 74,174, 95,191,142, 11, 23, 46,224,248,241,227,144,203,229,240,245, +245, 37,139, 22, 45,178, 92,189,122,245,135,143, 31, 63,102, 0,204,168, 73,207,207,207,207,171, 85, 43,231,171, 43,150,127,225, +124,228,232,109, 44, 95,190, 13, 15, 30, 60, 0, 0, 52,108,216, 16,111,141, 28, 33,250,121,215,134, 86,179,103,127,121, 69,161, + 80,116, 86, 42,149,113,102,156,166, 13,139, 23, 47, 30,100,109,109,141,217,179,103,199,249,250,250,194,214,214, 22, 27, 55,110, +132,131,131, 3,244,122,125,220,210,165, 75, 57,149, 74,133,239,191,255,126,107,185,232,214,243, 69,171,168, 26,200,251,218,220, +136, 29, 91,229, 67, 13, 35, 91, 48, 99,206, 2,105, 74,177, 13,126,216, 24, 7, 69, 35, 23,210,239,205, 15,164,191,108, 92, 50, + 27,192, 27,181,136, 50, 6, 88, 90, 90,158,213,104, 52, 50,169, 84,106, 5,160, 16, 32, 54,224,201,155,132,240,183,253, 38,135, +234,162,214, 5,215, 24, 21, 85, 40, 20,129,173,155,122,135,174,250,122,174, 53,147, 17,135, 66, 18,137,226,116, 61,176,252, 8, +136,157, 19,186,127, 58,133,107,235,223,206, 99,246,103,139, 67, 3, 2, 2,122, 69, 68, 68,132, 11,183,101, 1, 1,129,151,129, + 26, 27,185,179, 4, 93, 6, 13, 30,236,170,209,168, 11,138,138, 10,178,227,238, 70, 60, 62,121,114,107, 68,100,196,217,219, 61, +123,117, 42,230, 88,116,169,234,183, 21,123, 24,140, 24, 49,130, 21, 17,114,112,233,210,165, 14,172, 88, 12,189, 94,143, 6, 13, + 26, 64,173, 86, 35, 63, 59, 27,105,137,137,184,124,244, 40, 10,159, 62,197,212, 81,163, 28, 36, 44,187, 95,161, 80,136,170,211, + 44, 13, 75, 85,140, 8, 60, 51,255, 92,233, 4,207, 85,206, 73, 87,139,158, 16,143, 84, 42, 21,172,172,172,208,188,121,115,107, + 0,151,170, 50, 87,127,153,244,118,196, 8, 86, 44,182, 56,188,108,225,155, 14,156,232, 33,226, 18, 35,144,157,111,132,193,104, +143,167,185, 58,156,143, 56,142, 45,251,230, 35, 73, 21,134,247,223,106,100, 47,181, 50, 30, 37,138, 9,213,238, 59,207,243, 46, + 91,119,254,130,165, 27,246, 34,184,255, 96,244,234,213, 75, 20, 19, 19,131,240,240,112,132,135,135, 35, 50, 50, 18, 9, 9, 9, + 24, 59,118,172,248,171,175,190, 66,159, 62,125,164, 44,203,158,170, 74,147, 99,185,148,239,118,108,194,138,173,235, 33,146,216, +224,192,129, 67,200,202,202,194,246, 69,190, 88,241, 9,193,138, 79, 8, 54, 45,112, 67,118,246, 83, 92,187,118, 13,203,150, 45, + 67, 81, 81, 17,120,158,231,106, 58,158,254,254,254,254,182,182,182, 83, 23, 44, 88, 32,217,181,107, 23, 34, 34, 34,160,215,235, +225,228,228,132, 27, 55,110,224,215, 95,127,133, 66,161,192,236,217,179,165, 98,177,120,146,191,191,127,135,106,143, 39, 33,196, +217,137, 28, 92,181,234,115,103,150,137,129,163,221,183, 8, 11,187,140,180,180, 52,164,165,165,225,250,245, 43,112,176,223, 12, +142,187,131, 21, 43,190,168, 87,175, 30,246, 19, 66, 24, 51,206,187,248,238,221,187, 40, 46, 46,198,158, 61,123,184,197,139, 23, +227,250,245,235,144, 74,165,120,231,157,119,176,102,205, 26,206,209,209, 17,241,241,241,200,207,207, 39,181,205, 75, 4, 8,156, + 56,103,225,160,137,115,190, 26, 68,128,192,245,227,200, 28,163,209,216,126,253,226,175,177,126, 61,210, 40, 16, 86,147,230,215, + 95,127,237,222,170, 85, 43, 95, 66,136,180,146, 11,122, 64,131, 6, 94, 56, 18,150,129,172, 2, 61,226, 83, 53,104,224,219,146, + 80, 94,215,187, 58,205,110,221,186, 77,237,216,177,163,166,125,251,246,134, 46, 93,186,236, 19,137, 68,231,190,249,230, 27, 43, + 75, 75, 75, 45,117,104,101,229, 55,233,140, 23, 64, 12, 96,168,134,130, 44, 6, 88,199,118,227, 67, 37,213,105,118,234,212,201, + 82,194,113,251, 87, 47,154,103,173,143, 56, 0,226,238, 9, 87,223, 9,176,182,239, 8,154, 91, 12,195,141, 88, 20, 44, 95, 3, +206,146,199,188,121, 51,173, 89, 96,111,163, 70,141, 36,117,188, 54,205, 70,208, 20, 52, 5,205,127,167,230,127, 46,130, 69, 8, + 28, 44, 45, 45,196,215,174, 30, 63, 28,127,255, 70,106,194,147,155,217,132, 80,146,148,164,204,106,209,162,135, 35, 40, 28,204, +221, 88,124,124,252,232,143, 39, 78,108,100,235,224, 0,131,193, 0, 39, 39, 39, 36, 37, 37, 65,173, 86,163, 48, 47, 15,197, 5, + 5,208,228,229,225,238,217,179,232,212,175, 31,250,250,249,121, 29,141,140,124, 31,192,186,170, 52,245, 12, 3,117,139, 22,120, +114,238, 28, 24,189, 30,245,123,244, 40,139, 90, 61,189,126,189,100,110, 59,131, 1,182,189,123, 3, 50, 25,184,249,243,235,124, +176, 84, 42, 85,100,131, 6, 13, 78,244,235,215,175,255,248,241,227,153,180,180,180,147,114,185,252, 21,149, 74, 21, 83,211,111, + 93,238, 25,223,121,251,125,255,134, 46, 14, 28,142, 94, 62,129,230, 94, 3,192, 49, 26,228, 21,106,145, 91,168, 69, 76,220,239, +160,188, 53,110,197, 62, 65, 96, 75, 25, 58,183,183,247, 44, 60,151, 53, 30,192,218,234,116,139,139,139,177,117,235, 86,220,189, +123, 23, 98,177, 24,245,234,213, 67,247,238,221,209,184,113, 99,168, 84, 42, 60,124,248, 16, 87,175, 94,133,143,143, 15,210,211, +211, 97, 52, 26,165, 85,105, 77, 93,170,243,146,203,229, 84,165, 82,225,244,233,211, 0,128, 67,135, 14, 33, 47,251, 9,202, 85, + 29, 98,229,202,229,208,235, 75,134,247,208,233,116,102, 29, 59,150,101,103, 76,158, 60,217, 66,169, 84, 34, 39, 39, 7,118,118, +118,176,181,181,133, 92, 46,199,221,187,119,203,214,243,240,240,192,228,201,147,165,107,215,174,253,184,186,136, 75,135, 14,126, +175,125,248,225,128, 22, 82, 75, 41,146, 18, 87,163,121,115, 49,166,127, 82, 15,139,191,205, 44,217,151, 15, 61, 17, 16, 80, 15, +121, 57,251,224,228,242, 25,166,125, 50,184, 81, 65, 1,125, 27, 37,237,198,170, 99,202,174, 93,187,226,250,244,233,195, 69, 70, + 70,150,205,191,103,154, 52, 60, 53, 53, 21, 90,173, 22,123,247,238, 53,160,164, 10,177, 90,228,114,249, 28,148, 70,172, 0,132, +125,222, 15, 0,213, 3,121, 95,153,142, 75,135,241,179,190,114, 45,173, 30, 12,155,104, 70,251, 43, 47, 47, 47,195,234,213,171, +237,215,172, 89,211,211,193,193, 33, 49, 59, 59,251, 86,169,233,172,239,228,213, 58,237,228,249,112,239, 54,222,190,228,201, 83, + 45,154,215,183,193,189, 91, 87,121,142, 19, 31,175, 78,211,104, 52,206,219,185,115,167,196,201,201, 9, 31,126,248, 97,191,113, +227,198, 73, 21, 10, 5,161,148,130,202, 60,236, 41, 67,123, 82,194, 92,101,120,250, 27, 1,250,241,224,199, 16,142,172, 5,240, +164, 42, 77,131,193,240,193,178,175, 63,114,163,178, 12,136,123,246, 7,147, 65,144, 60,113, 16,248,124, 53,116,223,124, 0,158, +138,161,209,114,208, 13,249, 16, 98,223, 38,248,208,191,189,252,187,200,240, 73, 0, 86, 11,183,102, 1, 1,129, 10,180, 7,224, + 92,250, 62,179,228,121, 21,245, 0,100,148,126,230, 12, 64, 11,160,252, 67, 90,197,229,242,235, 86, 92, 46,255, 62, 19, 0, 45, +125,111, 68,201,131,111,118,157, 34, 88,132, 16, 90, 46, 50, 80, 97, 96, 44,146,145,148,244, 40,165, 32, 63,189,120,112,223,192, +185, 35,131, 93, 86,124,244,254,196,229,182,182, 50,105, 66, 98, 28, 79, 24,146, 97,238,198, 44, 57,174,191,162, 99, 71, 81,106, +106, 42,236,236,236,144,156,156,140,123,247,238,149, 24,172,220, 92,104,178,179, 97,120,250, 20,244,233, 83, 60,190,120, 17,205, +228,114, 9, 7,244, 51,195, 73,131, 16, 82, 54,153,179,201, 25,154,162, 86, 44,203, 2, 86, 86, 32,214,214, 0, 83,187,145, 41, +228,114,249,224,230,205,155, 95,147,203,229,243, 0, 64,175,215,127,176,120,241,226, 76, 74, 41,102,206,156,105,107,101,101,181, + 87, 46,151, 91,212,164, 99,227,104,124,173, 99,219, 38,236,195,228,219,104,209, 96, 16, 92, 29, 59, 33, 59, 95,141,172, 60, 53, +178,243, 53,104,212,120, 58, 92, 61,223,131,131,199,251,136,142, 75,132,187,107, 3,134, 21,137,251,213,180,223,197,197,197,208, +235,245,208,106,181,176,183,183, 71,191,126,253,192,178, 44,126,250,233, 39,156, 56,113, 2,221,186,117,131,181,181, 53,138,139, +139,193,243, 60,106, 59,238,153,167,167, 39, 72,133,109,234,245,127,206, 79,172,213,106,205,210, 33,132, 4,214,175, 95, 31, 9, + 9, 9,101,230,202,214,214, 22, 3, 6, 12,192,245,235,215,161, 84, 42,203,170, 37,219,180,105, 67, 24,134,233, 80,157,158,173, + 45, 6, 4, 4,116,150,228,100,111, 3, 80,210,180,108,236,187,206,248,227, 66, 43, 92,190,164,192,148, 15, 27,130, 33,150, 32, +140, 24, 69, 5,103,208,170,117, 27,177,141, 13, 29, 88,157,102,105,131,246,135,173, 90,181,226, 38, 77,154, 4, 11, 11, 11,252, +248,227,143, 88,191,126, 61, 86,174, 92,137,184,184, 56, 52,104,208, 0,238,238,238,112,117,117,229, 0, 60, 44,253, 77,117, 4, + 62,122,244,104,208,163, 71,143, 6,245,110,150, 55,138, 2,129,235,151,124,133,245,235, 1, 10, 4,242,148,182, 47,169, 30, 52, +191,237,213,145, 35, 71, 50, 78,156, 56,193,110,216,176, 33,125,220,184,113,109, 61, 61, 61, 71, 18, 66, 36,245,234,213,123,111, +250,148,247, 46,236,221,186, 82,159,159, 28,201,183,243,100,241,228,246, 57,254,232,158, 53, 69,234,162,188,165, 53, 24, 44, 9, +203,178,160,148,226,253,247,223,151, 53,109,218,148, 24, 12,134,146,252, 98,208,232, 24,202, 52, 99,120,254,117, 16,232, 40,240, + 35,161,164, 59, 74,218,169, 85,109,170,129,222, 45,219,180, 97,139, 10, 31,193,218, 86,129,167, 75,191, 0,159,154, 13,154,158, + 7, 35, 39, 67, 49,111,137, 60,173, 8, 89,109,252,160,186,113, 23, 46, 50, 91, 78, 68, 72, 95,161, 28, 17, 16,248,111, 81,189, + 7, 41,195,153, 16,114,148, 16,114,116,206,156, 57, 61, 0,212, 35,132, 28, 45, 53, 65,206,165,239, 37,166,117,170, 88,118, 46, +175, 83,225,183,229,223, 59,205,153, 51,167, 39, 33,228,104, 80, 80,208,232, 82, 35,247,226, 35, 88, 6,158, 94,221,176,238, 7, +199,113,239,191,225,113, 41, 34,124,245,175,251,243,223, 11, 10,220,180,204,171, 65, 59,151, 45, 91,207, 89, 25,121,122,198,220, +141, 81,160,157,147,171, 43, 30, 63,126,140,240,240,112,168,213,106,104, 52, 26,104, 52, 26,232,178,179,161,207,201, 1,201,207, +135,196, 96,128, 58, 41, 9, 13,219,180, 1, 8,105,101,142,193, 98, 89, 22,108, 57,243, 64,240,103, 85, 33, 67, 41,136,149, 21, +136,149, 21, 80, 69, 53, 97, 21,230, 74,225,231,231,247,235,198,141, 27,197,211,167, 79,239, 32,151,203,127, 80,169,254,143,189, +243, 14,143,162,218,223,248,123,102,119,182,183, 84,210, 19, 18, 90,232,144, 37, 52, 17, 34, 32,189, 8,130, 87, 84,138,162, 23, + 1, 27,138, 20,229, 7,138, 26,202,181,208, 36, 52,165,137,136,160, 32, 93, 64,202,149, 22, 18, 16, 66, 73, 32, 16, 82, 54,164, +247,178,117,206,239,143,100,115, 3, 6,178, 27, 64, 34,158,207,243,204,179, 59,179,187,239,206,156, 57,115,230,157,239,105,134, +155,190,190,190,189, 22, 46, 92,120,250,147, 79, 62,145,189,248,226,139,161, 81, 81, 81, 99, 0,172,184,151, 22, 47, 53,181, 9, +242,110, 10, 17,121, 18,185,133, 38,228, 21, 25, 81, 88,106, 66, 97,177, 9,251,246,189, 12, 99,121, 25, 44, 70, 51,172, 38, 51, +212, 13,134,160,113,203,158, 0,174,213, 58,130,174,209,104,132,205,102,131,213,106, 69, 88, 88, 24, 50, 51, 51,209,183,111, 95, +156, 60,121, 18,151, 47, 95,198,206,157, 59, 49,112,224, 64,196,197,197,213, 57,243,203, 20,158, 88,180,118,101,133, 35, 23,171, + 81,189,102,217,209, 8,150, 32, 8,126, 82,169,180,210, 28,105,171,150, 37, 75,150,148, 78,154, 52, 73,249, 39, 51, 46,151,223, +123, 30, 64,129,134,185,186,181,128, 33, 37,178,242,162, 20,131, 16, 25,122, 62,125, 14,102,179,128,132, 43,253, 32,147,201,192, + 17, 25,172,182,108,104,117, 94,160,180,214, 17,137, 7,236,221,187, 23, 90,173,182,170, 90, 16, 0, 6, 12, 24,240,134, 86,171, +237, 81, 94, 94, 62,124,231,206,157,200,207,207, 71, 72, 72, 8, 26, 52,104,128, 83,167, 78, 13,112,160,240, 64, 86, 86, 22,188, + 53, 22,215,215,103,204,245, 2,231, 86,233,106,110,121, 45,159, 55, 55, 35, 42,242,147, 29,180, 34,202,213, 49,106, 60,217, 94, + 91, 79,194, 45, 91,182,216,124,125,125, 19, 50, 50, 50,122,204,155, 55, 47,179, 73,147, 38,129, 31,127,252,241,108, 31, 31, 31, +247,105,239,190,121,227,137,174,157,215, 47,248,106, 77,183, 29, 27,190,108, 72,128,221, 38, 83,241, 7, 37, 25, 87,175,212,118, + 13, 93,184,112, 1, 26,141, 6,137,137,137,112,119,119,135,205,102,171,120,120, 41, 73, 46,180, 17,250, 29,161,248,142, 0, 75, + 40, 71, 46, 66,160, 45,169, 77,144,182, 28,249, 35,119,113,203, 8,225, 46,215,123, 27,169, 92,134,146, 82,138,162,223,119,129, +230,150,130,230,151, 65, 40, 53,161,164, 76,132,162, 82,130,162, 82, 1,101,109, 59,192,182,255, 36,220, 10,202, 33, 0,237,216, +237,134,193, 96,220,163,172, 26, 68, 8,217, 25, 25, 25, 57,232, 94,159, 83, 74, 7, 1, 48,221,177, 14, 71,222, 3,192,188,121, +243, 62,171,182, 94,250, 80, 12,214,165, 75, 87,191,229, 69,164,157, 76,110, 84,244,138,104, 43,119,117,113,225, 26,120, 10,186, + 35, 71,254,208,220,186,149,159, 17, 23,119,245, 27, 39, 82,134,148,229,229,193,112,238, 28, 10,243,242, 80, 86, 92,140,242,162, + 34, 88,243,242,224,211,188, 57,104,113, 49, 68,101,101, 16, 27,141,144, 8, 2, 20, 42, 21, 64,233, 61,111,180, 98, 65,128,236, +216, 49,248, 12, 27, 6,202,243,200, 61,125,186,170, 90, 80,211,183, 47,160, 84,130,232,116,176,108,219, 6,145, 72, 4,193,213, + 21, 88,180,200, 17,115,229,225,237,237,189, 99,201,146, 37,146,220,220, 92,196,197,197,157, 51, 24, 12, 5,190,190,190, 26, 0, + 66, 66, 66,194,129, 43, 87,174, 12, 10, 9, 9, 1,128,198,181,233, 21, 23, 40,205, 86, 11, 69,106, 78, 18,174,220, 56, 11,142, +107, 0,142, 15, 68, 97,137, 9, 28,231, 5, 75,217, 21, 88,204,102, 80,155,128,242,210, 52,148,154, 28,155,103, 88, 16, 4,136, +197, 98,112, 28,135,102,205,154, 97,253,250,245,184,120,241, 34, 18, 19, 19,225,233,233,137,130,130, 2, 52,107,214, 12,151, 47, + 95,190,107, 27,180,154,110,182,213, 9,121,226, 91, 72,165, 82,252,248,227,143, 80, 74,110,247, 66,142, 26, 44,177, 88,156,150, +146,146, 18,228,233,233, 9,142,227,160,213,106,161,211,233, 48, 96,192, 0,197,205,155, 55,179,140, 70, 99,139,152,152,152, 28, +103, 50,239,174, 93, 39, 48, 97,194, 69,100,101, 85, 4, 81, 55,111,106, 89,245,217,141,235,102,244, 27,184, 23, 0,224,226,226, +130,207, 63,111,235,144,166,205,102,195,138, 21, 43,160, 80, 40,170, 12,150, 84, 42,125, 98,202,148, 41,195,107,250,126,203,150, + 45, 29, 74,207,170,116,162, 22, 32,111, 98,141,223,123,125,198, 92, 47, 80,203, 16, 71,122, 18, 26, 12,134, 50, 87, 87,215,227, + 5, 5, 5,207,108,218,180, 41, 55, 60, 60, 92,228,226,226,146, 11, 64, 70,173, 38,243,201,223,126,186, 81, 92, 80, 48,218,108, + 54, 59,220,104, 60, 55, 55, 23, 70,163, 17, 55,110,220,128, 66,161, 0,207,243, 16,132,219,188, 19, 1, 1, 96,179, 89, 64, 56, + 78, 76, 68, 28,148, 30,247, 52,150,184,113, 11,100,217,118,228,140, 30, 8,219,220, 73,176, 88, 37, 40, 41, 20, 96, 26, 56, 25, + 38,179, 0,139, 72,138,178,230,173,144,247,241,167, 48,106,148, 64,220,113,118, 7, 97, 48, 24,247, 42, 87,118, 78,159, 62,125, +166,131, 95, 63, 0,192,161,161,117,236, 70,204,190, 62,125,250,244,153,246,255,138,140,140, 44, 3, 96,112,118, 95, 57, 7,254, +212,102,177,217,150, 93,186,148,219,246,220,249,204, 54, 98,177, 57,235,231, 95,206,181,220,119,224, 82,104, 81,137,117,137, 83, + 67, 52, 16,114, 46, 49, 62, 30,130, 32,160, 56, 63, 31,101,121,121,176,100,101,193,146,149, 5, 82, 84, 4,190,172, 12,226,242, +114,240,166,114,200,197, 98, 20,100,100,128, 16, 82,107, 67, 58, 90, 89,101, 69,238,172, 22, 84,171, 65, 42, 23,251,182,154,122, +197,213,132, 84, 42,253,110,197,138, 21, 62, 62, 62, 62, 88,189,122, 53,124,124,124,154,247,234,213,171,180, 83,167, 78,133,131, + 6, 13,138,155, 58,117,234,160, 14, 29, 58, 32, 51, 51, 19, 0,174,213, 26, 9, 52, 75, 99, 46, 37, 90,145,146, 30,141, 83, 49, +223,226,240,177,143,145,150,126, 13,121, 69, 70,104,188, 95,129, 88,217, 5,212, 86,113, 51,147,185,246, 64, 70, 70, 54,128,218, +143,157,227, 56,200,100, 50, 72, 36, 18, 36, 37, 37, 65, 16, 4,196,198,198, 66, 46,151,195,207,207, 15, 61,122,244, 64, 90, 90, + 26, 84, 42, 21,120,158,191,167,214,226,247, 37,201, 83, 70,166,227,139, 41, 28,174, 30,121, 30,142,156, 90, 71, 13, 22,128,211, + 9, 9, 9, 84,163,209, 84,153, 43,173, 86,139, 62,125,250,144, 17, 35, 70,104, 21, 10,197,174,136,136, 8,135, 7,190,165,132, +156, 21,108, 57,104,212,168, 81,213,182,117,235,179, 16,123,166, 55, 46,158, 31,140,159,119,164, 87,109, 15, 12, 12, 68, 70,198, +117, 16, 82,107,163,204,221, 3, 7, 14,196,206,157, 59,171, 12,214,176, 97,195, 80, 94, 94,254, 92,229, 19, 13, 8, 33, 32,132, + 96,206,156, 57, 21,143, 53,165,165, 70, 71, 13, 86, 82,174, 84, 57,243,253,121, 25, 51, 63,149,100,204,252, 84,146,177,104, 41, + 41,126,125,198, 92,175, 9,211,103, 13, 1,224, 85,189,109,150, 35,228,229,229, 21,158, 56,113,226,240,187,239,190, 27,208,186, +117,235, 82,127,127,127,115, 81, 81,145,232,217,103,159, 13,200,206,206,158,228,140,185,162,148, 34, 39, 39, 7,217,217,217, 72, + 73, 73, 65,102,102, 38,178,179,179, 43,134, 60, 81, 5,106, 57, 74, 94, 32, 32, 63, 82, 27,202, 65, 68,205, 0, 92,179,113,212, +120,238,219, 30,194, 61, 68,207,151, 21, 22, 1,165, 20, 56,119, 19, 70, 65,142, 66,147, 24,249, 70, 17,138,202,109, 40, 36, 18, + 20,113, 50,228,118,141,128,209, 38, 66, 65,126, 1, 56,224, 28,187,133, 48, 24,140,123, 25,161,121,243,230,125,246,176,180,237, +239, 35, 35, 35,227,170,253,151,226,126, 34, 88, 17,213,234, 61, 35,238,252, 82,126,126,217,202,200,200, 41,109,123,245,234,133, +194,194, 66,236,218,181,171, 97,122,198, 90, 36, 37, 37,173, 3,208,213,209, 63,179, 80,186,231,204,153, 51, 3,187,117,233, 34, + 75,138,141,133, 53, 63, 31,182,188, 60,240,102, 51,196, 37, 37,224,140, 70,136,202,202, 16,216, 94, 9, 66,189,113, 42,209, 96, + 53, 11,194,190, 90, 82, 4,168, 52, 88,212, 94, 37,200,113, 21,102,170,178, 90,208,110,176, 56,142,115,200, 96,249,250,250, 42, +251,244,233,211, 43, 44, 44, 12,148, 82, 44, 92,184, 16, 38,147, 73,106,177, 88, 96,177, 88, 96, 54,155, 81, 84, 84,132,109,219, +182, 97,237,218,181,199, 1,124, 91,107,164,201,106,220,115,232,191,103, 7,140, 25,241,148,116,207,175,171, 96, 54,217, 80,110, +117, 69, 97,105, 57, 10,203,196,176,168,250, 2, 57, 71, 65, 57, 25, 2,252, 91,224, 90,194,197,114,155,197,188,183, 22, 39, 15, +158,231,161,209,104,160, 82,169, 16, 31, 31,143,137, 19, 39,226,208,161, 67, 72, 79, 79,199,147, 79, 62,137, 30, 61,122, 96,255, +254,253,112,117,117, 69, 97, 97,225, 61,143,191,250, 56, 88, 95,173, 93, 13,145,136, 64,184,203,237, 83, 36, 18, 65,167,211,161, +184,184, 24, 0,106,117, 89,102,179,121,225,182,109,219, 6, 55,106,212, 72, 30, 16, 16, 80, 85, 69,168,211,233, 48,121,242,100, +233,165, 75,151, 90, 94,185,114,229, 43, 0,147, 29,201, 75,133,133,116,119, 78,238,213,145, 67,135, 14,149,156, 60,121, 18,148, + 82, 52,109,170,131, 86,163, 6,225,100,104,209,194, 19,192, 21, 16, 66, 16, 17, 17, 1,147, 41,205, 90, 82,130,123, 54,244,142, +137,137, 25,168,215,235, 67, 44, 22, 75,124,235,214,173,197,183,110,221,194,136, 17, 35,176,121,243,102,251, 19, 13,166, 79,191, +125, 80,252,226,226,226, 90, 7,200, 20, 4, 1,102,179, 25, 43,118,166,169, 37, 18,137, 26,168, 24,143,237,179,209,110, 25,160, + 22, 53, 10,231, 2, 64, 70,212,188,143, 79, 3, 21,195, 55, 56,122, 77,229,231,231, 39, 7, 5, 5, 37, 44, 93,186,180,229,228, +201,147,203, 39, 77,154, 20, 80, 82, 82,242, 61,165, 52,201,201,130,197,148,158,158, 14,133, 66,129, 11, 23, 46,152,148, 74,165, +196,219,219,187,162,145,187, 72, 34, 22,136,112,133, 18,209, 9,206, 70, 37,160,244, 69, 10, 28, 38,132,220,243,188,219,128, 95, +175,198, 93,234,217,216,191, 9, 87,244,219, 5, 20,132,117, 67, 81, 9, 80, 82, 76, 96,227, 21, 40, 17,203, 80,220,168, 41,138, +220,189, 33, 6, 7, 67,114,146,197, 66,233, 62,118, 11, 97, 48,254,113,220,211,131,220, 25,193,234,210,165,203,247,213,163, 76, +246,247, 0,140, 0,238,213, 38, 58,171,122,164,170,186,161,170,233,127,238,208,173,155,193,162,148, 30, 1,112,215, 59,175,193, + 96,120,226,165,151, 94,162,215,174, 93, 67,126,126, 62,190,249,230, 27,251,246,174,206,252, 89, 80, 80,208,250, 95, 14, 28,152, +218, 46, 52, 52, 52, 56, 56, 24, 87,246,237,131,196, 98,129,216,106,133,168,180, 20,188,217,136,134,122, 21, 36, 10, 15,164, 39, +149, 98,227,249,243, 73,148,210,149,247, 52,109, 28,135,226,167,158, 66, 97,108,108, 69,181,224,128, 1,255,171, 22,220,178,165, +194, 88, 9, 2,196,115,231,130, 83,169, 64,158,126,186,214,253, 52, 24, 12,165, 77,154, 52, 57,115,249,242,229,240,208,208, 80, +124,244,209, 71, 72, 73, 73,129, 32, 8,200,206,206, 46,207,204,204, 76,203,201,201, 73, 2,240, 19,128, 85, 6,131,161,214,145, +194, 51,155,138,214,238, 63,112,240, 61,125,251,150,205,250,246,154,131,159,126,254, 63,228,230,231,163,200, 40, 70, 65,177, 9, +197,101, 20, 50, 73, 40, 66, 66, 58,192,100, 44,197,213,184,152,212,108,137,219,202, 90, 79,160, 88, 12,157, 78, 7,157, 78, 7, +177, 88,140,253,251,247, 67,175,215, 99,204,152, 49, 72, 74, 74,194,158, 61,123,160, 80, 40,224,230,230,134,244,244,116,103,110, +184,104,214,172, 25,178,179,243,145,147,147,115, 91,196,204,205,205, 13, 74,165, 18,103,206,156,193,177, 99,199, 44, 0,106,157, +138, 39, 54, 54, 54,182,107,215,174, 75,214,175, 95,255,198, 7, 31,124, 32,183,155, 43,123, 68,232, 63,255,249,143,242,185,231, +158, 27,171,215,235, 79,196,196,196,108,170, 53, 28,118,250,220, 22,181,154,204, 24, 55,238,245,214, 47,190,248, 34,182,110,253, + 30, 47,143, 11, 5,225,100, 32, 68,134, 33,131,155,227,227,185,103,208,169, 83, 4, 60, 61, 37,248,245,215,184,235, 98,177,110, +189, 3,135,190,100,193,130, 5, 98,185, 92, 14,147,201,132,226,226,226,170,227,159, 55,111, 30,102,204,152, 1, 0,152, 61,123, + 54,230,204,153,131,178,178, 50,185,163, 17,172,196,196,196, 42,163,207,113, 92, 85, 68, 11,144,224, 86, 17,159,247,235, 21,237, +105,131,193,224,244, 40,238,201,201,201,191, 46, 89,178,164, 13,207,243,222,123,246,236, 17, 74, 75, 75, 55,215,225,201,237,147, + 19, 39, 78, 44, 0, 32, 86, 42,149, 59,255,248,227,143,190,197,197,197, 74, 74, 41,184,146,212, 2, 74,201,102, 66, 5, 14, 32, + 67, 64,104, 51, 74, 48,131, 16, 91, 86, 45,121,115,217,140,239,126,126,107, 85,212,127,252,138, 74, 10, 81,250,105, 20,204, 49, + 23, 97,150,170,145, 61, 55, 18,101, 38, 1,101,121,197,208,174, 94, 6,185,151, 55, 14, 23, 37,102, 20, 20, 22, 46,103,247, 26, + 6,227, 31, 23,149,186,167, 7,169,110,142, 42,223,231, 2, 72,138,140,140,204,174,214, 22, 43, 11, 21, 17,240,118,149,223,203, +186,227,119, 89, 0,162, 1,132, 87,211,201,170,102,180,170,191, 55,221,241,157, 58, 69,214,137, 35,189,202,124,125,125, 79,204, +158, 61,187,243,240,225,195,145,149,149,133,227,199,143, 99,237,218,181, 72, 74, 74, 58,105, 48, 24,186,220,195, 1,254,105,182, +237, 14, 29, 58, 52,109,160,213, 30,159, 52,124,184,155,204,104, 68,234,137, 19, 48, 27, 12,240, 12, 14,134,148,231,225,214,208, + 7,197,133, 70, 68,157, 63, 95,112,189,160,224,201, 59, 7, 26,173,174, 25, 17, 17, 33, 51,153, 76, 37, 91,183,110, 21,101,103, +103,131,179, 90,161, 28, 53,170, 34,106,165,211,193,182,114,101, 69, 52,139, 82,136, 22, 45, 2,167,209, 64,209,173, 27,122,206, +156,137,152,152, 24,114,175,253,244,245,245,245,111,216,176,225, 31,187,119,239,118, 77, 75, 75,195,144, 33, 67, 98,203,203,203, +159, 50, 24, 12, 69, 14, 37,108, 13,154, 30,109,134, 52,117,115,245, 60, 62,118,204, 24, 55,181,220,134,216,184, 56,164, 20, 52, + 64,169,209, 2,173, 74, 10,255, 6,106, 24,203, 75,240,251,161,157,121,229,197,249, 61,238, 28,104,244, 78, 77,189, 94, 79, 43, +163,107,216,191,127, 63, 90,180,104,129,194,194, 66,148,151,151,131, 16, 2,165, 82, 9, 87, 87, 87,184,186,186, 66,167,211,225, +247,223,127,199,214,173, 91,239,122,236,213,167,202,177, 9,188,233,224,149, 39, 37,239,188,243, 46, 73,141,254, 55,138, 11, 42, + 6,238,230,165, 58,164,227, 85,236,217,179,143,230,230,230,110, 1,240,129,193, 96,184, 94,219,177, 87,158, 47,177,197, 98,153, + 43, 18,137,222,124,245,213, 87,229,109,218,180, 33,193,193,193, 48, 24, 12, 56,119,238, 28, 93,190,124,185,145, 16, 50,235,240, +225,195,159, 59,146,158,225,225,225,193,205, 67,221, 79, 13, 28, 52,204,195, 98,177,162,119,207, 34, 88,173,217, 32,156, 4, 98, +113, 3, 28,251, 47, 65, 70, 70, 46, 78,156, 56,145, 27, 31,159,223,227,204,153, 51, 23,107,211,212,235,245,219, 7, 15, 30, 60, + 68, 46,151, 99,235,214,173, 86, 47, 47, 47,177,139,139, 11,214,174, 93,123,215, 40, 34,173,214, 78,240, 78, 77, 95, 95,223,237, + 9, 9, 9, 67, 46, 92,184, 80,101,172,236, 38, 43, 56, 56, 24, 18,137, 4,132, 16, 88, 44, 22, 52,107,214,108,135,193, 96, 24, +234,200,177,215,240, 29, 79, 79, 79,207, 57, 89, 89, 89,243, 40,165, 41,117,201,159,119,164,109, 7, 0,135, 4, 65, 80,114, 28, +231, 27, 29, 29,157,209,126,226,193, 70,160,100, 20, 64, 47,130,224,196,217,175,123,101, 56,144,158, 29, 27,135, 52, 60, 56,233, +141, 55, 84,133, 89,133,200,157,246, 9,138, 76, 2,114,222,155, 14,163,153,194,227,251,111, 32, 82, 41,113, 84, 82, 82,146, 86, +144,211,243,206,129, 70, 29, 57,118,167, 11, 61,166,201, 52,153,102,189,212,124,220,112,168,205,139,193, 96,232,226,235,235, 75, + 63,250,232,163, 63,109,119,246, 15,207,156, 57,147,208,161, 67,135, 30,115,191,253,118,235,160, 22, 45, 26, 54,107,212, 72,226, +222,178, 37, 20, 42, 21,242,179,179,113,238,134,193,182,238,202,149,235,101, 22,203,200,179,103,207,214,218,245, 77, 16, 4, 88, +173, 86,184,187,187,131, 90,173, 80, 76,159, 14, 74, 8, 4, 66, 80, 76, 8, 4, 65,128,205,102,131,172, 83, 39, 88, 69, 34,228, +230, 57, 54,148,133,193, 96, 72,245,245,245,125,118,242,228,201, 7,215,173, 91,199, 69, 68, 68,180,223,179,103,143,112, 63,137, +157,125,126, 71,130, 87,155, 97, 61, 22, 47,249,250,199,176, 14,157,131, 26, 6, 7,203,186, 4,104, 97,178,216,144,145,153,131, +107,151,255, 48, 38, 92, 58,151, 34,152, 77, 35, 51, 47,110,175,245,216, 69, 34, 81,230,212,169, 83, 27, 0, 64, 81, 81, 17,142, + 28, 57,114,219, 80, 12,246,161, 43,170, 87,141,242, 60,127,215,209,183,223, 92, 96,190,109,126,198, 69,190,190,250,241,227,199, + 47,120,247,185,204, 8,123,213,225, 23,223,172,192,230,109, 27,143, 90,172,228, 61,131,193, 16,227,204,241, 87, 78,127, 51, 35, + 60, 60,252,135, 85,171, 86, 77,231, 56,174, 99, 89, 89,153,159, 76, 38,203,226, 56,238,108, 73, 73,201,236,152,152,152,179,142, +234, 69, 71, 71,223, 8, 11, 11,235,146,145, 17,181,109,194,132, 62, 77, 45,150, 14, 82,173,174, 59, 40,181, 34, 63, 47, 25,132, +158, 51,255,252,243,161,107,249,249,162,225,103,206,156, 73,112, 80,118,194, 47,191,252, 2, 84, 78,149, 99, 48, 24, 18,237,195, +127,212, 20,193,114,132,178,178, 50,152,205,230, 63, 25,172,171, 87,175,222, 22,209,114,162, 96,235, 6, 96, 16,128, 6,149,139, + 23,128, 6, 89, 89, 89, 13, 0, 12, 35,132,100, 2,168,190,236,163,212,241,222,190,149,105,123, 38, 44, 44, 44,130, 16,178,160, +172,172,172,164,114,115, 17, 8,253,158, 0,230,216, 59,204,213,221,136,137,137, 57,173,215,235,123,189,255,222,251, 91,135, 13, +123,222,219,127,236, 11, 34,237, 31,241, 48,201,165,144,167, 36, 0,106, 37,221, 85,116,227, 86, 1, 71,134,197,196,196,176, 81, +220, 25, 12,198, 99, 3,113,102, 92, 36, 66,200, 28, 0,179, 1,124, 68, 41,157,227,192,247,239,234,112,239,156,236,153, 84,132, + 7,107,157,236,249,142, 8,150,216,104, 52,166, 91, 44, 22, 15,103, 14,154,231,249,204,147, 39, 79,122, 57,178,159,190,190,190, +163, 2, 2, 2,230,165,165,165,109, 75, 77, 77,125,231, 65,184,123,251,100,207,156, 72, 50,136, 82,218, 22, 0, 33, 28, 87,235, +100,207,181, 61, 49, 84,142, 84, 46,170, 22,106,165, 0,108,247,154,131,208,145,167,144, 47,166,112,214, 55,199,188, 42,170, 52, + 88, 2,165,130,242,221, 47,169,177,190, 60, 45, 17, 66,184,174, 93,219, 63,175, 81, 99,160, 64,209, 14,160,132, 16,114,190,184, +152,236,246,241, 9,222,184,101,203, 22, 91, 93,247, 83,175,215,239, 42, 46, 46, 30,144,144,144, 80,215, 8, 86,245,129, 70,107, +163,198, 42,194,199,225,137,182,250,100,207, 98, 65,104,107,225, 56,234,200,100,207, 44, 66,192, 52,153, 38,139, 96, 61,214, 17, + 44, 59,149,166,106,206,131,248,227, 74, 3,245, 77,229,114, 63, 26,158, 15, 51,129, 12, 6,195, 38, 0,155, 30,164, 38,125, 0, +199,126,151,243, 35,192, 62,234,230,131,204, 36, 34,145, 97,209,218,149, 1,149,239,115,173, 54, 88,235, 83, 38,174, 60,238,239, + 42,151, 7, 74, 76, 76,204, 64, 95, 95,223, 88,119,119,247,198,229,229,229,210,242,242,114,190,186,161, 82, 40, 20, 89,181,228, +159, 72, 86,204, 0,149, 6,234, 63,149, 11,131,193, 96, 48,131,197, 96,188,185,208, 18,248, 79, 62,126,131,193, 16,198,114, 1, +131,193, 96, 48,156,129, 99, 73,192, 96, 48, 24, 12, 6,131,241, 96, 33, 0,106,156, 62,196,153,186, 85, 66,106,157,130,196,105, +125,166,201, 52,153, 38,211,100,154, 76,147,105, 62,126,154,181,105, 63, 46,109,187,136,179,147,255, 58, 37,206, 26, 0, 50, 77, +166,201, 52,153, 38,211,100,154, 76,243, 31, 8,171, 34,100, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131, 25, + 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96,212, 27, 30,106, 47, + 66, 6,131,193, 96, 48, 24,140,127, 34, 44,130,197, 96, 48, 24, 12, 6,131,241, 48, 12, 22, 33,132, 86,127,101, 48, 24, 12, 6, +131,193,248, 43,120, 92, 61, 8,139, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,241,247, 48, 88, 17,149, +161,185, 8,150, 36, 12, 6,131,193, 96, 48,254, 66, 30, 75, 15, 82,213,139,144, 16, 66, 41,165,132,157,103, 6,131,193, 96, 48, + 24,127,169, 25,121, 12, 61, 8, 27,166,129,193, 96, 48, 24, 12, 6,227, 1,243, 80,219, 96, 17, 66, 90, 51, 77,166,201, 52,153, + 38,211,100,154, 76,147,105, 50,131,197, 96, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, + 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 60, 34, 8,128, 26,123, 2, 80, 74, + 47, 56, 44, 82,135,222, 4,181,233, 51, 77,166,201, 52,153, 38,211,100,154, 76,243,241,211,172, 77,219, 25,255, 81,175, 13,214, +195, 28, 7,139, 16,210,250, 65, 39, 20,211,100,154, 76,147,105, 50, 77,166,201, 52, 31, 63,205,199, 13, 86, 69,200, 96, 48, 24, + 12, 6,131,241,128, 17,179, 36, 96, 48, 24,127,119,188,188,188,148,132, 16, 61,165,244, 74, 70, 70, 70,214,131,208,244,246,246, +246,224, 56,174,169,205,102,187,250,160, 52, 25, 12, 6, 51, 88,232,220,185,115,178,197, 98, 9,112, 84, 72, 34,145,100, 75,165, + 82,159,195,135, 15, 91,239,246,157,240,240,240,100, 65, 16,254,164,201,113,156, 32, 8,194,159,162,105, 60,207,103,203,100,178, +123,106,254,213, 16, 66,252, 1, 44, 84,169, 84, 61, 57,142,227,138,138,138,126, 3, 48,149, 82,122,179,142,122, 90, 0,175, 2, + 8,175,220, 20, 13, 96, 21,165,180,144,101,207,250,121, 35, 23,137, 68,109,211,211,211, 79, 81, 74,109, 44, 69, 30, 45,126,126, +126,109, 0,188,235,230,230, 54,188,121,243,230,138,196,196, 68,248,250,250,158, 16,137, 68,163, 83, 82, 82,174,215, 69,211,199, +199, 39,144, 16,178,222,203,203,235,201,198,141, 27,227,218,181,107,247,173,201, 96,212, 87, 2, 3, 3, 93, 74, 74, 74, 86,139, +197,226, 48,169, 84,234,173,209,104,160, 86,171,111,201,100,178,179, 74,165,242,149, 93,187,118,229,179, 84,122,192, 6,203,102, +179,249, 28, 58,116, 8, 26,141, 6, 54,155, 13,148, 82, 8,130, 0, 74,105,213, 82,237,187,120,250,233,167, 93, 43,245,238,106, +134, 40,165, 62, 7, 14, 28,128,139,139, 75,213,182,172,172, 44, 12, 24, 48,128,171,105,251,160, 65,131,106,213,252,139,205,149, +159, 90,173, 62,223,175, 95, 63,115,120,120,184, 82, 42,149,210,172,172,172, 39,214,172, 89,115,158, 16,210,150, 82,154,228,164, + 94,103,157, 78,183,122,216,176, 97,198,128,128,128, 32,181, 90,141,242,242,242,144,175,191,254,122, 28, 33,100, 60,165,244, 36, +203,162,245, 7, 95, 95,223,193, 34,145,232, 7,127,127,127, 1, 64,174,191,191,255,136,212,212,212,211, 44,101, 30, 13, 13, 27, + 54,212,113, 28,183,119,222,188,121,222, 35, 71,142,132, 72, 36, 66,121,121, 57,126,252,241,199, 46,115,231,206,253,195,215,215, + 87,111, 48, 24, 18,156, 52,208,193, 74,165,242, 92,100,100,164,102,196,136, 17, 0,128,210,210, 82,108,219,182,173,206,154, 12, + 70,125,197,195,195, 99,124, 81, 81,209, 50,133, 66, 33,209,106,181, 80, 40, 20,144, 72, 36,144, 74,165,129,174,174,174,129,106, +181,122,192,168, 81,163, 38,109,218,180,105, 53, 75,173, 7,104,176, 0, 64,161, 80, 96,251,246,237, 16,139,197,224,121, 30, 18, +137,164,234,181,250,123, 95, 95, 95,112,156, 99,205,185, 52, 26, 13,118,238,220, 9,141, 70, 3,173, 86, 11,157, 78,119,207,237, +143,130,145,189,137, 17,128,244,187, 25,161, 38, 94, 76,164, 35,231, 94, 54, 1,144,142,232,174, 17,116, 65, 17,220,103,255, 89, +154,234,226,226,122, 64, 16,132,173,135, 14, 29,106,235,237,237,253,175,137, 19, 39,126, 1,224, 25, 39,204,149,214,197,197,101, +245,196,137, 19, 27,140, 27, 55,238,188,143,143,207,154,162,162,162,255,158, 60,121, 50,116,213,170, 85, 83, 95,127,253,245,213, +132,144, 46,206, 70,178,170, 71, 9, 69, 34, 81,182, 66,161,168, 23, 17, 64,189, 94,175, 5, 48,131, 16, 98,179,217,108,203,206, +158, 61,155, 94,237, 51,111, 0, 31, 2, 40, 50,155,205, 11, 46, 92,184, 80,239,158,152, 26, 54,108,168,115,115,115,219, 56,127, +222, 60,217,238,221,187,145,154,154,170, 16, 4, 97, 27, 33, 36,136, 82,106,125, 4,233, 25, 34,151,203, 23, 2, 8, 51, 26,141, +126,149,215,107, 26,165,244,167,178,178,178, 15, 98, 98, 98,202,234,248, 16, 17, 0,160, 21, 42,122, 24,215,248,156,180, 96,193, +130,248,169, 83,167, 94,127,148,154, 0, 96, 50,153, 34,159,126,250,105,239,231,159,127, 30,251,247,239,199,175,191,254,138,142, + 29, 59,162,111,223,190, 72, 76, 76, 84,125,243,205, 55,175, 2,120,207, 25, 77,142,227, 94, 30, 63,126,188,102,196,136, 17,216, +181,107, 23, 14, 30, 60,136,206,157, 59,223,151, 38,163,254, 34, 18,137,204,130, 32,240, 0,228,148, 82, 99,109,235,143,211,177, +187,187,187,191,158,151,151,247,181,175,175, 47, 60, 61, 61, 65, 72,197,229, 41, 8, 2, 74, 74, 74, 80, 86, 86,134,144,144, 16, + 73,139, 22, 45, 86,189,249,230,155,252,226,197,139,151,179, 28,227, 28, 28, 33,164,199, 29,133, 97,143,234,145, 41,158,231,107, + 93, 8, 33,168,169, 55,226,157, 61, 12, 8, 33, 32,132, 64,167,211, 85,153, 40,187,145,186,219,246,218, 52, 31, 4, 53,105, 42, +173,144,243, 79, 93,150,225,201, 75,100,203, 1, 42,219,114,128,146,221,103,172, 89, 77, 91,117, 43,117,115,115, 63, 43, 18,137, +126, 53, 24, 12,113,145,145,145, 75,123,244,232,161,241,246,246,238,225,228,126,190, 58,124,248,112,227,232,209,163,255, 8, 9, + 9,121, 74, 46,151, 55,104,208,160,129, 68,163,209,252, 96,179,217, 86, 44, 94,188,216,132,138,170, 67,167,142,157, 82,234,179, +127,255,126, 28, 58,116, 8,148, 82,215,218, 76,244, 95,149,158, 0,222, 29, 52,104,208,180, 87, 94,121,101,166, 72, 36, 58,209, +174, 93,187,160, 74, 67,232, 15,224,191,163, 71,143,158,248,204, 51,207, 76,151, 72, 36, 51, 31,241,126,222,237,102,222,113,198, +244,233,146,235,215,175, 99,215,238,221,246,205, 90, 63, 63,191, 39,254,234,253,108,223,190,125,115,185, 92, 30,243,249,231,159, + 15,221,191,127,127,192,137, 19, 39,184, 99,199,142,113,139, 22, 45, 10,232,208,161,195,191,229,114,249, 57,189, 94,207,215,241, +216, 91, 29, 59,118,172, 36, 61, 61,189,160,166,229,218,181,107, 37, 83,167, 78,141,168, 7,154, 32,132, 68, 30, 60,120,112,239, + 11, 47,188,128,241,227,199, 39,111,222,188,249,223, 83,166, 76, 73,140,143,143, 71,191,126,253, 64, 8, 25, 93, 83, 58,220, 77, +147, 16, 34,226, 56,110,236,243,207, 63,143,235,215,175, 99,194,132, 9,201, 91,183,110,125,254,221,119,223, 77,140,143,143, 71, +255,254,253,157,214,252,171,242,103,125,213, 36,132, 20, 16, 66, 40, 33, 68,247, 32, 52, 43,245,140,246, 69, 34,145, 24, 53, 26, +141,177, 65,131, 6,198,160,160, 32,163,205,102,219, 8,128,119, 84,147,216, 93, 5,208,142, 16,194,213,182, 94, 31,206, 17, 33, +196,159,227,184,109, 28,199,229,115, 28, 87,200,113,220, 14,111,111,239, 32,103, 52,125,125,125,221,139,139,139, 23,249,249,249, +161, 65,131, 6, 32,132, 64, 36, 18,161, 83,167, 78,104,211,166, 13, 56,142,131, 32, 8,184,118,237, 26,210,210,210, 16, 26, 26, +186,232,163,143, 62,114,127, 24,199,126, 47, 15,242,183, 55, 88, 0, 14,223,113, 80,135,171, 27, 44,123,244,170, 46, 6,235,110, +216, 77,148, 86,171,133, 86,171,173,114,206,119,110,191, 31, 92, 93, 93,247, 17, 66,250,212,229,183, 91,102, 53,199,183,179,131, +106,202, 8, 80, 40, 20,212,100, 50,253,152,152,152,120,178, 97,195,134,153, 5, 5, 5, 46, 46, 46, 46, 14, 71,240,170, 7,155, +130,130,130,130, 2, 2, 2,162, 1,124, 7, 96, 79, 92, 92,220,205,158, 61,123,210,149, 43, 87, 30,110,213,170, 85, 67,252,175, + 93,150, 83,232,116, 58, 28, 58,116,168, 94,101, 52, 74,169,139, 90,173,198,132, 9, 19, 48,109,218,180, 64,158,231, 15,135,135, +135,119, 23, 4,225,232,228,201,147, 67,222,124,243, 77,104, 52, 26, 0, 40,175, 79,251,237,231,231,183,219,215,215,151,138,197, +226,125,215,175, 95, 23, 47, 95,190, 28, 22,139,197,254, 49, 47, 22,139,255,248,171,247, 73, 46,151,191,247,201, 39,159,104, 91, +182,108, 73,178,179,179, 97, 48, 24,144,157,157, 13, 15, 15, 15, 76,157, 58, 85,222,164, 73, 19, 63,169, 84, 58,179,174,229, 93, +163, 70,141,238,218,182, 76,169, 84,218,224,124,239,227, 26, 53,173, 86, 43,233,220,185,243,251,173, 91,183, 94, 95, 7, 77, 24, + 12,134,148,180,180,180,254, 71,142, 28, 25,109,179,217,198,164,167,167,175, 36,132,124,189,125,251,118,120,122,122,162, 69,139, + 22, 30,153,153,153, 93, 29,213,243,241,241,105,211,166, 77, 27,223,192,192, 64,124,255,253,247, 32,132,172, 50, 24, 12,155,239, + 71,147, 81, 69, 62,207,243,212,197,197, 69,119,159, 58, 50, 0, 82, 0, 82,177, 88, 44,149,201,100, 82,185, 92, 46,149,201,100, + 82,153, 76, 38,125,220, 19,145, 16,226, 71, 8,185,200,243,252, 64, 23, 23, 23,157,155,155,155, 38, 48, 48,176,111,227,198,141, +227, 70,143, 30,221,208, 81,157,242,242,242,245,114,185,156,247,240,240, 0, 0,244,233,211, 7, 27, 55,110,196,168, 81,163,132, + 62,125,250, 8, 35, 71,142,132,151,151, 23, 0,224,220,185,115,144, 74,165,188,155,155,219,250,135,116, 88,119,245, 32,127,119, +196,119, 28,228,109, 33,124, 65, 16, 28,142, 96, 57,202,173, 91,183,160,213,106,161,209,104,110,139, 82,221,109,123, 93,105,210, +164, 73, 79,165, 82,249, 36, 33,100, 8,165,244,192, 3,200,216, 60,128,115,215,175, 95,239,182,109,219,182, 1,235,215,175,143, +213,235,245,254,139, 22, 45,122,243,210,165, 75,197, 6,131,193,233,182, 56, 26,141, 6,249,249,249, 71,189,189,189,213, 39, 79, +158, 76,233,210,165, 75, 46, 0,247,162,162, 34, 55,181, 90,237,112,162, 86,175, 22,148,203,229, 38, 66,136,216,197,197, 5, 58, +157,206,156,151,151, 87,174,215,235, 33,149, 74,179, 37, 18,137,195,213,133, 29, 59,118,204,176,217,108, 13,238,245, 29,137, 68, +146,121,226,196, 9, 47, 71,244,172, 86,235,220, 77,155, 54,245, 82,169, 84,205, 94,123,237, 53, 0, 8,154, 63,127,254,145,201, +147, 39, 99,236,216,177,216,184,113, 35,214,173, 91,119,157,227,184,175,235,211, 5, 98, 52, 26, 87,123,120,120,244,235,219,183, + 47,137, 90,177, 66, 36, 8,130,141, 16, 82, 10, 64, 68, 8,121, 57, 41, 41,169,224, 47,127, 42,226,184,190,161,161,161,164,160, +160, 0,148, 82,136, 68,162,219,150,169, 83,167, 42, 94,121,229,149, 15,187,116,233, 50,149,231,249, 66,171,213,250,125,113,113, +241,167,245,173,234,181,123,247,238,239, 36, 39, 39, 15, 10, 12, 12,252,229,126,116,210,211,211, 55, 84, 91, 61,153,150,150, 6, + 0, 80,171,213,176,217,108, 50, 39,174,113,137,189,236,185,121,243, 38, 4, 65,136,189, 95, 77, 70, 5, 34,145, 8, 50,153, 12, + 60,207,231, 7, 6, 6,130,227, 56,121, 82, 82, 82, 93,170,220,180, 0, 10,197, 98,177, 84, 46,151, 67, 38,147, 65, 38,147, 65, + 46,151,227,194,133, 11,155, 69, 34,209, 56, 0, 22, 39, 30,252,168, 51,235,245,192, 96,125,197,243,188,204,221,221, 93, 98,223, +102, 54,155, 37,174,174,174, 8, 10, 10, 90, 10, 96,128,131, 58,237,237,213,130, 18,137, 4,175,189,246, 26, 78,157, 58,245, 83, +106,106,234,232,204,204, 76, 20, 23, 23,175,215,106,181,195, 50, 50, 50, 96,179,217,144,148,148,132,118,237,218,181,127,200,135, +247, 39, 15,242, 88, 24, 44,187,115,188, 51, 52,231,168,193,226, 56,206,161, 8, 22, 33, 4,207, 60,243, 12,196,226,255,249, 58, +155,205,118,215,237, 28,199,213, 57,177,101, 50, 25, 6, 12, 24, 32, 87, 42,149, 63, 87,154, 44,135, 67, 58, 35,231, 94,134,210, + 10,124,219,163,106,191,125, 3, 2, 2,142, 12, 27, 54,172,145,201,100, 66,110,110,238,224,101,203,150, 13,213,233,116,184,122, +241,164,108,226,235,239,150, 0,152,226,228, 46, 70,151,149,149,133, 68, 71, 71,183, 51, 24, 12, 91,167, 76,153, 66, 1,184, 3, +112,123,235,173,183,134,100,100,100,220, 68, 69,143, 66, 71, 10,137,234,157, 7,164, 38,147, 9, 46, 46, 46,136,138,138,146,219, +163,129, 93,187,118,117,149, 72, 36, 14,119, 24,176,217,108, 13, 14, 31, 62, 12,181, 90,141,146,146, 18, 24,141, 70, 88,173, 86, + 80, 74, 33, 22,139, 33,147,201, 16, 17, 17,209,192,209,131, 61,127,254,124, 86,120,120,120,196,202,149, 43, 15, 3,104,246,218, +107,175,161,117,235,214,104,210,164, 9,214,175, 95,143,197,139, 23, 39,113, 28, 23, 17, 29, 29,157, 81,159,158, 22,159,126,250, +233,197,221,186,117, 35, 43, 86,172,160,148, 82, 82, 89,205, 61,222,106,181, 30,125, 84, 93,247,173, 86,171, 70, 42,149,194, 98, +177, 64, 44, 22, 67, 36, 18, 85,189,138, 68, 34,248,249,249,225,215, 95,127, 21,151,150,150,138,115,114,114,148,107,214,172,121, +227,204,153, 51, 62, 0, 70, 61,202,244, 92,190,124,121,208,171,175,190,154, 44, 22,139,105,255,254,253, 95, 74, 74, 74,122,198, +199,199,231,224,145, 35, 71, 62, 7,208,204, 25,173, 39,158,120, 34,217,104, 52,254,169, 71,178,187,187,123, 85, 57, 34, 22,139, +225,229,229,181, 41, 34, 34,194,211,145, 7, 11, 63, 63,191,173,114,185,188,170,252,240,244,244,220,171,215,235,225,225,225, 1, +251,118,185, 92, 14, 31, 31,159,239, 34, 34, 34, 26,212,167,222,205,245, 25,142,227,170,140, 80, 53, 67, 84,222,185,115,103,252, +254,251,239,223, 57, 99,138, 40,165, 38,158,231,111, 51, 86,118,163, 37, 18,137,156,238,213,107,179,217, 36,132,144,246,246, 27, +123,109,235,245,128, 30, 42,149, 74,114,231,198,188,188, 60, 73,104,104,232,147, 78,220, 31,221, 21, 10,133,253, 65, 7, 25, 25, + 25,182, 70,141, 26,253,235,185,231,158,179, 0,192,191,255,253,239,127,101,101,101,149, 91,173, 86,145, 88, 44, 70, 86, 86, 22, + 66, 66, 66,220, 31, 98, 89, 91,163, 7,249,219, 27,172,202,155, 6,173,254, 90,221, 96,221, 89, 69,104,111,220,126,167,193,114, + 4, 65, 16,112,224,192, 1,168,213,234,170,168, 87,101,111,193, 26,183, 15, 25, 50,164,206, 79, 15, 50,153, 12, 46, 46, 46, 24, + 53,106,148, 50, 45, 45,109, 45, 0,255, 58,158,120,239,160,160,160, 99,177,177,177,193,201,201,201,120,235,173,183,176,116,233, +210,147,243,231,207,111,203,113, 28,215, 49,184, 72, 42,179,154, 58, 56,211,131,176, 50, 26, 22,189,125,251,246, 79, 62,248,224, +131, 86, 62, 62, 62,154, 39,159,124,242,119,147,201,164,155, 52,105, 82,255, 1, 3, 6,244,107,219,182,237, 45, 0,171, 28,212, +131, 32, 8,216,181,107, 87, 85, 39, 1, 23, 23,151,251,174,106,189,126,253, 58, 82, 83, 83,161, 82,169,160, 82,169,160, 86,171, +161, 86,171, 33,149, 74,161, 84, 42,157,214,139,142,142,206,232,208,161,195,168,149, 43, 87,158,237,220,185, 51, 90,181,106,133, +171, 87,175, 98,201,146, 37,224, 56,110, 92,116,116,116,106,125, 50, 87,253,251,247, 63,177,105,211, 38,191, 51,103,206, 32, 47, + 47,143,108,222,188,153, 18, 66, 56,158,231,119,166,165,165, 61,178, 6,175,130, 32, 72, 56,142,131,125,185, 51,130,101, 55, 91, + 10,133, 2, 30, 30, 30,152, 49, 99,134,100,232,208,161,131, 30,101,122, 46, 92,184,176,201,151, 95,126,185,102,237,218,181,123, + 94,122,233,165, 31,206,159, 63, 63, 78,167,211,157, 63,116,232,208, 39, 82,169, 84,112, 86,207, 98,177,248,156, 57,115,230,182, +232,185,205,102,131,205,102,131,213,106,133,197, 98,193, 23, 95,124,129, 97,195,134,105,224, 96, 79,100, 74,105,131, 85,171, 86, +129, 16,130,101,203,150, 85,149, 89,213, 53, 23, 46, 92,136,161, 67,135,106, 81,143,122, 55,215,119,115,101, 55, 65, 53, 45,117, +124,192,208,202,229,242,194,202,170, 65,200,100, 50, 68, 71, 71, 59, 29,189,170,118,222,207, 58,179,254, 40,177,151,193,213,154, + 41, 0, 0, 84, 42, 21,154, 54,109,234,140, 14,225,121, 30,148, 82, 88,173, 86, 24, 12, 6, 91, 92, 92,156, 45, 44, 44, 12, 0, +224,227,227, 99, 59,121,242,164,205,104, 52,138, 42,155,110,192,197,197,229,161,152,204,123,121,144,199, 34,130, 5,224,232, 29, +175,246, 3,127,160, 17, 44,123,168,248,151, 95,126,129, 90,173,254, 83, 99,246,187,109,175, 11, 82,169, 20, 58,157, 14,251,247, +239, 47, 63,119,238,220,171,206,252,118,203,172,230,128, 80,209, 9, 43, 48, 48,112,119,108,108,108,112, 73, 73, 9, 86,175, 94, +141,232,232,232,171,148,210,222, 85,209,174,222,196,216, 62, 16,201, 78,220,184,131,218,183,111,127,236,149, 87, 94,241,207,200, +200,192,204,153, 51,141,243,230,205,235,187,122,245,234,215, 85, 42, 21, 49, 24, 12, 55,219,182,109,123, 43, 62, 62,126,188,163, + 61, 8, 69, 34, 81,122,159, 62,125, 2, 0, 64,163,209,152,190,249,230, 27,169,139,139, 11, 94,120,225,133,242, 91,183,110,201, + 43,211, 35,207,153, 27,130, 88, 44,206, 28, 63,126,124,131, 90,210, 56,211,153,116,109,223,190,189, 15,199,113,155,167, 76,153, +130, 86,173, 90, 33, 46, 46, 14,173, 90,181,194,180,105,211, 48,127,254,252,117,237,218,181,235,113,238,220,185,155,245,193, 92, + 13, 25, 50,228,228,119,223,125,231,119,245,234, 85,164,167,167,227,135, 31,126, 72, 54,153, 76,211,100, 50,217,248,155, 55,111, + 62,234, 27, 43, 73, 75, 75,195,134, 13, 27, 96,179,217,240,210, 75, 47, 33, 40, 40,168,202, 96,221,186,117, 11,107,214,172,129, + 32, 8,120,245,213, 87, 17, 16, 16, 0,139,197, 34,143,136,136, 16, 63,170,168,203, 59,239,188,115,109,235,214,173,123, 82, 83, + 83,251,207,159, 63,191, 7, 33, 68,152, 54,109,218, 60,173, 86,107,187,143,243,132,178,178, 50, 24,141,198, 26,151,128,128, 0, +167,154, 47,216, 53,205,102,243,109, 58, 38,147,169,234,189,175,175,175,211,154,255,100,238,140, 92,217,151,202,200, 21, 7,224, + 23, 0, 78, 25,108, 74,169, 41, 32, 32,160, 42,130, 85,215,232,213,195,226, 97,246, 76,108,218,180,233, 17,173, 86, 59,232,242, +229,203,183, 69,177, 70,141, 26,101,110,220,184,241, 49, 39, 12, 86,158, 84, 42,117, 55, 26,141, 56,113,226, 4,154, 55,111, 46, + 41, 40, 40,136, 36,132, 76, 7,128,182,109,219, 70,102,100,100, 72,252,252,252, 0, 0,161,161,161, 40, 40, 40,200, 11, 8, 8, +120, 88,201, 86,163, 7,121, 44, 12, 22,165,180, 71,245, 87,103, 13,150,163, 5, 14, 33, 4, 37, 37, 37, 80,171,213,168, 28,204, + 12,106,181, 26, 64,197, 88, 51, 53,109,191,159, 11,251,183,223,126, 43, 95,177, 98,197, 8, 74,233,190, 58, 22,224,193,111,188, +241, 70,187,220,220, 92, 44, 90,180, 8,223,124,243, 77,154,201,100,234, 83,215,125, 34,132, 4,133,133,133,157, 56,114,228,136, +247,181,107,215,240,222,123,239, 33, 46, 46,110,208,128, 1, 3,218,226, 62, 6, 26, 61,121,242,100,160,253,125,199,142, 29, 45, + 90,173, 22,106,181, 26, 89, 89, 89, 18,181, 90, 45, 63,124,248,176,211,209,150, 83,167, 78,121, 61,200,140,214,166, 77, 27, 79, +158,231,143, 76,153, 50,165,241,168, 81,163,176,118,237, 90, 44, 93,186, 20,246, 54, 88, 0, 2,231,207,159,127,164, 83,167, 78, + 79,156, 58,117, 42,237, 17,154, 43,229,224,193,131,255,187,121,243,102,191,172,172, 44,100,100,100, 96,214,172, 89,201,233,233, +233, 79, 81, 74,111, 0,248,225, 81, 95,180,130, 32,208,183,223,126, 27,171, 86,173, 2,199,113, 24, 51,102, 12, 10, 11,255,151, + 93,220,220,220,106,250, 76,244, 40,163, 46, 98,177,152, 30, 59,118,108,254,147, 79, 62,137,212,212,212,254,122,189,126,201,152, + 49, 99, 30,234,121, 54,153, 76, 15, 92,243,206,200, 1,195, 57,131,117,230,204,153,205, 18,137,132, 2,168, 83,180,201, 78, 74, + 74,138,172, 77,155, 54, 70,153, 76, 38, 61,126,252,248,119,117,141, 94, 61,164, 50,164,122,207,195,211, 34,145,232,158,235,148, + 82,135, 13,102,147, 38, 77,222,246,247,247,239, 29, 22, 22,134,139, 23, 47, 74,100, 50, 25, 94,122,233, 37,243,128, 1, 3,204, + 98,177,120,178,163, 58, 10,133,226,146, 70,163,233,126,235,214, 45,152, 76, 38, 28, 56,112, 0,110,110,110,239, 15, 26, 52,232, +173,244,244,116, 24, 12, 6,169, 76, 38, 3,199,113, 32,132,224,169,167,158, 66, 94, 94,222,165,135,149,102,119,243, 32,143, 75, + 4,235,174,133, 73, 96, 96, 96,213,240, 10,246,234,136,234,213, 18,206, 62,205, 25,141,198,170,234, 38,187,153, 34,132,192,100, + 50,253,105,251,253,112,246,236,217,227,137,137,137,159, 83, 74,119, 59,251, 91,123, 27, 44, 0, 73,107,215,174,141, 61,125,250, +116,216,133, 11, 23,146,140, 70,227, 83,119,142,216, 94, 61,218,229,168,185, 74, 74, 74,194,198,141, 27,113,226,196,137, 4, 74, +233, 65, 0, 7, 31,228, 73,181,215,173,215, 39,120,158,255,247,232,209,163,171,155,171,171,132,144,127, 45, 93,186,116, 19,128, +102, 99,199,142, 69,126,126,126,224,138, 21, 43,102,227,142,225, 41,254, 74, 2, 2, 2,162,214,175, 95, 31, 40, 8, 2,114,114, +114, 48,121,242,228,155, 41, 41, 41, 79, 57, 59,136,236,195,228,204,153, 51,146,193,131, 7, 31, 4,208,243,210,165, 75, 16, 4, +225,120, 76, 76, 76,213,112, 17,247,250,204, 17,255, 86, 84, 84,196,107, 52,154, 26,111, 86, 18,137, 68,226,108,196,161,186,230, +241,227,199,231,125,241,197, 23, 63, 77,153, 50,229,234,125,106,214, 26, 53, 55,155,205,112,182,141,242,195,208,100, 6, 75,134, + 75,151, 46,217,141,213,152, 7,101,132,236, 17,172,127, 18, 27, 55,110, 76,251,246,219,111, 91,250,248,248,124,245,210, 75, 47, + 61,229,235,235,203, 73,165,210, 35, 98,177,248, 45, 0, 55,157, 72,187,113,174,174,174,215,196, 98,177, 40, 53, 53, 21, 87,175, + 94,181, 55,245,145,150,149,149,193,203,203, 11, 34,145, 8, 0,240,194, 11, 47,192,223,223,223,150,144,144, 48,142,229,232, 7, +104,176,142,239,154,130, 29, 71, 9,108, 14, 20,125, 53, 25,173,154,102,219, 78,190,184, 22, 27,183,167,192, 98, 21,110, 43,208, + 82, 46,173,195,198,237, 41,176,218,168,211,154, 53,113,237,218, 53,135,157,240,221, 52, 43, 43,133,195,163,163,163,131, 1,164, + 82, 74, 77,117,213,244,245,245, 93,114,244,232, 81,239,164,164, 36,172, 91,183, 14, 81, 81, 81,105, 70,163,177,175,147, 79, 70, +181, 30, 59,207,243,233, 93,187,118, 13, 0, 28,171, 22,252,171,102, 89, 39,132,136,178,178,178,240,213, 87, 95, 97,227,198,141, +215, 4, 65,136, 56,123,246,108,122,120,120,120,196,210,165, 75, 15, 23, 20, 20, 52, 43, 46, 46, 6,165, 52,239, 81,237,167, 92, + 46,143, 88,182,108,217, 96,173, 86, 75,142, 29, 59,102,123,249,229,151,111,222,184,113,163,151, 51,211, 32,253, 85,233,153,158, +158,254,239, 9, 19, 38,172, 48, 26,141,226,146,146,146,127, 59,250, 89,109,251,185,101,203,150,171, 77,155, 54,237,129,187, 15, +155, 32, 0, 56,113, 63,154, 95,126,249, 37, 0,132,222,143,230,253,152,161,191, 90,243, 65,158,247,191,155,166,193, 96,216,129, +138,113,169,156, 50, 86,142,236,231,233,211,167,127,168,212,222,237,136,246, 95,117,236,247,219, 51,177,182,253, 28, 55,110, 92, + 42,128,225,247,179,159,251,247,239, 79,122,254,249,231,231,182,110,221,122,142, 82,169, 68,124,124, 60, 4, 65,184,237, 1,157, + 16,130,145, 35, 71,226,245,215, 95,199,222,189,123,231,142, 24, 49, 34,233, 97,167,231, 63,198, 96,241, 60,127,115,104, 15,161, + 81,158,240, 36,108, 66,237,141,216,211,211,211, 51,142, 28, 57, 98,174,229,230,127,179, 91,104, 66,163,212,252,167, 97,181,145, +170, 2, 45, 33, 33, 1,221, 66, 19,144,154,255,244,109,255,149,156,156, 92,171,230,195,160,122, 84,170, 50,124,155, 88, 91,180, +235,219, 90,236,156,139,139, 75,187,184,184, 56,108,219,182, 13,203,151, 47, 79, 43, 43, 43,235, 86,215,249, 11,239,197,239,191, +255, 30, 88, 31, 51,154,217,108, 94,184,111,223, 62, 27,165,212, 69, 36, 18, 45,136,137,137,201, 0, 42, 26,190,235,245,250,110, + 27, 54,108,152, 4, 64,193,243,252,167,143,106, 31,221,220,220,230,246,232,209, 67,243,206, 59,239,228,237,216,177,227,183,164, +164,164,151, 41,165,197,245, 49, 61, 99, 98, 98,174, 3,232,229,236,103,181, 49, 98,196,136,196,123,229,247,250,162,105, 47, 59, + 36, 18, 9, 56,142, 3,207,243,144, 74,165,144,201,100, 48, 26,141, 40, 47, 47, 71,105,105,105,157, 34, 88,246, 94,178, 34,145, +168, 74,215, 62,123, 69, 89, 89, 25,139, 96, 57,199,152,191,169,118,157,249,187,244, 76,252,254,251,239, 63,154, 56,113,162,184, +115,231,206, 51,195,195,195,185,164,164, 36,100,102,102, 66, 44, 22,163,105,211,166,232,219,183, 47,130,130,130,132,221,187,119, +127, 54,108,216,176,143, 88, 86,126,128, 6,203, 98,177,116,235, 62, 54,237,184,209,248, 77,176, 3,225,198,116,163,209,216,165, +182,186,228,255,105,126, 29, 92,205, 5, 83,158,231,247,117,122,254,122, 31, 74,191,174,114, 87, 10,133, 34,213,108, 54,119,113, +166,126,250,129,194, 41,202, 71,246, 38, 38,212, 48,101,206,157,235,142,200, 93,188,120,113,114,255,254,253, 63, 43, 41, 41,201, +179, 88, 44, 47, 62, 12,115, 85,159, 57,127,254,124, 41,128,185,119, 49, 4, 57, 0, 30,249, 5,108, 48, 24,254,213,189,123,247, + 31,139,138,138,230, 20, 22, 22,238,103,197, 67,253,133,231,249,244,142, 29, 59, 6, 56,240, 61,135, 59,119, 60, 12, 77,198, 63, +147,191, 75,207,196,175,191,254,122,214,251,239,191,191,214,215,215,119, 67,183,110,221, 66, 27, 55,110,172,213,106,181, 40, 40, + 40, 40,202,205,205,189,178,107,215,174, 23,199,140, 25,195, 38, 56,127,208, 6,171,114, 60,162,144, 7,249,103, 15, 67,243,161, +240,228, 37, 25, 0,108,185, 99,120,210,218,214,107,185,224,182, 3,216,206,178, 92,189, 46, 20,211, 0,116,102, 41, 81,255,121, + 24,145,218,250, 26,253,101, 48, 30, 38, 11, 22, 44,184, 14,160, 11, 0,140, 28, 57, 82, 4, 0, 91,182,108,177,213,195, 93, 13, + 7,224, 9,192, 62,254,160, 39, 0,123,144, 35, 11, 14,142, 27, 89, 47, 12, 22,131,193, 96, 48, 24,140,127, 14,245,212, 88,217, +241, 36,132,236,164,148, 14, 2, 0,251,251,234,219,234, 27, 28,203, 82, 12, 6,131,193, 96, 48, 24, 15, 22, 2,160,117, 77, 31, + 56,211, 59,128, 16,210,218,217, 63,118, 96,198,112,166,201, 52,153, 38,211,100,154, 76,147,105, 62,102,154,181,105,223,229,247, + 3,107,137, 96,237,170,119, 6,235, 97,246,136, 97, 93,151,153, 38,211,100,154, 76,147,105, 50, 77,166,249, 0,248,219, 25, 44, +214, 6,139,193, 96, 48, 24, 12, 70,125,167,108,250,244,233, 51, 9, 33, 59, 1, 96,250,244,233, 51,235,251, 14, 51,131,197, 96, + 48, 24, 12, 6,163,190,115, 60, 50, 50,178, 52, 50, 50,210,222,160, 61, 11, 21,181,112,131,240,191,158,133,127,111,131, 53,163, +119,240,147,190,254,126,223,229,230,228,196, 26,203,141,175, 68, 30,184,145, 91,151, 63, 38,132,184, 75,165,210,127,169, 84,170, +222,148,210, 70, 34,145,232,114, 65, 65,193, 1,139,197,242,125,125, 29,220,145,241,207,162,125,251,246,109,164, 82,233,251,132, +144,206, 86,171,213,159,231,121, 3,128, 83, 70,163,113, 97,108,108,108, 44, 75,161,199, 23,189, 94,191, 11,192,128,202,213,221, + 49, 49, 49, 3, 89,170, 60,126,116,236,216, 49,195,102,179, 53,112,244,251, 18,137, 36, 91, 42,149,250, 60,170, 73,211,255,225, +152, 0,156,254, 59,237,112, 93, 34, 88, 47,189,252,218, 24,191,252,212,120,191,245,155,246, 52,155,209, 59, 56, 34,242,192,141, + 91,206, 8, 40, 20,138,127,181,110,221,122,241,226,197,139,221,131,131,131,137, 66,161, 64,122,122,122,243,115,231,206, 13,155, + 51,103,206,108,158,231,199, 89, 44,150, 95,239,231,192, 8, 33, 46,110,106,241,251, 57, 69,150, 25, 44, 95, 50,156, 97,228,200, +145,162,148,148,148, 57,158,158,158,239,189,255,254,251,178,144,144, 16,168,213,106,100,102,102, 6,198,199,199, 7, 44, 95,190, +124,112,215,174, 93,151, 72, 36,146, 15, 88, 65,251,216, 24, 42, 47, 0, 81,168, 24, 83,231, 45, 0, 3,246,238,221, 11,155,205, +134,129, 3, 7, 14,208,235,245, 77, 0, 44, 82,169, 84, 66, 73, 73,201, 43,246,153, 8, 24,127,111,108, 54, 91,131,131, 7, 15, + 66,163,209,212,116, 15,185,109, 61, 39, 39, 7, 3, 7, 14,116,197, 35,156, 52,157,241,247,162, 46, 6,107,247,174, 31,127,120, +101,112,143, 80, 50,102,168,190,233,198, 95,206,156,152,209, 59,184,123,228,129, 27, 41, 14,154,171, 55, 39, 76,152, 48,111,238, +220,185,242,203,151, 47,227,226,197,139,176, 90,173, 80,171,213,104,211,166, 13,183,123,247,110,159,183,222,122,235, 71,169, 84, +250,178,201,100,218, 86,215, 3,243,118, 21, 45, 84, 41, 68, 47, 72,197,226, 83, 38,171,117, 71,125, 76,252, 78,157, 58,237,183, + 88, 44,243, 99, 99, 99,127,251, 27,221,136,158,144, 72, 36,179,165, 82,105,191,199,213, 92,220,188,121,115,118,183,110,221,222, +251,232,163,143,100, 55,110,220, 64,124,124, 60,210,211,211, 17, 28, 28,140,144,144, 16,178,120,241, 98,249,226,197,139,223,248, +227,143, 63, 56, 0, 83,157, 48,253,156,143,143,207,248,158, 61,123, 62,235,225,225,161, 75, 75, 75, 43, 56,126,252,248,118,131, +193,176,146, 82, 90,167,180, 36,132,112, 30, 30, 30, 99, 7, 14, 28,248,172,187,187,187, 91,122,122,122,238,129, 3, 7,182,103, +101,101,173,190,159, 89, 16, 8, 33, 62, 0,218, 2,112,175,220,148,222,176, 97,195,184, 27, 55,110,100, 62, 64, 77, 67,195,134, + 13, 47,214, 69,179, 83,167, 78,126, 86,171,245, 0,128,102,247,248,218, 69,142,227,122, 87, 14,112, 92, 27, 81, 11, 22, 44, 24, +162,209,104, 48,109,218,180,248,160,160, 32,104,181, 90,172, 88,177, 2,174,174,174, 16, 4, 33,126,225,194,133, 36, 37, 37, 5, +139, 22, 45, 90,131,255, 69,183, 24,247, 62,231, 91, 0,184, 0, 24, 69, 41,205,174,182,221, 3,192,207, 0, 50, 41,165,195, 31, +229, 62, 74, 36, 18,236,216,177, 3, 98,177, 24, 60,207, 35, 55, 55, 23, 1, 1, 1, 85,211, 35,241, 60, 95,245,202, 96, 56,149, +255,239,213,139,112, 70,239,224,137,173,195,218, 47,148, 72,120,133, 96, 51, 67,176, 88, 32, 88,205,224,168, 21, 45, 27,186,160, +145,151, 20,197, 69,197, 88,191,239,106, 97,118,161,169, 83,228,129, 27,241,181, 92,108, 13,195,195,195,207, 30, 62,124, 88,119, +240,224, 65, 92,185,114, 5,159,125,246, 25, 0, 64,165, 82, 97,207,158, 61, 16,137, 68,160,148,162, 95,191,126, 89, 6,131,161, + 57,165, 52,183, 14, 23,117, 80,247, 14,254, 49,219,254,211,221,173,213,176, 31,111,222,202, 53, 53,162,148,214,187, 1,212,244, +122, 61, 21,139,197,165, 22,139,101,240,223,193,100,233,245,250, 39,120,158,223,107,177, 88,148,106,181, 90,113,248,240, 97,227, +227,118, 65,180,111,223,190,141,155,155,219,201,159,126,250, 73,126,234,212, 41,228,229,229, 33, 51, 51, 19,111,189,245, 22,150, + 47, 95,142, 86,173, 90, 65,165, 82, 65, 42,149, 98,226,196,137,101, 37, 37, 37, 61,162,163,163,207, 56, 98,132,186,119,239,190, +105,227,198,141,193, 86,171,149,163,148,194, 98,177, 32, 37, 37,197, 54,125,250,244,228,216,216,216, 81,206,154, 44, 66, 8,215, +181,107,215, 13, 27, 55,110,108, 44,149, 74, 57,171,213, 10, 65, 16,112,245,234, 85,219,204,153, 51,147, 98, 98, 98, 94,168, 75, +190, 39,132,180, 87, 42,149, 45, 38, 78,156,152, 61,116,232, 80, 51, 0,196,196,196,144,179,103,207,234, 26, 54,108,152, 52,123, +246,236,179,117,208,212, 43,149,202,208,201,147, 39,103, 13, 24, 48,192, 42,145, 72,132,147, 39, 79,138, 46, 92,184,160,107,212, +168, 81,226,204,153, 51,255,112, 50, 47,198,207,152, 49,163,169, 88, 44,134,197, 98,129,213,106,133,205,102,131,213,106,173,122, +111, 52, 26,177,126,253,250,139, 49, 49, 49,173, 28,208,219, 51,106,212,168,126,109,219,182, 69,104,104, 40, 68, 34, 17,226,227, +227,113,237,218, 53,200,229,114,180,110,221, 26, 10,133, 2, 63,255,252, 51,190,255,254,251,189, 49, 49, 49,253,217,237,195,161, +243,126, 10, 64, 71, 0,113, 0,122, 82, 74,179, 43,205,213,111, 0, 90, 2,248,157, 82,218,237, 81,150,193,191,253,246, 27,142, + 29, 59, 6,177, 88,140,125,251,246, 97,209,162, 69,248,241,199, 31, 17, 28, 28,252, 39,131, 53,124,248,112,155, 66,161, 80, 61, +142,101, 31,227, 47,142, 96,249,120,123,124,240,236,240,167, 21,176, 89, 1,115, 9, 96, 46, 5, 53,151,130,154, 74, 64,164, 10, + 80, 75, 57, 84,162, 28,252,187,183,167,118,235,137,172, 75, 51,122, 7, 15,140, 60,112, 99,239,221,244,180, 90,237,172, 21, 43, + 86,232,206,159, 63,143,248,248,120,124,249,229,151,248,248,227,143, 33,145, 72,144,151,151,135, 33, 67,134,224,248,241,227, 48, +153, 76,248,240,195, 15,221,166, 77,155, 54, 25,117,152,163,206,219, 93,188,252,135,245,139,221,220, 20,217,120,121,104,180,251, +178, 31,146, 38, 2, 88, 82, 31, 79,192,180,105,211,148, 11, 22, 44,248, 37, 44, 44,172, 94,155, 44,189, 94,255,132, 76, 38,219, + 59,107,214, 44,213,172, 89,179,108, 15, 72,179,149, 88, 44,222,108,177, 88,222,141,141,141,221, 87, 31,142, 83, 38,147,189,249, +222,123,239,201, 83, 83, 83,145,159,159, 15,153, 76, 86, 53,203,124,229,231,224, 56, 14, 82,169, 20, 99,198,140,145,175, 89,179, +102, 10,128,231,107,211,245,242,242, 26,191, 97,195,134, 96,179,217,204,149,148,148, 84, 61, 29,183,106,213, 74, 52,117,234,212, +128,119,222,121,103, 2,128,165,206,236,171,155,155,219,152, 13, 27, 54, 52,150, 74,165, 92,122,122, 58,186,118,237,138,211,167, + 79,163, 99,199,142,162,169, 83,167, 6, 78,158, 60,249, 53, 0,203,157,141, 50, 41,149,202, 86, 71,143, 30, 77,241,245,245,173, +218, 30, 28, 28, 76,251,247,239,159, 27, 31, 31, 31, 26, 27, 27,155, 19, 22, 22,150,226,132,166,159, 82,169,108,190,127,255,254, +244,143, 62,250,168,215,242,229,203,135, 2, 64,120,120,248,142,121,243,230, 29,204,206,206,110,121,250,244,233,156,142, 29, 59, +166, 57,177,171, 77, 13, 6, 3,246,238,221,123,183,255, 68, 96, 96, 32, 42,111,226,142, 48,249,251,239,191, 79,200,203,203, 19, +199,196,196, 64, 46,151, 67,161, 80, 64,161, 80, 64, 46,151,227,214,173, 91, 48,153, 76,216,178,101,139, 21,192, 27,236,214,225, + 48, 67, 1, 28, 6,208, 10,192, 33, 66,200,115, 0,126, 4,208, 2, 64, 60,128, 17,143,122, 7,173, 86, 43,120,158,135,193, 96, + 64, 84, 84, 20, 70,143, 30,141,240,240,112, 20, 22, 22,130,231,249,219, 22, 6,195,105,131, 69, 8,161,148, 82, 98,127,181,127, +152,126, 43,123,254,218,168,111,254, 35,229, 57,190,119,215, 80,184,202,172, 32, 10, 55, 72,122, 76, 7,113, 9, 2, 0,208,220, + 68,152,246, 77,199,136,118, 57,220,122, 35,249,121, 70,239, 96,207,200, 3, 55,138,106,250, 51,142,227, 58, 7, 6, 6,226,232, +209,163, 8, 14, 14,198,172, 89,179,208,188,121,115, 40,149, 74,100,100,100,160,164,164, 4, 42,149, 10, 54,155, 13, 97, 97, 97, + 34,141, 70,243,148,179, 6,139, 16, 18, 54,254,185, 78, 29,197,218,230,120,162, 95, 23,236,255,186,135,106,237, 78,195, 12, 66, +200, 55,148,210,210,250,118, 2,158,121,230, 25,100,100,100, 40, 55,108,216, 80,103,147,213,169, 83,167,253, 86,171,245,233,218, +190,167, 80, 40,126, 59,118,236, 88,207,186,154,171, 53,107,214,168, 92, 92, 92,254,212, 54,225, 62,204,213,127,199,140, 25,163, +221,176, 97,195, 79, 97, 97, 97,195,234,131,201, 34,132,116, 13, 9, 9, 65,114,114, 50, 50, 50, 50, 96, 52, 26,145,145, 81, 81, +195,148,154,154, 10,127,127,127,184,186,186,194,223,223, 31,205,154, 53, 35, 28,199,117,114, 68,183,103,207,158, 67, 1,112,137, +137,137,200,202,202,130, 78,167,131, 74,165,130,159,159, 31,122,246,236, 41,110,212,168,209, 0,103, 13, 86,223,190,125,159, 85, + 40, 20, 92,114,114, 50,146,146,146, 96, 50,153,144,144,144, 0,157, 78,135, 94,189,122,241,141, 27, 55, 30,228,172,193, 2,208, +250,181,215, 94,203,172,110,174,236,168, 84, 42, 18, 26, 26,154,235,226,226,210, 1, 64,138, 51,154,111,188,241, 70,198,103,159, +125,214,253,192,129, 3,211,236, 27, 15, 30, 60,248,254,244,233,211,177,108,217,178,163,110,110,110, 29, 0, 56, 99,176,208,181, +107,215,140,192,192,192, 34,169, 84, 10,251, 34,145, 72,170,222,203,100, 50, 50,108,216,176,198, 14,228,197, 93, 0, 6,180,106, +213, 10,175,191,254, 58,126,250,233, 39,172, 91,183,174,234,243,103,159,125, 22,195,135, 15, 71,113,113, 49,188,188,188,196, 6, +131, 33, 81,175,215,215,139,134,239,132,144,112, 0, 95,160,162, 1,240, 7,148,210, 83,245,169,124,163,148,102, 16, 66, 34,170, +153,172,179, 0,100,149,230, 42,130, 82,250,200,219,178,217,108, 54,240, 60,143,200,200, 72,152, 76, 38,196,196,196,224,217,103, +159,181,223,179,160, 82,169,176,108,217, 50,120,120,120, 48,199,240,240,242,113,141, 30,228,177,142, 96, 1, 88,122, 51, 53,187, +221,240, 65,157,199,186,105, 21, 16,138, 12,144,244,154,131,243,185, 74,124, 21, 85,113, 47,124,123, 68, 24, 90, 63,253, 9,140, +223,244, 65,239,134,102,233,234, 60,249, 84, 0,179,106, 18,243,240,240,240,176, 90,173, 85,153,214,205,205, 13, 10,133, 2,217, +217,217,120,243,205, 55,177,119,239, 94,152, 76, 38, 72, 36, 18,132,132,132,192,108, 54, 55,114, 58,122,229, 42, 94,253,229,127, + 62,115,201, 73,252, 14, 49, 87,242,161,212,249,227,131,215, 58,184,206,249,250,204,108, 0,239,215,199,147,208,178,101, 75,188, +245,214, 91,202, 37, 75,150,212,201,100, 89,173,214,185, 98,177,248,137,119,223,125, 87, 49, 98,196,159, 31, 8, 47, 94,188,136, + 9, 19, 38,148,149,150,150,126, 90, 23,115, 37,149, 74,247,174, 94,189, 90,165,211,233,144,156,156,252,192,204,213,226,197,139, +181,141, 26, 53, 2,207,243,242,111,191,253,182, 94,152, 44,171,213, 26,168, 84, 42,145,157,157,141,183,223,126, 27,213,171,208, +237,213,217, 0, 16, 31, 31, 15,127,127,127,148,151,151,251, 57, 24,109,114,165,148,226,213, 87, 95, 69, 74,202,255,188,137,175, +175, 47, 82, 83, 83, 97,181, 90,221,156,221, 87, 55, 55, 55, 55,139,197,130, 30, 61,122,160,188,188, 28, 0,240,220,115,207,129, +231,121,100,102,102,194,106,181,186,215, 33, 9, 60, 6, 14, 28,104,184,219,135, 42,149,202,226,234,234,218,208, 73, 77,247, 65, +131, 6,165,173, 88,177, 98,200,157, 31, 68, 71, 71, 15,209,233,116, 7,220,220,220, 66,235,176,175,130, 76, 38,131, 76, 38, 3, +207,243,118, 83, 5,169, 84,106,175,214,113,116, 20,229, 1,123,247,238,133, 86,171,197,169, 83,167,160, 80, 40, 0, 0,253,251, +247,127, 67,167,211,245, 40, 47, 47, 31,190,115,231, 78,228,231,231, 35, 36, 36, 4, 13, 26, 52,192,169, 83,167,234, 75, 27,172, +133, 0,186, 86,190, 95, 14,160, 93,125, 43,223, 42, 77,214, 72, 0,103, 42,205,149, 9,192,179,245,193, 92,217, 13,150, 72, 36, +170,138, 84, 43,149, 74,132,133,133, 85, 25,172,178,178,178,170,246, 89, 12,134,211, 6,171, 38,231, 56,163,119, 48,199, 17,178, +102,248,128,142, 99, 91,250,171, 97,204, 78,132, 84,237, 6,226,210, 16, 95, 69,237,195,165,164,138,166, 81, 95,253, 24,139,181, + 51,250,130, 40,221,224, 93,118, 5, 90,169,116,216,221, 12, 86, 78, 78, 78,177,217,108,118, 83, 40, 20, 16,139,197,144, 72, 36, +200,206,206,198,255,253,223,255,225,135, 31,126, 64,195,134, 13, 97,181, 90, 33,149, 74,145,149,149, 5,137, 68,226, 84,239, 68, +177,152, 12,156,243, 86,255, 96,149,123, 83,228,196,126, 92,177, 81, 27,134,215,158, 19, 73, 63, 95, 31, 55,134, 16,242, 57,165, + 52,179,190,157, 4,181, 90,141,118,237,218,225,133, 23, 94, 80,110,220,184,113, 29, 0,127,103,126, 31, 19, 19,243,187, 94,175, +239,243,197, 23, 95,236, 79, 79, 79, 87,180,111,223, 30,106,181, 26,106,181, 26,137,137,137,248,248,227,143,203,141, 70,227,160, +186, 68,199,196, 98,241,183,175,188,242,138, 74,171,213, 34, 49, 49, 17,110,110,110,247,117,172,122,189,190, 21,207,243,255, 93, +188,120,177,182,113,227,198,184,124,249, 50,244,122, 61,188,189,189,229,145,145,145,143,220,100, 73, 36,146,212,172,172,172,198, + 1, 1, 1, 88,179,102, 13, 56,142,131,193, 96,192, 7, 31,124,128,200,200, 72,116,234,212, 9, 26,141, 6, 1, 1, 1,184,122, +245, 42,228,114,121,186, 35,186,105,105,105,185, 0, 26,236,217,179, 7,217,217, 85,109,125, 17, 24, 24,136,220,220, 92, 24,141, +198, 28,103,247, 53, 45, 45, 45, 7,128,215,185,115,231,144,148,148,132,126,253,250,225,231,159,127, 70,135, 14, 29, 96,179,217, + 96, 50,153,114,234,144, 4, 54,145, 72, 68,239,241,164, 73, 0,184, 58,235, 91,239,165,137,138, 41,187,156,213,132, 72, 36,162, +119, 51, 87,246,117,103,110,178, 43, 86,172,168,170, 22, 4, 0,169, 84,250,196,148, 41, 83,134,223,237,161,168,158,160,171,158, +206,245, 52, 58,209, 0,192, 15,168,232,161,105,174,124,253,158, 16,210,179,122,195,247, 71,133, 32, 8,144, 72, 36,136,140,140, +196,232,209,163,225,233,233,137, 15, 63,252, 16, 60,207, 67, 44, 22,131,227, 56,136, 68, 34,102,176, 30,174, 9,127,236,162, 87, + 64,229,100,207,213,195,115,183,153,171,126,250,177, 45,252, 21, 56, 27,123, 30, 98, 99, 46,168,177,232, 30, 37,148, 5, 68,162, +130, 78, 41,246,191,199,133, 22,155,148,148, 4,157, 78, 87, 85, 0,182,110,221, 26, 39, 78,156, 64,211,166, 77, 97,179,217,170, + 10,201,184,184, 56,152,205,230,163, 78, 92,196, 34, 15,173,104,241,251, 51, 63,214, 32,109, 13, 92, 52, 82, 60,213,185, 49,160, +106, 1, 17, 47,197, 23, 31, 14,114,243,242,208,126, 85, 31, 79,130, 90,173, 70,106,106, 42, 54,109,218, 84,106, 52, 26,199,212, + 69, 35, 38, 38,230,119,139,197,210,231,135, 31,126, 40, 75, 74, 74,130, 66,161, 64, 66, 66,130,221, 92, 13,172,107,251, 46,171, +213, 58,110,213,170, 85, 37, 59,119,238,132, 90,173,174,177, 59,179,179,145,171, 55,223,124, 83,211,164, 73, 19, 36, 38, 38, 66, +167,211,193,221,221, 29,221,186,117,195,146, 37, 75,228, 10,133,226,167,176,176,176,190,143,176,176, 61,126,245,234, 85,170,211, +233,208,172, 89, 51,180,106,213, 10, 29, 59,118, 4, 0,180,109,219, 22,205,155, 55, 71,112,112, 48, 0,224,218,181,107,128,131, +227,178, 28, 59,118,108,123,124,124,188,205,219,219, 27,173, 91,183,134, 94,175, 71,231,206,157, 17, 20, 20,132,149, 43, 87,154, +111,222,188,233,244, 52, 15, 7, 15, 30,252,249,226,197,139, 86, 31, 31, 31,132,133,133, 85, 93, 79, 62, 62, 62,136,138,138,170, +147, 38,128,228,115,231,206,137,238,145, 87, 53, 0,156,141, 60,164,198,196,196,112,157, 59,119,254, 83,111,222,240,240,240, 29, +106,181, 90, 7, 32,221,233,194,139,227,168, 84, 42,133, 92, 46,175, 42, 55,236,235,246,109, 14,178, 99,224,192,129,216,185,115, +103,149,193, 26, 54,108, 24,140, 70,227,115, 0, 48,111,222, 60, 16, 66, 64, 8,193,156, 57,115, 0, 0,165,165,165,245,165,145, +243,219, 0,206, 3, 72, 4, 48,173, 30,154, 43, 47, 84, 84, 15,134,162,162, 90,176, 67,229,171,189, 77,214, 35,175,119,163,148, +130,231,121, 52,109,218, 20,211,166, 77,195,238,221,187,145,144,144, 0,155,205, 6, 74, 41, 56,142, 99,109,176, 30,126, 62,185, +205,131, 60, 86, 6,235,207, 7,139, 79,134,247,109, 55,182,133,159, 12,231, 98,227,240,203,233,140, 43, 89, 57,249, 16, 50, 46, + 64,200,186,140,183, 71,132,161, 69, 67, 55,180,104,232,134,183, 71,132, 65,200,140, 3,205, 75, 4,149,185, 34,187, 4,119,173, + 94,200,205,205, 93,248,201, 39,159,228,185,185,185, 65, 46,151, 67, 42,149, 34, 53, 53, 21, 45, 91,182,172, 90,151, 74,165, 16, +137, 68,152, 53,107, 86, 86, 86, 86, 86,148,163, 7,162, 82,112,175,205,255,224,121, 47,137, 76, 3,228, 30,133, 86,171,198,154, +168,255, 0, 70, 3,192, 73, 49,184,119, 59,145,143,151, 75, 79, 66, 72,179,250,118, 18,146,147,147, 49,103,206,156,210,178,178, +178,251,106,232, 30, 19, 19,243,187,217,108,238, 19, 21, 21, 85,182,115,231, 78,124,250,233,167,247,101,174,170, 25,183,126,235, +214,173, 43, 73, 78, 78,134, 90,173,190,159,232,208,116,171,213,170,253,242,203, 47,133,167,159,126,218, 54,105,210, 36,219,184, +113,227,108,195,135, 15,183,245,238,221,219, 54, 97,194, 4,155,209,104,148, 41,149,202, 5,143,234, 92, 24,141,198,165,203,151, + 47, 47,231, 56, 14,106,181, 26, 82,169, 20,158,158,158, 85, 70,216,222,198,199,108, 54,227,235,175,191, 46, 43, 43, 43,115,200, +180,231,228,228,172,153, 58,117,234,141,253,251,247, 91, 10, 11, 11, 1, 0, 6,131, 1,159,126,250,169, 57, 42, 42, 42, 45, 63, + 63,127,165,179,251, 90, 84, 84,244,237,212,169, 83,147,118,237,218,101,225, 56, 14,121,121,121,208,233,116,248,244,211, 79,205, + 43, 87,174, 76, 43, 44, 44,116, 90,179, 75,151, 46,215,210,210,210, 52, 70,163,241, 79, 5, 29,207,243, 68, 46,151,119, 4,112, +200, 25,205, 14, 29, 58, 92, 75, 74, 74,210,126,242,201, 39, 71,122,247,238, 61, 95,163,209, 36,104, 52,154,132, 94,189,122, 45, + 88,190,124,249,111,149,154, 7,156,221, 87,158,231,133,106,237,173,170,150,234,109,178, 28,204,227, 67, 1, 52,177, 88, 44,214, +214,173, 91, 67,169, 84,226,217,103,159,133, 68, 34, 1, 0, 76,159, 62, 29,148, 82, 80, 74,171, 12, 86,113,113,113,121, 61,121, +242, 63, 76, 41,109, 75, 41,109, 76, 41,173,143,157,100,126,172,102,174, 34, 42,231,174,139,168,102,178,182,215, 23,131,197,243, + 60, 94,124,241, 69, 28, 63,126, 28,161,161,161,127,106,224,206,113, 28,115, 66, 12,167,168,170, 34,172,254,234,229,174, 26,215, +194, 71,140,115,103, 47, 98,103,108,254, 90, 74,177, 45, 54,201,184,179, 95,112, 17,204, 63,140, 66,235,145, 27,176,118, 70, 69, +144, 65,200,140,131,121,203, 75, 32, 74, 15, 92, 45, 84,161,204,156,191,235, 30, 25,249,180,171,171,235,230,245,235,215,191, 50, +118,236, 88,169, 32, 8, 80, 40, 20,152, 50,101, 10, 40,165, 85,230,106,226,196,137,197,153,153,153, 95, 82, 74,175, 57,232,126, + 21,126,158,210, 15, 95,124,117,150, 28, 41, 43, 0, 78,130,108,180, 71,219,238,175, 32, 51,233, 4, 80,114, 9, 32, 18, 68,205, + 27,239, 49,100,220,231, 43, 1, 60, 89, 95, 78,192,229,203,151, 49,123,246,236,251, 54, 87,213, 13,145, 94,175,239,179, 99,199, +142,117, 70,163,241,213, 7,168,217,111,254,252,249,123, 27, 52,104,160,170,171,142,159,159,223,232,236,236,236, 87, 28, 9,156, + 61,170,243, 17, 27, 27, 27,219,185,115,231,229, 95,124,241,197,196,183,223,126, 91,174, 80, 40,160,213,106, 17, 31, 31,111,239, +149,134,178,178, 50,204,152, 49,163,204, 98,177,172,141,142,142, 62,225, 96, 33, 46, 16, 66, 94,156, 56,113,226,248,166, 77,155, + 14, 17, 4,193,221,100, 50,229, 36, 39, 39,239, 42, 44, 44,172,211, 56, 88,149,154, 47, 76,154, 52,105,108,147, 38, 77,158,181, + 88, 44,238, 22,139, 37, 39, 53, 53,117, 71, 65, 65,193,154,186,104, 30, 63,126, 60,107,245,234,213,137,183,110,221,106,233,227, +227, 83,160,211,233, 76, 38,147, 73,164, 86,171, 53, 82,169, 84, 15,224, 4,128, 75,206,104, 70, 71, 71,103, 68, 69, 69, 37, 25, +141,198,102,171, 86,173, 58,170, 82,169, 14, 18, 66,136, 68, 34,113, 85,169, 84, 79, 1, 56, 2,224,170,179,251,106,175, 34,172, +169,129,187,221, 28, 57,193,226, 5, 11, 22,136,229,114, 57, 76, 38, 19, 74, 74, 74,144,147, 83, 81,195, 58,111,222, 60,204,152, + 81, 49, 94,241,236,217,179, 49,103,206, 28,148,150,150,202,217,237,195, 33,114, 80, 17,229, 29,106,111,115, 85,173,225,251,143, + 0,242,235,147,193,146, 72, 36, 8, 10, 10, 98,230,234,175, 63, 7,183,121,144,199, 38, 50, 87,211, 56, 88, 51,122, 7, 79,242, +115, 21,207, 48,228, 91,183, 81,138,119, 0, 80, 0,123,159,105, 90,220,167,165, 23, 5,168, 21, 68, 91,113,179,161,197, 6, 16, +149, 55,242, 4, 29,190, 57,148,121,171,204,100,109, 19,121,224, 70,246, 61,204, 16,239,226,226,178,164, 73,147, 38, 35, 63,251, +236, 51,151,208,208, 80, 40,149, 74, 80, 74,113,254,252,121, 76,152, 48, 33, 55, 43, 43,107, 69,110,110,238,135,244, 94,131,116, + 85,195, 83,199,207, 91,254, 81,255,119,134,143,253, 63, 9,174,188, 11,136,117,128, 71,111,220, 34, 61,225, 45,254, 3, 48,221, +170,216,198,235,208,255,197,121,185,123, 15, 69, 63, 67, 41,253,239,163, 78,124,189, 94, 79,229,114,249, 3, 51, 87,127,193,254, + 62, 33,151,203,247, 26,141, 70,165, 74,165, 82, 60,174, 99,193,232,245,122, 94, 42,149, 70, 74, 36,146,215, 71,143, 30,173, 8, + 13, 13, 69, 80, 80, 16, 50, 51, 51, 17, 31, 31,143,229,203,151,151, 11,130,176, 58, 47, 47,239,189,139, 23, 47,154, 31,199, 52, +184,122,245,170,111, 72, 72, 72, 39,145, 72,212, 4, 21, 3, 69,166, 3,216, 83, 23, 35,100, 39, 49, 49,209, 47, 32, 32,160,147, + 68, 34,105, 92,169,153, 6, 96, 95, 93, 52,245,122,125,252,107,175,189,230,209,187,119,239,156,234,198,202,222, 6, 11, 0,162, +162,162, 92,215,172, 89,147,225,224, 56, 88, 63, 13, 30, 60,248, 25,185, 92,142,173, 91,183, 90,189,188,188,196, 46, 46, 46, 88, +187,118,237,221,202,177,199,238,102,240, 79, 68,175,215,211, 5,179,250, 99,195,246, 84, 56,114,187,137,143,143,183,201,229,114, + 54, 14, 22,163,238, 6,171, 38,102,244, 14,214, 1,248,169,157, 47, 34,244, 13,101,240,112,145, 65,196,203, 80, 80, 14, 92, 54, + 24,113,236,114, 97,138,197, 74, 7, 69, 30,184,113,193,193,168, 83,103, 31, 31,159,153, 54,155,173, 21,199,113, 74, 74,105,177, + 72, 36, 58,107, 48, 24, 62,162,148,198, 57,115, 16, 46, 26,209, 85, 87,149, 72,199, 75,165,212,102, 21, 0,112, 0,199, 1,132, + 3, 32,170,124,173, 88, 47, 43, 51, 75,108, 2,217,150,145,149, 61,254, 81, 39,126,247,238,221,247,151,148,148,252,237, 70,114, + 87, 40, 20,179, 69, 34, 81,191,199,125,154,152,240,240,240, 14, 10,133, 98,166, 32, 8,225,229,229,229,222, 10,133, 34,131, 16, +114,166,168,168,104,222,217,179,103, 79,178,226,227,209,241,160, 71,114,215,235,245, 30, 0,150, 1, 80, 2,120, 19, 64,162,191, +191, 63,126,254,249,231, 26, 35, 88,204, 96, 61, 30,116,238,220, 57,247,228, 79,125, 93,215,238, 15,116,232,251,235,214,173, 51, + 28, 57,114, 36,224,126,102, 73, 96, 48,131,117, 55,147, 69, 0, 60, 7, 96, 36, 1, 90, 19, 2,169, 64, 17, 15, 96, 63,128,175, + 35, 15,220, 40,187,195, 68,181,174,172,115,127,112, 59,204, 52,153,230, 35,208, 36,132,112,142, 20,170, 44, 61, 31, 15, 77,189, + 94,191,189,184,184,120, 72, 66, 66,194,221, 52,110, 51, 88, 44, 61,255,158,154,122,189, 62, 68, 38,147, 29, 50, 26,141,181, 58, + 44,133, 66,145,106, 54,155,187,156, 58,117, 42,141,165,231,195,209,124,220,112,106, 46,194,200, 3, 55, 40,128,205,149, 11,131, +241,143,129, 61,177,254,179,136,137,137, 25,234,235,235, 27,235,238,238,222,184,188,188, 92, 90, 94, 94, 46,169,254, 48,170, 80, + 40,178, 88, 42, 61, 22,231,249, 58,128, 32,150, 18,140, 71,110,176, 24, 12, 6,227,159,130,193, 96, 8, 99,169,192, 96, 48,234, + 10,235, 26,193, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, + 24, 12, 6,131,193, 96, 48,234,206,255, 15, 0,181,216,148,115,199,248,129, 71, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, 0}; diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h index 5012a71a647..b00ac5e58cb 100644 --- a/source/blender/editors/include/UI_resources.h +++ b/source/blender/editors/include/UI_resources.h @@ -64,6 +64,7 @@ typedef enum { ICON_BLANK006, ICON_BLANK007, ICON_BLANK008, + ICON_BLANK008b, /* ui */ ICON_FULLSCREEN, @@ -91,6 +92,7 @@ typedef enum { ICON_DOTSDOWN, ICON_LINK, ICON_INLINK, + ICON_BLANK012b, /* available */ ICON_BLANK016, @@ -118,6 +120,7 @@ typedef enum { ICON_BLANK038, ICON_BLANK039, ICON_BLANK040, + ICON_BLANK040b, /* BUTTONS */ ICON_LAMP, @@ -145,6 +148,7 @@ typedef enum { ICON_BLANK050, ICON_BLANK051, ICON_BLANK052, + ICON_BLANK052b, /* EDITORS */ ICON_VIEW3D, @@ -172,6 +176,7 @@ typedef enum { ICON_BLANK059, ICON_BLANK060, ICON_BLANK061, + ICON_BLANK061b, /* MODES */ ICON_OBJECTMODE, // XXX fix this up @@ -199,10 +204,11 @@ typedef enum { ICON_BLANK075, ICON_BLANK076, ICON_BLANK077, + ICON_BLANK077b, /* DATA */ ICON_SCENE_DEHLT, - ICON_IMAGE_DEHLT, + ICON_RENDERLAYERS, ICON_WORLD_DEHLT, ICON_OBJECT, ICON_MESH, @@ -214,7 +220,7 @@ typedef enum { ICON_TEXTURE_DEHLT, ICON_IPO_DEHLT, ICON_CAMERA_DEHLT, - ICON_BLANK078, + ICON_PARTICLE_DATA, ICON_LIBRARY_DEHLT, ICON_GROUP, ICON_ARMATURE, @@ -226,13 +232,14 @@ typedef enum { ICON_BLANK079, ICON_PACKAGE, ICON_UGLYPACKAGE, + ICON_BLANK079b, /* DATA */ - ICON_SCENE_HLT, - ICON_IMAGE_HLT, - ICON_WORLD_HLT, - ICON_OBJECT_HLT, - ICON_MESH_HLT, + ICON_BRUSH, + ICON_IMAGE_DEHLT, + ICON_FILE, + ICON_FCURVE, + ICON_FONT, ICON_CURVE_HLT, ICON_MBALL_HLT, ICON_LATTICE_HLT, @@ -253,6 +260,7 @@ typedef enum { ICON_BLANK089, ICON_BLANK090, ICON_RNA, + ICON_BLANK090b, /* available */ ICON_BLANK092, @@ -280,6 +288,7 @@ typedef enum { ICON_BLANK114, ICON_BLANK115, ICON_BLANK116, + ICON_BLANK116b, /* OUTLINER */ ICON_OUTLINER_OB_EMPTY, @@ -290,8 +299,8 @@ typedef enum { ICON_OUTLINER_OB_LAMP, ICON_OUTLINER_OB_CAMERA, ICON_OUTLINER_OB_ARMATURE, - ICON_BLANK117, - ICON_BLANK118, + ICON_OUTLINER_OB_FONT, + ICON_OUTLINER_OB_SURFACE, ICON_BLANK119, ICON_BLANK120, ICON_BLANK121, @@ -307,6 +316,7 @@ typedef enum { ICON_RESTRICT_SELECT_ON, ICON_RESTRICT_RENDER_OFF, ICON_RESTRICT_RENDER_ON, + ICON_BLANK127b, /* OUTLINER */ ICON_BLANK128, @@ -334,6 +344,7 @@ typedef enum { ICON_BLANK140, ICON_BLANK141, ICON_BLANK142, + ICON_BLANK142b, /* MODIFIERS */ ICON_MODIFIER, @@ -351,16 +362,17 @@ typedef enum { ICON_MOD_ARRAY, ICON_MOD_UVPROJECT, ICON_MOD_DISPLACE, + ICON_MOD_CURVE, + ICON_MOD_LATTICE, ICON_BLANK143, - ICON_BLANK144, - ICON_BLANK145, - ICON_BLANK146, + ICON_MOD_ARMATURE, ICON_BLANK147, ICON_BLANK148, ICON_BLANK149, ICON_BLANK150, ICON_BLANK151, ICON_BLANK152, + ICON_BLANK152b, /* available */ ICON_BLANK153, @@ -388,6 +400,7 @@ typedef enum { ICON_BLANK175, ICON_BLANK176, ICON_BLANK177, + ICON_BLANK177b, /* ANIMATION */ ICON_REC, @@ -415,6 +428,7 @@ typedef enum { ICON_MUTE_IPO_ON, ICON_BLANK182, ICON_BLANK183, + ICON_BLANK183b, /* available */ ICON_BLANK184, @@ -442,12 +456,13 @@ typedef enum { ICON_BLANK206, ICON_BLANK207, ICON_BLANK208, + ICON_BLANK208b, /* EDITING */ ICON_VERTEXSEL, ICON_EDGESEL, ICON_FACESEL, - ICON_BLANK209, + ICON_LINKEDSEL, ICON_BLANK210, ICON_ROTATE, ICON_CURSOR, @@ -469,6 +484,7 @@ typedef enum { ICON_BLANK212, ICON_BLANK213, ICON_BLANK214, + ICON_BLANK214b, /* EDITING */ ICON_MAN_TRANS, @@ -479,15 +495,15 @@ typedef enum { ICON_SNAP_GEAR, ICON_SNAP_GEO, ICON_SNAP_NORMAL, - ICON_BLANK216, - ICON_BLANK217, - ICON_BLANK218, + ICON_SNAP_VERTEX, + ICON_SNAP_EDGE, + ICON_SNAP_FACE, + ICON_BLANK218b, ICON_STICKY_UVS_LOC, ICON_STICKY_UVS_DISABLE, ICON_STICKY_UVS_VERT, ICON_CLIPUV_DEHLT, ICON_CLIPUV_HLT, - ICON_BLANK218b, ICON_BLANK219, ICON_BLANK220, ICON_BLANK221, @@ -496,6 +512,7 @@ typedef enum { ICON_BLANK224, ICON_BLANK225, ICON_BLANK226, + ICON_BLANK226b, /* EDITING */ ICON_PASTEDOWN, @@ -523,6 +540,7 @@ typedef enum { ICON_BLANK245, ICON_BLANK246, ICON_BLANK247, + ICON_BLANK247b, /* 3D VIEW */ ICON_BBOX, @@ -550,6 +568,7 @@ typedef enum { ICON_BLANK255, ICON_BLANK256, ICON_BLANK257, + ICON_BLANK257b, /* available */ ICON_BLANK258, @@ -577,6 +596,7 @@ typedef enum { ICON_BLANK280, ICON_BLANK281, ICON_BLANK282, + ICON_BLANK282b, /* FILE SELECT */ ICON_SORTALPHA, @@ -604,6 +624,7 @@ typedef enum { ICON_BLANK289, ICON_BLANK290, ICON_BLANK291, + ICON_BLANK291b, /* available */ ICON_BLANK292, @@ -631,6 +652,7 @@ typedef enum { ICON_BLANK314, ICON_BLANK315, ICON_BLANK316, + ICON_BLANK316b, /* SHADING / TEXT */ ICON_MATPLANE, @@ -645,11 +667,11 @@ typedef enum { ICON_BLANK320, ICON_BLANK321, ICON_BLANK322, - ICON_BLANK5, // XXX CHANGE TO WORDWRAP - ICON_BLANK6, // XXX CHANGE TO WORDWRAP - ICON_SYNTAX, // XXX CHANGE OFF -> ON + ICON_WORDWRAP_OFF, + ICON_WORDWRAP_ON, ICON_SYNTAX_OFF, - ICON_LINENUMBERS_OFF, // XXX CREATE NEW + ICON_SYNTAX_ON, + ICON_LINENUMBERS_OFF, ICON_LINENUMBERS_ON, ICON_SCRIPTPLUGINS, // XXX CREATE NEW ICON_BLANK323, @@ -658,6 +680,7 @@ typedef enum { ICON_BLANK326, ICON_BLANK327, ICON_BLANK328, + ICON_BLANK328b, /* SEQUENCE / IMAGE EDITOR */ ICON_SEQ_SEQUENCER, @@ -685,6 +708,7 @@ typedef enum { ICON_BLANK344, ICON_BLANK345, ICON_BLANK346, + ICON_BLANK346b, /* vector icons */ diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 1fd4142a29c..f2f0582a5e2 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -67,7 +67,7 @@ #define ICON_IMAGE_W 600 #define ICON_IMAGE_H 512 -#define ICON_GRID_COLS 25 +#define ICON_GRID_COLS 26 #define ICON_GRID_ROWS 24 #define ICON_GRID_MARGIN 5 diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index 5c9ed4dd81d..e330d003683 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -133,7 +133,9 @@ int UI_GetIconRNA(PointerRNA *ptr) else if(rnatype == &RNA_Sound) return ICON_SOUND; else if(rnatype == &RNA_Brush) - return ICON_TPAINT_HLT; + return ICON_BRUSH; + else if(rnatype == &RNA_VectorFont) + return ICON_FONT; else if(rnatype == &RNA_Library) return ICON_LIBRARY_DEHLT; else if(rnatype == &RNA_Action) diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index 3a1b623c09e..9a6bab08238 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -925,7 +925,7 @@ void image_header_buttons(const bContext *C, ARegion *ar) xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_EDGE, 0, 0, "Edge select mode"); uiDefIconButS(block, ROW, B_REDR, ICON_FACESEL, xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_FACE, 0, 0, "Face select mode"); - uiDefIconButS(block, ROW, B_REDR, ICON_MESH, + uiDefIconButS(block, ROW, B_REDR, ICON_LINKEDSEL, xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_ISLAND, 0, 0, "Island select mode"); uiBlockEndAlign(block); diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index dce23eb103f..fb3195db030 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -3120,11 +3120,11 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen case eModifierType_Subsurf: UI_icon_draw(x, y, ICON_MOD_SUBSURF); break; case eModifierType_Armature: - UI_icon_draw(x, y, ICON_ARMATURE); break; + UI_icon_draw(x, y, ICON_MOD_ARMATURE); break; case eModifierType_Lattice: - UI_icon_draw(x, y, ICON_LATTICE); break; + UI_icon_draw(x, y, ICON_MOD_LATTICE); break; case eModifierType_Curve: - UI_icon_draw(x, y, ICON_CURVE); break; + UI_icon_draw(x, y, ICON_MOD_CURVE); break; case eModifierType_Build: UI_icon_draw(x, y, ICON_MOD_BUILD); break; case eModifierType_Mirror: @@ -3165,7 +3165,7 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen case TSE_PROXY: UI_icon_draw(x, y, ICON_GHOST); break; case TSE_R_LAYER_BASE: - UI_icon_draw(x, y, ICON_RESTRICT_RENDER_OFF); break; + UI_icon_draw(x, y, ICON_RENDERLAYERS); break; case TSE_R_LAYER: UI_icon_draw(x, y, ICON_IMAGE_DEHLT); break; case TSE_LINKED_LAMP: @@ -3218,6 +3218,10 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen UI_icon_draw(x, y, ICON_OUTLINER_OB_LATTICE); break; case OB_ARMATURE: UI_icon_draw(x, y, ICON_OUTLINER_OB_ARMATURE); break; + case OB_FONT: + UI_icon_draw(x, y, ICON_OUTLINER_OB_FONT); break; + case OB_SURF: + UI_icon_draw(x, y, ICON_OUTLINER_OB_SURFACE); break; case OB_EMPTY: UI_icon_draw(x, y, ICON_OUTLINER_OB_EMPTY); break; diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 780bb46ece4..20946b007d2 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -5965,7 +5965,7 @@ void view3d_header_buttons(const bContext *C, ARegion *ar) xco+= XIC; uiDefIconButBitS(block, TOG, SCE_SNAP_ROTATE, B_REDR, ICON_SNAP_NORMAL,xco,yco,XIC,YIC, &scene->snap_flag, 0, 0, 0, 0, "Align rotation with the snapping target"); xco+= XIC; - uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_VERTEXSEL, snapmode_pup(), xco,yco,XIC+10,YIC, &(scene->snap_mode), 0.0, 0.0, 0, 0, "Snapping mode"); + uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_SNAP_VERTEX, snapmode_pup(), xco,yco,XIC+10,YIC, &(scene->snap_mode), 0.0, 0.0, 0, 0, "Snapping mode"); xco+= XIC; uiDefButS(block, MENU, B_NOP, "Snap Mode%t|Closest%x0|Center%x1|Median%x2|Active%x3",xco,yco,70,YIC, &scene->snap_target, 0, 0, 0, 0, "Snap Target Mode"); xco+= 70; diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index c53976b5002..e5a5293c9ea 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -808,9 +808,9 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna) /* space_action */ - srna= RNA_def_struct(brna, "ThemeDopeSheetEditor", NULL); + srna= RNA_def_struct(brna, "ThemeDopeSheet", NULL); RNA_def_struct_sdna(srna, "ThemeSpace"); - RNA_def_struct_ui_text(srna, "Theme DopeSheet Editor", "Theme settings for the DopeSheet Editor."); + RNA_def_struct_ui_text(srna, "Theme DopeSheet", "Theme settings for the DopeSheet."); rna_def_userdef_theme_spaces_main(srna); @@ -990,8 +990,8 @@ static void rna_def_userdef_themes(BlenderRNA *brna) prop= RNA_def_property(srna, "dopesheet_editor", PROP_POINTER, PROP_NEVER_NULL); RNA_def_property_pointer_sdna(prop, NULL, "tact"); - RNA_def_property_struct_type(prop, "ThemeDopeSheetEditor"); - RNA_def_property_ui_text(prop, "DopeSheet Editor", ""); + RNA_def_property_struct_type(prop, "ThemeDopeSheet"); + RNA_def_property_ui_text(prop, "DopeSheet", ""); prop= RNA_def_property(srna, "image_editor", PROP_POINTER, PROP_NEVER_NULL); RNA_def_property_pointer_sdna(prop, NULL, "tima"); From 2d248a39c715c1022dd347f3f763f42e1d7ae4ca Mon Sep 17 00:00:00 2001 From: Matt Ebb Date: Tue, 10 Feb 2009 03:27:33 +0000 Subject: [PATCH 22/63] Some theme colour tweaks --- source/blender/editors/interface/resources.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index d55a40f9bbb..d0d1da40a8f 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -452,8 +452,8 @@ void ui_theme_init_userdef(void) SETCOL(btheme->tipo.ds_channel, 82, 96, 110, 255); SETCOL(btheme->tipo.ds_subchannel, 124, 137, 150, 255); - SETCOL(btheme->tipo.group, 22, 112, 0, 255); - SETCOL(btheme->tipo.group_active, 125, 233, 96, 255); + SETCOL(btheme->tipo.group, 79, 101, 73, 255); + SETCOL(btheme->tipo.group_active, 135, 177, 125, 255); /* space file */ /* to have something initialized */ @@ -478,8 +478,8 @@ void ui_theme_init_userdef(void) SETCOL(btheme->tact.hilite, 255, 160, 0, 100); // bar SETCOL(btheme->tact.strip_select, 255, 160, 0, 255); SETCOL(btheme->tact.strip, 78, 78, 78, 255); - SETCOL(btheme->tact.group, 22, 112, 0, 255); - SETCOL(btheme->tact.group_active, 125, 233, 96, 255); + SETCOL(btheme->tact.group, 79, 101, 73, 255); + SETCOL(btheme->tact.group_active, 135, 177, 125, 255) SETCOL(btheme->tact.ds_channel, 82, 96, 110, 255); SETCOL(btheme->tact.ds_subchannel, 124, 137, 150, 255); From 8243e65ed813842c21808c531bcc5f8cbb59c642 Mon Sep 17 00:00:00 2001 From: Michael Fox Date: Tue, 10 Feb 2009 06:12:35 +0000 Subject: [PATCH 23/63] 2.5 ******* - ported make/clear parent for editbones (paent_set, parent_clear to align with naming conventions) Aligorith and Kaito please look over this and make sure everything is right --- .../editors/armature/armature_intern.h | 3 +- .../blender/editors/armature/armature_ops.c | 6 + .../blender/editors/armature/editarmature.c | 421 ++++++++++-------- 3 files changed, 241 insertions(+), 189 deletions(-) diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index af9082730e3..4fa11197cf1 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -40,7 +40,8 @@ void ARMATURE_OT_switch_direction(struct wmOperatorType *ot); void ARMATURE_OT_subdivs(struct wmOperatorType *ot); void ARMATURE_OT_subdivide_simple(struct wmOperatorType *ot); void ARMATURE_OT_subdivide_multi(struct wmOperatorType *ot); - +void ARMATURE_OT_parent_set(struct wmOperatorType *ot); +void ARMATURE_OT_parent_clear(struct wmOperatorType *ot); void POSE_OT_hide(struct wmOperatorType *ot); void POSE_OT_reveil(struct wmOperatorType *ot); diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index 7bdc4973f30..896982627da 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -114,6 +114,9 @@ void ED_operatortypes_armature(void) WM_operatortype_append(ARMATURE_OT_subdivide_simple); WM_operatortype_append(ARMATURE_OT_subdivide_multi); + WM_operatortype_append(ARMATURE_OT_parent_set); + WM_operatortype_append(ARMATURE_OT_parent_clear); + WM_operatortype_append(POSE_OT_hide); WM_operatortype_append(POSE_OT_reveil); WM_operatortype_append(POSE_OT_rot_clear); @@ -141,6 +144,9 @@ void ED_keymap_armature(wmWindowManager *wm) /* only menu is registered in keymaps for now */ WM_keymap_add_item(keymap, "ARMATURE_OT_subdivs", SKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_set_parent", PKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_clear_parent", PKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_test", TKEY, KM_PRESS, 0, 0); // XXX temp test for context iterators... to be removed /* Pose ------------------------ */ diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 48078a77e85..6e575ab1952 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -2903,194 +2903,6 @@ void show_all_armature_bones(Scene *scene) BIF_undo_push("Reveal Bones"); } -/* check for null, before calling! */ -static void bone_connect_to_existing_parent(EditBone *bone) -{ - bone->flag |= BONE_CONNECTED; - VECCOPY(bone->head, bone->parent->tail); - bone->rad_head = bone->parent->rad_tail; -} - -static void bone_connect_to_new_parent(ListBase *edbo, EditBone *selbone, EditBone *actbone, short mode) -{ - EditBone *ebone; - float offset[3]; - - if ((selbone->parent) && (selbone->flag & BONE_CONNECTED)) - selbone->parent->flag &= ~(BONE_TIPSEL); - - /* make actbone the parent of selbone */ - selbone->parent= actbone; - - /* in actbone tree we cannot have a loop */ - for (ebone= actbone->parent; ebone; ebone= ebone->parent) { - if (ebone->parent==selbone) { - ebone->parent= NULL; - ebone->flag &= ~BONE_CONNECTED; - } - } - - if (mode == 1) { - /* Connected: Child bones will be moved to the parent tip */ - selbone->flag |= BONE_CONNECTED; - VecSubf(offset, actbone->tail, selbone->head); - - VECCOPY(selbone->head, actbone->tail); - selbone->rad_head= actbone->rad_tail; - - VecAddf(selbone->tail, selbone->tail, offset); - - /* offset for all its children */ - for (ebone = edbo->first; ebone; ebone=ebone->next) { - EditBone *par; - - for (par= ebone->parent; par; par= par->parent) { - if (par==selbone) { - VecAddf(ebone->head, ebone->head, offset); - VecAddf(ebone->tail, ebone->tail, offset); - break; - } - } - } - } - else { - /* Offset: Child bones will retain their distance from the parent tip */ - selbone->flag &= ~BONE_CONNECTED; - } -} - -void make_bone_parent(Scene *scene) -{ - Object *obedit= scene->obedit; // XXX get from context - bArmature *arm= obedit->data; - EditBone *actbone, *ebone, *selbone; - EditBone *flipbone, *flippar; - short allchildbones= 0, foundselbone= 0; - short val; - - /* find active bone to parent to */ - for (actbone = arm->edbo->first; actbone; actbone=actbone->next) { - if (EBONE_VISIBLE(arm, actbone)) { - if (actbone->flag & BONE_ACTIVE) - break; - } - } - if (actbone == NULL) { - error("Needs an active bone"); - return; - } - - /* find selected bones */ - for (ebone = arm->edbo->first; ebone; ebone=ebone->next) { - if (EBONE_VISIBLE(arm, ebone)) { - if ((ebone->flag & BONE_SELECTED) && (ebone != actbone)) { - foundselbone++; - if (ebone->parent != actbone) allchildbones= 1; - } - } - } - /* abort if no selected bones, and active bone doesn't have a parent to work with instead */ - if (foundselbone==0 && actbone->parent==NULL) { - error("Need selected bone(s)"); - return; - } - - /* 'Keep Offset' option is only displayed if it's likely to be useful */ - if (allchildbones) - val= pupmenu("Make Parent%t|Connected%x1|Keep Offset%x2"); - else - val= pupmenu("Make Parent%t|Connected%x1"); - - if (val < 1) return; - - if (foundselbone==0 && actbone->parent) { - /* When only the active bone is selected, and it has a parent, - * connect it to the parent, as that is the only possible outcome. - */ - bone_connect_to_existing_parent(actbone); - - if (arm->flag & ARM_MIRROR_EDIT) { - flipbone = ED_armature_bone_get_mirrored(arm->edbo, actbone); - if (flipbone) - bone_connect_to_existing_parent(flipbone); - } - } - else { - /* loop through all editbones, parenting all selected bones to the active bone */ - for (selbone = arm->edbo->first; selbone; selbone=selbone->next) { - if (EBONE_VISIBLE(arm, selbone)) { - if ((selbone->flag & BONE_SELECTED) && (selbone!=actbone)) { - /* parent selbone to actbone */ - bone_connect_to_new_parent(arm->edbo, selbone, actbone, val); - - if (arm->flag & ARM_MIRROR_EDIT) { - /* - if there's a mirrored copy of selbone, try to find a mirrored copy of actbone - * (i.e. selbone="child.L" and actbone="parent.L", find "child.R" and "parent.R"). - * This is useful for arm-chains, for example parenting lower arm to upper arm - * - if there's no mirrored copy of actbone (i.e. actbone = "parent.C" or "parent") - * then just use actbone. Useful when doing upper arm to spine. - */ - flipbone = ED_armature_bone_get_mirrored(arm->edbo, selbone); - flippar = ED_armature_bone_get_mirrored(arm->edbo, actbone); - - if (flipbone) { - if (flippar) - bone_connect_to_new_parent(arm->edbo, flipbone, flippar, val); - else - bone_connect_to_new_parent(arm->edbo, flipbone, actbone, val); - } - } - } - } - } - } - - armature_sync_selection(arm->edbo); - BIF_undo_push("Make Parent"); - - return; -} - -static void editbone_clear_parent(EditBone *ebone, int mode) -{ - if (ebone->parent) { - /* for nice selection */ - ebone->parent->flag &= ~(BONE_TIPSEL); - } - - if (mode==1) ebone->parent= NULL; - ebone->flag &= ~BONE_CONNECTED; -} - -void clear_bone_parent(Scene *scene) -{ - Object *obedit= scene->obedit; // XXX get from context - bArmature *arm= obedit->data; - EditBone *ebone; - EditBone *flipbone = NULL; - short val; - - val= pupmenu("Clear Parent%t|Clear Parent%x1|Disconnect Bone%x2"); - if (val<1) return; - - for (ebone = arm->edbo->first; ebone; ebone=ebone->next) { - if (EBONE_VISIBLE(arm, ebone)) { - if (ebone->flag & BONE_SELECTED) { - if (arm->flag & ARM_MIRROR_EDIT) - flipbone = ED_armature_bone_get_mirrored(arm->edbo, ebone); - - if (flipbone) - editbone_clear_parent(flipbone, val); - editbone_clear_parent(ebone, val); - } - } - } - - armature_sync_selection(arm->edbo); - BIF_undo_push("Clear Parent"); -} - - /* context; editmode armature */ /* if forked && mirror-edit: makes two bones with flipped names */ void extrude_armature(Scene *scene, int forked) @@ -3475,6 +3287,239 @@ void ARMATURE_OT_switch_direction(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +/* ***************** Parenting *********************** */ +#define ARM_PAR_CONNECT 1 +#define ARM_PAR_OFFSET 2 + +/* check for null, before calling! */ +static void bone_connect_to_existing_parent(EditBone *bone) +{ + bone->flag |= BONE_CONNECTED; + VECCOPY(bone->head, bone->parent->tail); + bone->rad_head = bone->parent->rad_tail; +} + +static void bone_connect_to_new_parent(ListBase *edbo, EditBone *selbone, EditBone *actbone, short mode) +{ + EditBone *ebone; + float offset[3]; + + if ((selbone->parent) && (selbone->flag & BONE_CONNECTED)) + selbone->parent->flag &= ~(BONE_TIPSEL); + + /* make actbone the parent of selbone */ + selbone->parent= actbone; + + /* in actbone tree we cannot have a loop */ + for (ebone= actbone->parent; ebone; ebone= ebone->parent) { + if (ebone->parent==selbone) { + ebone->parent= NULL; + ebone->flag &= ~BONE_CONNECTED; + } + } + + if (mode == ARM_PAR_CONNECT) { + /* Connected: Child bones will be moved to the parent tip */ + selbone->flag |= BONE_CONNECTED; + VecSubf(offset, actbone->tail, selbone->head); + + VECCOPY(selbone->head, actbone->tail); + selbone->rad_head= actbone->rad_tail; + + VecAddf(selbone->tail, selbone->tail, offset); + + /* offset for all its children */ + for (ebone = edbo->first; ebone; ebone=ebone->next) { + EditBone *par; + + for (par= ebone->parent; par; par= par->parent) { + if (par==selbone) { + VecAddf(ebone->head, ebone->head, offset); + VecAddf(ebone->tail, ebone->tail, offset); + break; + } + } + } + } + else { + /* Offset: Child bones will retain their distance from the parent tip */ + selbone->flag &= ~BONE_CONNECTED; + } +} + +static EnumPropertyItem prop_editarm_make_parent_types[] = { + {ARM_PAR_CONNECT, "CONNECTED", "Connected", ""}, + {ARM_PAR_OFFSET, "OFFSET", "Keep Offset", ""}, + {0, NULL, NULL, NULL} +}; + +static int armature_parent_set_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_edit_object(C); + bArmature *arm= (bArmature *)ob->data; + EditBone *flipbone, *flippar; + EditBone *actbone = CTX_data_active_bone(C); + short allchildbones= 0, foundselbone= 0; + short val = RNA_enum_get(op->ptr, "type"); + + /* find selected bones */ + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { + if (ebone != actbone) { + foundselbone++; + if (ebone->parent != actbone) allchildbones= 1; + } + } + CTX_DATA_END; + + if (foundselbone==0 && actbone->parent) { + /* When only the active bone is selected, and it has a parent, + * connect it to the parent, as that is the only possible outcome. + */ + bone_connect_to_existing_parent(actbone); + + if (arm->flag & ARM_MIRROR_EDIT) { + flipbone = ED_armature_bone_get_mirrored(arm->edbo, actbone); + if (flipbone) + bone_connect_to_existing_parent(flipbone); + } + } + else { + /* loop through all editbones, parenting all selected bones to the active bone */ + CTX_DATA_BEGIN(C, EditBone *, selbone, selected_editable_bones) { + if (selbone!=actbone) { + /* parent selbone to actbone */ + bone_connect_to_new_parent(arm->edbo, selbone, actbone, val); + + if (arm->flag & ARM_MIRROR_EDIT) { + /* - if there's a mirrored copy of selbone, try to find a mirrored copy of actbone + * (i.e. selbone="child.L" and actbone="parent.L", find "child.R" and "parent.R"). + * This is useful for arm-chains, for example parenting lower arm to upper arm + * - if there's no mirrored copy of actbone (i.e. actbone = "parent.C" or "parent") + * then just use actbone. Useful when doing upper arm to spine. + */ + flipbone = ED_armature_bone_get_mirrored(arm->edbo, selbone); + flippar = ED_armature_bone_get_mirrored(arm->edbo, actbone); + + if (flipbone) { + if (flippar) + bone_connect_to_new_parent(arm->edbo, flipbone, flippar, val); + else + bone_connect_to_new_parent(arm->edbo, flipbone, actbone, val); + } + } + } + } + CTX_DATA_END; + } + + armature_sync_selection(arm->edbo); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT, ob); + + return OPERATOR_FINISHED; +} + +static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + EditBone *actbone = CTX_data_active_bone(C); + uiMenuItem *head= uiPupMenuBegin("Make Parent ", 0); + int allchildbones = 0; + + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { + if (ebone != actbone) { + if (ebone->parent != actbone) allchildbones= 1; + } + } + CTX_DATA_END; + + uiMenuItemEnumO(head, 0, "ARMATURE_OT_set_parent", "type", ARM_PAR_CONNECT); + + /* ob becomes parent, make the associated menus */ + if(allchildbones) + uiMenuItemEnumO(head, 0, "ARMATURE_OT_set_parent", "type", ARM_PAR_OFFSET); + + uiPupMenuEnd(C, head); + + return OPERATOR_CANCELLED; +} + +void ARMATURE_OT_parent_set(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Make Parent"; + ot->idname= "ARMATURE_OT_set_parent"; + + /* api callbacks */ + ot->invoke = armature_parent_set_invoke; + ot->exec = armature_parent_set_exec; + ot->poll = ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "type", prop_editarm_make_parent_types, 0, "ParentType", "Type Of parenting"); +} + +static EnumPropertyItem prop_editarm_clear_parent_types[] = { + {1, "CLEAR", "Clear Parent", ""}, + {2, "DISCONNECT", "Disconnect Bone", ""}, + {0, NULL, NULL, NULL} +}; + +static void editbone_clear_parent(EditBone *ebone, int mode) +{ + if (ebone->parent) { + /* for nice selection */ + ebone->parent->flag &= ~(BONE_TIPSEL); + } + + if (mode==1) ebone->parent= NULL; + ebone->flag &= ~BONE_CONNECTED; +} + +static int armature_parent_clear_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_edit_object(C); + bArmature *arm= (bArmature *)ob->data; + EditBone *flipbone = NULL; + int val = RNA_enum_get(op->ptr, "type"); + + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { + if (arm->flag & ARM_MIRROR_EDIT) + flipbone = ED_armature_bone_get_mirrored(arm->edbo, ebone); + + if (flipbone) + editbone_clear_parent(flipbone, val); + + editbone_clear_parent(ebone, val); + } + CTX_DATA_END; + + armature_sync_selection(arm->edbo); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT, ob); + + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_parent_clear(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Clear Parent"; + ot->idname= "ARMATURE_OT_clear_parent"; + + /* api callbacks */ + ot->invoke = WM_menu_invoke; + ot->exec = armature_parent_clear_exec; + ot->poll = ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "type", prop_editarm_clear_parent_types, 0, "ClearType", "What way to clear parenting"); +} /* ***************** EditBone Alignment ********************* */ From 3bcb1ebdfeb9cfb39abfcc9cc063001432f94975 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 10 Feb 2009 09:18:04 +0000 Subject: [PATCH 24/63] 2.5: Silencing MSVC warnings in a few files (many files still have many to clean out some other day). --- source/blender/blenkernel/intern/object.c | 56 ++-- source/blender/blenlib/intern/arithb.c | 259 +++++++++--------- .../blender/editors/armature/editarmature.c | 30 +- .../blender/editors/space_outliner/outliner.c | 18 +- .../editors/space_outliner/outliner_header.c | 6 +- .../blender/editors/space_time/space_time.c | 8 +- .../blender/editors/space_time/time_header.c | 20 +- .../editors/space_view3d/drawarmature.c | 203 +++++++------- 8 files changed, 296 insertions(+), 304 deletions(-) diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 53fa5d8570f..610e513aa65 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -699,7 +699,7 @@ float dof_camera(Object *ob) { Camera *cam = (Camera *)ob->data; if (ob->type != OB_CAMERA) - return 0.0; + return 0.0f; if (cam->dof_ob) { /* too simple, better to return the distance on the view axis only * return VecLenf(ob->obmat[3], cam->dof_ob->obmat[3]); */ @@ -709,7 +709,7 @@ float dof_camera(Object *ob) Mat4Ortho(obmat); Mat4Invert(ob->imat, obmat); Mat4MulMat4(mat, cam->dof_ob->obmat, ob->imat); - return fabs(mat[3][2]); + return (float)fabs(mat[3][2]); } return cam->YF_dofdist; } @@ -720,26 +720,26 @@ void *add_lamp(char *name) la= alloc_libblock(&G.main->lamp, ID_LA, name); - la->r= la->g= la->b= la->k= 1.0; - la->haint= la->energy= 1.0; - la->dist= 20.0; - la->spotsize= 45.0; - la->spotblend= 0.15; - la->att2= 1.0; + la->r= la->g= la->b= la->k= 1.0f; + la->haint= la->energy= 1.0f; + la->dist= 20.0f; + la->spotsize= 45.0f; + la->spotblend= 0.15f; + la->att2= 1.0f; la->mode= LA_SHAD_BUF; la->bufsize= 512; - la->clipsta= 0.5; - la->clipend= 40.0; - la->shadspotsize= 45.0; + la->clipsta= 0.5f; + la->clipend= 40.0f; + la->shadspotsize= 45.0f; la->samp= 3; - la->bias= 1.0; - la->soft= 3.0; + la->bias= 1.0f; + la->soft= 3.0f; la->ray_samp= la->ray_sampy= la->ray_sampz= 1; - la->area_size=la->area_sizey=la->area_sizez= 1.0; + la->area_size=la->area_sizey=la->area_sizez= 1.0f; la->buffers= 1; la->buftype= LA_SHADBUF_HALFWAY; la->ray_samp_method = LA_SAMP_HALTON; - la->adapt_thresh = 0.001; + la->adapt_thresh = 0.001f; la->preview=NULL; la->falloff_type = LA_FALLOFF_INVLINEAR; la->curfalloff = curvemapping_add(1, 0.0f, 1.0f, 1.0f, 0.0f); @@ -748,12 +748,12 @@ void *add_lamp(char *name) la->spread = 1.0; la->sun_brightness = 1.0; la->sun_size = 1.0; - la->backscattered_light = 1.0; - la->atm_turbidity = 2.0; - la->atm_inscattering_factor = 1.0; - la->atm_extinction_factor = 1.0; - la->atm_distance_factor = 1.0; - la->sun_intensity = 1.0; + la->backscattered_light = 1.0f; + la->atm_turbidity = 2.0f; + la->atm_inscattering_factor = 1.0f; + la->atm_extinction_factor = 1.0f; + la->atm_distance_factor = 1.0f; + la->sun_intensity = 1.0f; la->skyblendtype= MA_RAMP_ADD; la->skyblendfac= 1.0f; la->sky_colorspace= BLI_CS_CIE; @@ -1864,7 +1864,6 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime) /* and even worse, it gives bad effects for NLA stride too (try ctime != par->ctime, with MBlur) */ pop= 0; if(no_parent_ipo==0 && stime != par->ctime) { - // only for ipo systems? pushdata(par, sizeof(Object)); pop= 1; @@ -1874,16 +1873,15 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime) } solve_parenting(scene, ob, par, ob->obmat, slowmat, 0); - + if(pop) { poplast(par); } if(ob->partype & PARSLOW) { // include framerate - - fac1= (1.0f/(1.0f+ fabs(give_timeoffset(ob)))); - if(fac1>=1.0) return; + fac1= ( 1.0f / (1.0f + (float)fabs(give_timeoffset(ob))) ); + if(fac1 >= 1.0f) return; fac2= 1.0f-fac1; fp1= ob->obmat[0]; @@ -1892,7 +1890,6 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime) fp1[0]= fac1*fp1[0] + fac2*fp2[0]; } } - } else { object_to_mat4(ob, ob->obmat); @@ -1902,7 +1899,6 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime) if(ob->track) { if( ctime != ob->track->ctime) where_is_object_time(scene, ob->track, ctime); solve_tracking (ob, ob->track->obmat); - } /* solve constraints */ @@ -2088,7 +2084,7 @@ for a lamp that is the child of another object */ bConstraintOb *cob; cob= constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT); - solve_constraints (&ob->constraints, cob, scene->r.cfra); + solve_constraints(&ob->constraints, cob, (float)scene->r.cfra); constraints_clear_evalob(cob); } @@ -2127,7 +2123,7 @@ void what_does_parent(Scene *scene, Object *ob, Object *workob) BoundBox *unit_boundbox() { BoundBox *bb; - float min[3] = {-1,-1,-1}, max[3] = {-1,-1,-1}; + float min[3] = {-1.0f,-1.0f,-1.0f}, max[3] = {-1.0f,-1.0f,-1.0f}; bb= MEM_callocN(sizeof(BoundBox), "bb"); boundbox_set_from_min_max(bb, min, max); diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c index 0d65e615039..0df4792cd3d 100644 --- a/source/blender/blenlib/intern/arithb.c +++ b/source/blender/blenlib/intern/arithb.c @@ -1599,16 +1599,16 @@ void QuatInterpolW(float *result, float *quat1, float *quat2, float t) cosom = quat1[0]*quat2[0] + quat1[1]*quat2[1] + quat1[2]*quat2[2] + quat1[3]*quat2[3] ; /* rotate around shortest angle */ - if ((1.0 + cosom) > 0.0001) { + if ((1.0f + cosom) > 0.0001f) { - if ((1.0 - cosom) > 0.0001) { - omega = acos(cosom); - sinom = sin(omega); - sc1 = sin((1.0 - t) * omega) / sinom; - sc2 = sin(t * omega) / sinom; + if ((1.0f - cosom) > 0.0001f) { + omega = (float)acos(cosom); + sinom = (float)sin(omega); + sc1 = (float)sin((1.0 - t) * omega) / sinom; + sc2 = (float)sin(t * omega) / sinom; } else { - sc1 = 1.0 - t; + sc1 = 1.0f - t; sc2 = t; } result[0] = sc1*quat1[0] + sc2*quat2[0]; @@ -1622,9 +1622,9 @@ void QuatInterpolW(float *result, float *quat1, float *quat2, float t) result[2] = quat2[1]; result[3] = -quat2[0]; - sc1 = sin((1.0 - t)*M_PI_2); - sc2 = sin(t*M_PI_2); - + sc1 = (float)sin((1.0 - t)*M_PI_2); + sc2 = (float)sin(t*M_PI_2); + result[0] = sc1*quat1[0] + sc2*result[0]; result[1] = sc1*quat1[1] + sc2*result[1]; result[2] = sc1*quat1[2] + sc2*result[2]; @@ -1639,7 +1639,7 @@ void QuatInterpol(float *result, float *quat1, float *quat2, float t) cosom = quat1[0]*quat2[0] + quat1[1]*quat2[1] + quat1[2]*quat2[2] + quat1[3]*quat2[3] ; /* rotate around shortest angle */ - if (cosom < 0.0) { + if (cosom < 0.0f) { cosom = -cosom; quat[0]= -quat1[0]; quat[1]= -quat1[1]; @@ -1653,13 +1653,13 @@ void QuatInterpol(float *result, float *quat1, float *quat2, float t) quat[3]= quat1[3]; } - if ((1.0 - cosom) > 0.0001) { - omega = acos(cosom); - sinom = sin(omega); - sc1 = sin((1 - t) * omega) / sinom; - sc2 = sin(t * omega) / sinom; + if ((1.0f - cosom) > 0.0001f) { + omega = (float)acos(cosom); + sinom = (float)sin(omega); + sc1 = (float)sin((1 - t) * omega) / sinom; + sc2 = (float)sin(t * omega) / sinom; } else { - sc1= 1.0 - t; + sc1= 1.0f - t; sc2= t; } @@ -1775,7 +1775,7 @@ void DQuatToMat4(DualQuat *dq, float mat[][4]) QuatCopy(q0, dq->quat); /* normalize */ - len= sqrt(QuatDot(q0, q0)); + len= (float)sqrt(QuatDot(q0, q0)); if(len != 0.0f) QuatMulf(q0, 1.0f/len); @@ -1784,9 +1784,9 @@ void DQuatToMat4(DualQuat *dq, float mat[][4]) /* translation */ t= dq->trans; - mat[3][0]= 2.0*(-t[0]*q0[1] + t[1]*q0[0] - t[2]*q0[3] + t[3]*q0[2]); - mat[3][1]= 2.0*(-t[0]*q0[2] + t[1]*q0[3] + t[2]*q0[0] - t[3]*q0[1]); - mat[3][2]= 2.0*(-t[0]*q0[3] - t[1]*q0[2] + t[2]*q0[1] + t[3]*q0[0]); + mat[3][0]= 2.0f*(-t[0]*q0[1] + t[1]*q0[0] - t[2]*q0[3] + t[3]*q0[2]); + mat[3][1]= 2.0f*(-t[0]*q0[2] + t[1]*q0[3] + t[2]*q0[0] - t[3]*q0[1]); + mat[3][2]= 2.0f*(-t[0]*q0[3] - t[1]*q0[2] + t[2]*q0[1] + t[3]*q0[0]); /* note: this does not handle scaling */ } @@ -1815,10 +1815,10 @@ void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight) /* interpolate scale - but only if needed */ if (dq->scale_weight) { float wmat[4][4]; - + if(flipped) /* we don't want negative weights for scaling */ weight= -weight; - + Mat4CpyMat4(wmat, dq->scale); Mat4MulFloat((float*)wmat, weight); Mat4AddMat4(dqsum->scale, dqsum->scale, wmat); @@ -1835,7 +1835,7 @@ void DQuatNormalize(DualQuat *dq, float totweight) if(dq->scale_weight) { float addweight= totweight - dq->scale_weight; - + if(addweight) { dq->scale[0][0] += addweight; dq->scale[1][1] += addweight; @@ -2197,7 +2197,7 @@ void VecNegf(float *v1) void VecOrthoBasisf(float *v, float *v1, float *v2) { - float f = sqrt(v[0]*v[0] + v[1]*v[1]); + float f = (float)sqrt(v[0]*v[0] + v[1]*v[1]); if (f < 1e-35f) { // degenerate case @@ -2349,9 +2349,9 @@ double Sqrt3d(double d) void NormalShortToFloat(float *out, short *in) { - out[0] = in[0] / 32767.0; - out[1] = in[1] / 32767.0; - out[2] = in[2] / 32767.0; + out[0] = in[0] / 32767.0f; + out[1] = in[1] / 32767.0f; + out[2] = in[2] / 32767.0f; } void NormalFloatToShort(short *out, float *in) @@ -2488,15 +2488,15 @@ short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4) */ float div, labda, mu; - div= (v2[0]-v1[0])*(v4[1]-v3[1])-(v2[1]-v1[1])*(v4[0]-v3[0]); - if(div==0.0) return -1; + div= (float)((v2[0]-v1[0])*(v4[1]-v3[1])-(v2[1]-v1[1])*(v4[0]-v3[0])); + if(div==0.0f) return -1; labda= ((float)(v1[1]-v3[1])*(v4[0]-v3[0])-(v1[0]-v3[0])*(v4[1]-v3[1]))/div; mu= ((float)(v1[1]-v3[1])*(v2[0]-v1[0])-(v1[0]-v3[0])*(v2[1]-v1[1]))/div; - if(labda>=0.0 && labda<=1.0 && mu>=0.0 && mu<=1.0) { - if(labda==0.0 || labda==1.0 || mu==0.0 || mu==1.0) return 1; + if(labda>=0.0f && labda<=1.0f && mu>=0.0f && mu<=1.0f) { + if(labda==0.0f || labda==1.0f || mu==0.0f || mu==1.0f) return 1; return 2; } return 0; @@ -2655,9 +2655,9 @@ static int BarycentricWeights(float *v1, float *v2, float *v3, float *co, float /* find best projection of face XY, XZ or YZ: barycentric weights of the 2d projected coords are the same and faster to compute */ - xn= fabs(n[0]); - yn= fabs(n[1]); - zn= fabs(n[2]); + xn= (float)fabs(n[0]); + yn= (float)fabs(n[1]); + zn= (float)fabs(n[2]); if(zn>=xn && zn>=yn) {i= 0; j= 1;} else if(yn>=xn && yn>=zn) {i= 0; j= 2;} else {i= 1; j= 2;} @@ -2889,12 +2889,12 @@ void Mat4ToEul(float tmat[][4], float *eul) { float tempMat[3][3]; - Mat3CpyMat4 (tempMat, tmat); + Mat3CpyMat4(tempMat, tmat); Mat3Ortho(tempMat); Mat3ToEul(tempMat, eul); } -void QuatToEul( float *quat, float *eul) +void QuatToEul(float *quat, float *eul) { float mat[3][3]; @@ -2903,7 +2903,7 @@ void QuatToEul( float *quat, float *eul) } -void EulToQuat( float *eul, float *quat) +void EulToQuat(float *eul, float *quat) { float ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss; @@ -2918,7 +2918,7 @@ void EulToQuat( float *eul, float *quat) quat[3] = cj*cs - sj*sc; } -void VecRotToMat3( float *vec, float phi, float mat[][3]) +void VecRotToMat3(float *vec, float phi, float mat[][3]) { /* rotation of phi radials around vec */ float vx, vx2, vy, vy2, vz, vz2, co, si; @@ -2944,7 +2944,7 @@ void VecRotToMat3( float *vec, float phi, float mat[][3]) } -void VecRotToMat4( float *vec, float phi, float mat[][4]) +void VecRotToMat4(float *vec, float phi, float mat[][4]) { float tmat[3][3]; @@ -2953,7 +2953,7 @@ void VecRotToMat4( float *vec, float phi, float mat[][4]) Mat4CpyMat3(mat, tmat); } -void VecRotToQuat( float *vec, float phi, float *quat) +void VecRotToQuat(float *vec, float phi, float *quat) { /* rotation of phi radials around vec */ float si; @@ -2962,7 +2962,7 @@ void VecRotToQuat( float *vec, float phi, float *quat) quat[2]= vec[1]; quat[3]= vec[2]; - if( Normalize(quat+1) == 0.0) { + if( Normalize(quat+1) == 0.0f) { QuatOne(quat); } else { @@ -2986,7 +2986,7 @@ float VecAngle3(float *v1, float *v2, float *v3) Normalize(vec1); Normalize(vec2); - return NormalizedVecAngle2(vec1, vec2) * 180.0/M_PI; + return NormalizedVecAngle2(vec1, vec2) * (float)(180.0/M_PI); } float VecAngle3_2D(float *v1, float *v2, float *v3) @@ -3002,7 +3002,7 @@ float VecAngle3_2D(float *v1, float *v2, float *v3) Normalize2(vec1); Normalize2(vec2); - return NormalizedVecAngle2_2D(vec1, vec2) * 180.0/M_PI; + return NormalizedVecAngle2_2D(vec1, vec2) * (float)(180.0/M_PI); } /* Return the shortest angle in degrees between the 2 vectors */ @@ -3015,7 +3015,7 @@ float VecAngle2(float *v1, float *v2) Normalize(vec1); Normalize(vec2); - return NormalizedVecAngle2(vec1, vec2)* 180.0/M_PI; + return NormalizedVecAngle2(vec1, vec2)* (float)(180.0/M_PI); } float NormalizedVecAngle2(float *v1, float *v2) @@ -3027,11 +3027,11 @@ float NormalizedVecAngle2(float *v1, float *v2) vec[0]= -v2[0]; vec[1]= -v2[1]; vec[2]= -v2[2]; - - return (float)M_PI - 2.0f*saasin(VecLenf(vec, v1)/2.0f); + + return (float)M_PI - 2.0f*(float)saasin(VecLenf(vec, v1)/2.0f); } else - return 2.0f*saasin(VecLenf(v2, v1)/2.0); + return 2.0f*(float)saasin(VecLenf(v2, v1)/2.0f); } float NormalizedVecAngle2_2D(float *v1, float *v2) @@ -3042,18 +3042,18 @@ float NormalizedVecAngle2_2D(float *v1, float *v2) vec[0]= -v2[0]; vec[1]= -v2[1]; - + return (float)M_PI - 2.0f*saasin(Vec2Lenf(vec, v1)/2.0f); } else - return 2.0f*saasin(Vec2Lenf(v2, v1)/2.0); + return 2.0f*(float)saasin(Vec2Lenf(v2, v1)/2.0f); } void euler_rot(float *beul, float ang, char axis) { float eul[3], mat1[3][3], mat2[3][3], totmat[3][3]; - eul[0]= eul[1]= eul[2]= 0.0; + eul[0]= eul[1]= eul[2]= 0.0f; if(axis=='x') eul[0]= ang; else if(axis=='y') eul[1]= ang; else eul[2]= ang; @@ -3073,33 +3073,32 @@ void compatible_eul(float *eul, float *oldrot) float dx, dy, dz; /* correct differences of about 360 degrees first */ - dx= eul[0] - oldrot[0]; dy= eul[1] - oldrot[1]; dz= eul[2] - oldrot[2]; - while( fabs(dx) > 5.1) { - if(dx > 0.0) eul[0] -= 2.0*M_PI; else eul[0]+= 2.0*M_PI; + while(fabs(dx) > 5.1) { + if(dx > 0.0f) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI; dx= eul[0] - oldrot[0]; } - while( fabs(dy) > 5.1) { - if(dy > 0.0) eul[1] -= 2.0*M_PI; else eul[1]+= 2.0*M_PI; + while(fabs(dy) > 5.1) { + if(dy > 0.0f) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI; dy= eul[1] - oldrot[1]; } - while( fabs(dz) > 5.1 ) { - if(dz > 0.0) eul[2] -= 2.0*M_PI; else eul[2]+= 2.0*M_PI; + while(fabs(dz) > 5.1) { + if(dz > 0.0f) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI; dz= eul[2] - oldrot[2]; } /* is 1 of the axis rotations larger than 180 degrees and the other small? NO ELSE IF!! */ if( fabs(dx) > 3.2 && fabs(dy)<1.6 && fabs(dz)<1.6 ) { - if(dx > 0.0) eul[0] -= 2.0*M_PI; else eul[0]+= 2.0*M_PI; + if(dx > 0.0) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI; } if( fabs(dy) > 3.2 && fabs(dz)<1.6 && fabs(dx)<1.6 ) { - if(dy > 0.0) eul[1] -= 2.0*M_PI; else eul[1]+= 2.0*M_PI; + if(dy > 0.0) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI; } if( fabs(dz) > 3.2 && fabs(dx)<1.6 && fabs(dy)<1.6 ) { - if(dz > 0.0) eul[2] -= 2.0*M_PI; else eul[2]+= 2.0*M_PI; + if(dz > 0.0) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI; } /* the method below was there from ancient days... but why! probably because the code sucks :) @@ -3142,8 +3141,8 @@ void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot) compatible_eul(eul1, oldrot); compatible_eul(eul2, oldrot); - d1= fabs(eul1[0]-oldrot[0]) + fabs(eul1[1]-oldrot[1]) + fabs(eul1[2]-oldrot[2]); - d2= fabs(eul2[0]-oldrot[0]) + fabs(eul2[1]-oldrot[1]) + fabs(eul2[2]-oldrot[2]); + d1= (float)fabs(eul1[0]-oldrot[0]) + (float)fabs(eul1[1]-oldrot[1]) + (float)fabs(eul1[2]-oldrot[2]); + d2= (float)fabs(eul2[0]-oldrot[0]) + (float)fabs(eul2[1]-oldrot[1]) + (float)fabs(eul2[2]-oldrot[2]); /* return best, which is just the one with lowest difference */ if( d1 > d2) { @@ -3160,14 +3159,14 @@ void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot) void SizeToMat3( float *size, float mat[][3]) { mat[0][0]= size[0]; - mat[0][1]= 0.0; - mat[0][2]= 0.0; + mat[0][1]= 0.0f; + mat[0][2]= 0.0f; mat[1][1]= size[1]; - mat[1][0]= 0.0; - mat[1][2]= 0.0; + mat[1][0]= 0.0f; + mat[1][2]= 0.0f; mat[2][2]= size[2]; - mat[2][1]= 0.0; - mat[2][0]= 0.0; + mat[2][1]= 0.0f; + mat[2][0]= 0.0f; } void SizeToMat4( float *size, float mat[][4]) @@ -3199,7 +3198,7 @@ void Mat4ToSize( float mat[][4], float *size) float Mat3ToScalef(float mat[][3]) { /* unit length vector */ - float unit_vec[3] = {0.577350269189626, 0.577350269189626, 0.577350269189626}; + float unit_vec[3] = {0.577350269189626f, 0.577350269189626f, 0.577350269189626f}; Mat3MulVecfl(mat, unit_vec); return VecLength(unit_vec); } @@ -3224,12 +3223,12 @@ void triatoquat( float *v1, float *v2, float *v3, float *quat) n[0]= vec[1]; n[1]= -vec[0]; - n[2]= 0.0; + n[2]= 0.0f; Normalize(n); - if(n[0]==0.0 && n[1]==0.0) n[0]= 1.0; + if(n[0]==0.0f && n[1]==0.0f) n[0]= 1.0f; - angle= -0.5f*saacos(vec[2]); + angle= -0.5f*(float)saacos(vec[2]); co= (float)cos(angle); si= (float)sin(angle); q1[0]= co; @@ -3244,7 +3243,7 @@ void triatoquat( float *v1, float *v2, float *v3, float *quat) Mat3MulVecfl(imat, vec); /* what angle has this line with x-axis? */ - vec[2]= 0.0; + vec[2]= 0.0f; Normalize(vec); angle= (float)(0.5*atan2(vec[1], vec[0])); @@ -3319,12 +3318,11 @@ float Normalize2(float *n) if(d>1.0e-35F) { d= (float)sqrt(d); - n[0]/=d; n[1]/=d; } else { - n[0]=n[1]= 0.0; - d= 0.0; + n[0]=n[1]= 0.0f; + d= 0.0f; } return d; } @@ -3389,9 +3387,9 @@ void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b) void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv) { float y, u, v; - y= 0.299*r + 0.587*g + 0.114*b; - u=-0.147*r - 0.289*g + 0.436*b; - v= 0.615*r - 0.515*g - 0.100*b; + y= 0.299f*r + 0.587f*g + 0.114f*b; + u=-0.147f*r - 0.289f*g + 0.436f*b; + v= 0.615f*r - 0.515f*g - 0.100f*b; *ly=y; *lu=u; @@ -3401,9 +3399,9 @@ void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv) void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb) { float r, g, b; - r=y+1.140*v; - g=y-0.394*u - 0.581*v; - b=y+2.032*u; + r=y+1.140f*v; + g=y-0.394f*u - 0.581f*v; + b=y+2.032f*u; *lr=r; *lg=g; @@ -3415,14 +3413,14 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr) float sr,sg, sb; float y, cr, cb; - sr=255.0*r; - sg=255.0*g; - sb=255.0*b; + sr=255.0f*r; + sg=255.0f*g; + sb=255.0f*b; - y=(0.257*sr)+(0.504*sg)+(0.098*sb)+16.0; - cb=(-0.148*sr)-(0.291*sg)+(0.439*sb)+128.0; - cr=(0.439*sr)-(0.368*sg)-(0.071*sb)+128.0; + y=(0.257f*sr)+(0.504f*sg)+(0.098f*sb)+16.0f; + cb=(-0.148f*sr)-(0.291f*sg)+(0.439f*sb)+128.0f; + cr=(0.439f*sr)-(0.368f*sg)-(0.071f*sb)+128.0f; *ly=y; *lcb=cb; @@ -3433,13 +3431,13 @@ void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb) { float r,g,b; - r=1.164*(y-16)+1.596*(cr-128); - g=1.164*(y-16)-0.813*(cr-128)-0.392*(cb-128); - b=1.164*(y-16)+2.017*(cb-128); + r=1.164f*(y-16.0f)+1.596f*(cr-128.0f); + g=1.164f*(y-16.0f)-0.813f*(cr-128.0f)-0.392f*(cb-128.0f); + b=1.164f*(y-16.0f)+2.017f*(cb-128.0f); - *lr=r/255.0; - *lg=g/255.0; - *lb=b/255.0; + *lr=r/255.0f; + *lg=g/255.0f; + *lb=b/255.0f; } void hex_to_rgb(char *hexcol, float *r, float *g, float *b) @@ -3449,9 +3447,9 @@ void hex_to_rgb(char *hexcol, float *r, float *g, float *b) if (hexcol[0] == '#') hexcol++; if (sscanf(hexcol, "%02x%02x%02x", &ri, &gi, &bi)) { - *r = ri / 255.0; - *g = gi / 255.0; - *b = bi / 255.0; + *r = ri / 255.0f; + *g = gi / 255.0f; + *b = bi / 255.0f; } } @@ -3469,14 +3467,14 @@ void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv) cmin = (b0) { - *u = (1.0 - (atan2(x/len,y/len) / M_PI)) / 2.0; - } else { + len= (float)sqrt(x*x+y*y); + if(len > 0.0f) + *u = (float)((1.0 - (atan2(x/len,y/len) / M_PI)) / 2.0); + else *v = *u = 0.0f; /* to avoid un-initialized variables */ - } } /* ------------------------------------------------------------------------- */ @@ -3646,14 +3642,13 @@ void spheremap(float x, float y, float z, float *u, float *v) { float len; - len= sqrt(x*x+y*y+z*z); - if(len>0.0) { - - if(x==0.0 && y==0.0) *u= 0.0; /* othwise domain error */ - else *u = (1.0 - atan2(x,y)/M_PI )/2.0; + len= (float)sqrt(x*x+y*y+z*z); + if(len > 0.0f) { + if(x==0.0f && y==0.0f) *u= 0.0f; /* othwise domain error */ + else *u = (float)((1.0 - (float)atan2(x,y) / M_PI) / 2.0); z/=len; - *v = 1.0- saacos(z)/M_PI; + *v = 1.0f - (float)saacos(z)/(float)M_PI; } else { *v = *u = 0.0f; /* to avoid un-initialized variables */ } @@ -3913,7 +3908,7 @@ static int getLowestRoot(float a, float b, float c, float maxR, float* root) { // calculate the two roots: (if determinant == 0 then // x1==x2 but let’s disregard that slight optimization) - float sqrtD = sqrt(determinant); + float sqrtD = (float)sqrt(determinant); float r1 = (-b - sqrtD) / (2.0f*a); float r2 = (-b + sqrtD) / (2.0f*a); @@ -4694,5 +4689,5 @@ void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, /* used for zoom values*/ float power_of_2(float val) { - return pow(2, ceil(log(val) / log(2))); + return (float)pow(2, ceil(log(val) / log(2))); } diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 6e575ab1952..be763cb21c7 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -162,18 +162,18 @@ void make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent) VECCOPY(eBone->head, curBone->arm_head); VECCOPY(eBone->tail, curBone->arm_tail); - eBone->roll= 0.0; + eBone->roll= 0.0f; /* roll fixing */ VecSubf(delta, eBone->tail, eBone->head); - vec_roll_to_mat3(delta, 0.0, postmat); + vec_roll_to_mat3(delta, 0.0f, postmat); Mat3CpyMat4(premat, curBone->arm_mat); Mat3Inv(imat, postmat); Mat3MulMat3(difmat, imat, premat); - eBone->roll = atan2(difmat[2][0], difmat[2][2]); + eBone->roll = (float)atan2(difmat[2][0], difmat[2][2]); /* rest of stuff copy */ eBone->length= curBone->length; @@ -234,7 +234,7 @@ static void fix_bonelist_roll (ListBase *bonelist, ListBase *editbonelist) printmatrix4("difmat", difmat); printf ("Roll = %f\n", (-atan2(difmat[2][0], difmat[2][2]) * (180.0/M_PI))); #endif - curBone->roll = -atan2(difmat[2][0], difmat[2][2]); + curBone->roll = (float)-atan2(difmat[2][0], difmat[2][2]); /* and set restposition again */ where_is_armature_bone(curBone, curBone->parent); @@ -403,13 +403,13 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) DO_MINMAX(ebone->tail, min, max); } - cent[0]= (min[0]+max[0])/2.0f; - cent[1]= (min[1]+max[1])/2.0f; - cent[2]= (min[2]+max[2])/2.0f; + cent[0]= (min[0] + max[0]) / 2.0f; + cent[1]= (min[1] + max[1]) / 2.0f; + cent[2]= (min[2] + max[2]) / 2.0f; } /* Do the adjustments */ - for (ebone= arm->edbo->first; ebone; ebone=ebone->next){ + for (ebone= arm->edbo->first; ebone; ebone=ebone->next) { VecSubf(ebone->head, ebone->head, cent); VecSubf(ebone->tail, ebone->tail, cent); } @@ -422,9 +422,9 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) Mat3CpyMat4(omat, ob->obmat); Mat3MulVecfl(omat, cent); - ob->loc[0]+= cent[0]; - ob->loc[1]+= cent[1]; - ob->loc[2]+= cent[2]; + ob->loc[0] += cent[0]; + ob->loc[1] += cent[1]; + ob->loc[2] += cent[2]; } else ED_armature_edit_free(ob); @@ -477,7 +477,7 @@ void unique_editbone_name (ListBase *edbo, char *name) *dot=0; } - for (number = 1; number <=999; number++) { + for (number = 1; number <= 999; number++) { sprintf(tempname, "%s.%03d", name, number); if (!editbone_name_exists(edbo, tempname)) { BLI_strncpy(name, tempname, 32); @@ -745,7 +745,7 @@ int join_armature(Scene *scene, View3D *v3d) Mat4Invert(imat, premat); Mat4MulMat4(difmat, postmat, imat); - curbone->roll -= atan2(difmat[2][0], difmat[2][2]); + curbone->roll -= (float)atan2(difmat[2][0], difmat[2][2]); } /* Fix Constraints and Other Links to this Bone and Armature */ @@ -1905,7 +1905,7 @@ void auto_align_ebone_tocursor(Scene *scene, View3D *v3d, EditBone *ebone) /* check that cursor is in usable position */ if ((IS_EQ(vec[0], 0)==0) && (IS_EQ(vec[2], 0)==0)) { /* Compute a rotation matrix around y */ - rot[1] = atan2(vec[0], vec[2]); + rot[1] = (float)atan2(vec[0], vec[2]); rot[0] = rot[2] = 0.0f; EulToMat4(rot, rmat); @@ -2359,7 +2359,7 @@ void adduplicate_armature(Scene *scene) /* Lets duplicate the list of constraints that the * current bone has. */ - if (OBACT->pose) { + if (obedit->pose) { bPoseChannel *chanold, *channew; ListBase *listold, *listnew; diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index fb3195db030..fbc475d3bdd 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -3510,7 +3510,7 @@ static void outliner_draw_struct_marks(ARegion *ar, SpaceOops *soops, ListBase * if((tselem->flag & TSE_CLOSED)==0) { outliner_draw_struct_marks(ar, soops, &te->subtree, starty); if(tselem->type == TSE_RNA_STRUCT) - fdrawline(0, *starty+OL_H-1, (int)ar->v2d.cur.xmax, *starty+OL_H-1); + fdrawline(0, (float)*starty+OL_H-1, ar->v2d.cur.xmax, (float)*starty+OL_H-1); } } } @@ -3919,14 +3919,14 @@ static void outliner_draw_rnacols(ARegion *ar, SpaceOops *soops, int sizex) UI_ThemeColorShadeAlpha(TH_BACK, -15, -200); /* draw column separator lines */ - fdrawline(sizex, + fdrawline((float)sizex, v2d->cur.ymax, - sizex, + (float)sizex, v2d->cur.ymin); - fdrawline(sizex+OL_RNA_COL_SIZEX, + fdrawline((float)sizex+OL_RNA_COL_SIZEX, v2d->cur.ymax, - sizex+OL_RNA_COL_SIZEX, + (float)sizex+OL_RNA_COL_SIZEX, v2d->cur.ymin); } @@ -3945,15 +3945,15 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa if(tselem->type == TSE_RNA_PROPERTY) { ptr= &te->rnaptr; prop= te->directdata; - + if(!(RNA_property_type(ptr, prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0)) - uiDefAutoButR(block, ptr, prop, -1, "", sizex, te->ys, OL_RNA_COL_SIZEX, OL_H-1); + uiDefAutoButR(block, ptr, prop, -1, "", sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1); } else if(tselem->type == TSE_RNA_ARRAY_ELEM) { ptr= &te->rnaptr; prop= te->directdata; - - uiDefAutoButR(block, ptr, prop, te->index, "", sizex, te->ys, OL_RNA_COL_SIZEX, OL_H-1); + + uiDefAutoButR(block, ptr, prop, te->index, "", sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1); } } diff --git a/source/blender/editors/space_outliner/outliner_header.c b/source/blender/editors/space_outliner/outliner_header.c index 1f3bf71f814..2c114f3099b 100644 --- a/source/blender/editors/space_outliner/outliner_header.c +++ b/source/blender/editors/space_outliner/outliner_header.c @@ -199,16 +199,16 @@ void outliner_header_buttons(const bContext *C, ARegion *ar) uiBlockSetEmboss(block, UI_EMBOSS); } - if(1) { // XXX soutliner->type==SO_OUTLINER) { + //if (outliner->type==SO_OUTLINER) { if(G.main->library.first) uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Libraries %x7|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); else uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); - } + //} /* always as last */ - UI_view2d_totRect_set(&ar->v2d, xco+XIC+100, ar->v2d.tot.ymax-ar->v2d.tot.ymin); + UI_view2d_totRect_set(&ar->v2d, xco+XIC+100, (int)(ar->v2d.tot.ymax-ar->v2d.tot.ymin)); uiEndBlock(C, block); uiDrawBlock(C, block); diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c index 5b36939a471..d28fdc7f371 100644 --- a/source/blender/editors/space_time/space_time.c +++ b/source/blender/editors/space_time/space_time.c @@ -93,8 +93,8 @@ static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar UI_ThemeColorShade(TH_BACK, -25); if (PSFRA < PEFRA) { - glRectf(v2d->cur.xmin, v2d->cur.ymin, PSFRA, v2d->cur.ymax); - glRectf(PEFRA, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); + glRectf(v2d->cur.xmin, v2d->cur.ymin, (float)PSFRA, v2d->cur.ymax); + glRectf((float)PEFRA, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); } else { glRectf(v2d->cur.xmin, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); @@ -102,8 +102,8 @@ static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar UI_ThemeColorShade(TH_BACK, -60); /* thin lines where the actual frames are */ - fdrawline(PSFRA, v2d->cur.ymin, PSFRA, v2d->cur.ymax); - fdrawline(PEFRA, v2d->cur.ymin, PEFRA, v2d->cur.ymax); + fdrawline((float)PSFRA, v2d->cur.ymin, (float)PSFRA, v2d->cur.ymax); + fdrawline((float)PEFRA, v2d->cur.ymin, (float)PEFRA, v2d->cur.ymax); } /* add handlers, stuff you only do once or on area/region changes */ diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c index e4acf052534..65946a4288b 100644 --- a/source/blender/editors/space_time/time_header.c +++ b/source/blender/editors/space_time/time_header.c @@ -469,28 +469,28 @@ void time_header_buttons(const bContext *C, ARegion *ar) if (scene->r.psfra) { uiDefButI(block, NUM, B_REDRAWALL,"Start:", - xco,yco, 4.5*XIC, YIC, + xco,yco, (int)4.5*XIC, YIC, &scene->r.psfra,MINFRAMEF, MAXFRAMEF, 0, 0, "The start frame of the animation preview (inclusive)"); - xco += (short)(4.5*XIC); + xco += (int)(4.5*XIC); uiDefButI(block, NUM, B_REDRAWALL,"End:", - xco,yco,4.5*XIC,YIC, - &scene->r.pefra,PSFRA,MAXFRAMEF, 0, 0, + xco,yco, (int)4.5*XIC,YIC, + &scene->r.pefra,(float)PSFRA, MAXFRAMEF, 0, 0, "The end frame of the animation preview (inclusive)"); } else { uiDefButI(block, NUM, B_REDRAWALL,"Start:", - xco,yco, 4.5*XIC, YIC, + xco,yco, (int)4.5*XIC, YIC, &scene->r.sfra,MINFRAMEF, MAXFRAMEF, 0, 0, "The start frame of the animation (inclusive)"); xco += (short)(4.5*XIC); uiDefButI(block, NUM, B_REDRAWALL,"End:", - xco,yco,4.5*XIC,YIC, - &scene->r.efra,(float)SFRA,MAXFRAMEF, 0, 0, + xco,yco, (int)4.5*XIC,YIC, + &scene->r.efra,(float)SFRA, MAXFRAMEF, 0, 0, "The end frame of the animation (inclusive)"); } uiBlockEndAlign(block); @@ -498,7 +498,7 @@ void time_header_buttons(const bContext *C, ARegion *ar) xco += (short)(4.5 * XIC + 16); uiDefButI(block, NUM, B_NEWFRAME, "", - xco,yco,3.5*XIC,YIC, + xco,yco, (int)3.5*XIC,YIC, &(scene->r.cfra), MINFRAMEF, MAXFRAMEF, 0, 0, "Displays Current Frame of animation"); @@ -532,7 +532,7 @@ void time_header_buttons(const bContext *C, ARegion *ar) if (scene->autokey_mode & AUTOKEY_ON) { uiDefButS(block, MENU, REDRAWINFO, "Auto-Keying Mode %t|Add/Replace Keys%x3|Replace Keys %x5", - xco, yco, 3.5*XIC, YIC, &(scene->autokey_mode), 0, 1, 0, 0, + xco, yco, (int)3.5*XIC, YIC, &(scene->autokey_mode), 0, 1, 0, 0, "Mode of automatic keyframe insertion for Objects and Bones"); xco+= (4*XIC); } @@ -553,7 +553,7 @@ void time_header_buttons(const bContext *C, ARegion *ar) /* always as last */ - UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin); + UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, (int)(ar->v2d.tot.ymax-ar->v2d.tot.ymin)); uiEndBlock(C, block); uiDrawBlock(C, block); diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index b91ed0894e3..5d130cee48d 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -283,7 +283,7 @@ static short set_pchan_glColor (short colCode, int armflag, int boneflag, int co else { if (bcolor) { char *cp= bcolor->solid; - glColor4ub(cp[0], cp[1], cp[2], 0.8); + glColor4ub(cp[0], cp[1], cp[2], 204); } else UI_ThemeColorShade(TH_BACK, -30); @@ -430,7 +430,7 @@ static void draw_bonevert_solid(void) qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_FILL); glShadeModel(GL_SMOOTH); - gluSphere( qobj, 0.05, 8, 5); + gluSphere(qobj, 0.05, 8, 5); glShadeModel(GL_FLAT); gluDeleteQuadric(qobj); @@ -450,13 +450,13 @@ static void draw_bone_octahedral() displist= glGenLists(1); glNewList(displist, GL_COMPILE_AND_EXECUTE); - vec[0][0]= vec[0][1]= vec[0][2]= 0.0; - vec[5][0]= vec[5][2]= 0.0; vec[5][1]= 1.0; + vec[0][0]= vec[0][1]= vec[0][2]= 0.0f; + vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f; - vec[1][0]= 0.1; vec[1][2]= 0.1; vec[1][1]= 0.1; - vec[2][0]= 0.1; vec[2][2]= -0.1; vec[2][1]= 0.1; - vec[3][0]= -0.1; vec[3][2]= -0.1; vec[3][1]= 0.1; - vec[4][0]= -0.1; vec[4][2]= 0.1; vec[4][1]= 0.1; + vec[1][0]= 0.1f; vec[1][2]= 0.1f; vec[1][1]= 0.1f; + vec[2][0]= 0.1f; vec[2][2]= -0.1f; vec[2][1]= 0.1f; + vec[3][0]= -0.1f; vec[3][2]= -0.1f; vec[3][1]= 0.1f; + vec[4][0]= -0.1f; vec[4][2]= 0.1f; vec[4][1]= 0.1f; /* Section 1, sides */ glBegin(GL_LINE_LOOP); @@ -494,49 +494,49 @@ static void draw_bone_solid_octahedral(void) displist= glGenLists(1); glNewList(displist, GL_COMPILE_AND_EXECUTE); - vec[0][0]= vec[0][1]= vec[0][2]= 0.0; - vec[5][0]= vec[5][2]= 0.0; vec[5][1]= 1.0; + vec[0][0]= vec[0][1]= vec[0][2]= 0.0f; + vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f; - vec[1][0]= 0.1; vec[1][2]= 0.1; vec[1][1]= 0.1; - vec[2][0]= 0.1; vec[2][2]= -0.1; vec[2][1]= 0.1; - vec[3][0]= -0.1; vec[3][2]= -0.1; vec[3][1]= 0.1; - vec[4][0]= -0.1; vec[4][2]= 0.1; vec[4][1]= 0.1; + vec[1][0]= 0.1f; vec[1][2]= 0.1f; vec[1][1]= 0.1f; + vec[2][0]= 0.1f; vec[2][2]= -0.1f; vec[2][1]= 0.1f; + vec[3][0]= -0.1f; vec[3][2]= -0.1f; vec[3][1]= 0.1f; + vec[4][0]= -0.1f; vec[4][2]= 0.1f; vec[4][1]= 0.1f; glBegin(GL_TRIANGLES); /* bottom */ CalcNormFloat(vec[2], vec[1], vec[0], nor); glNormal3fv(nor); - glVertex3fv(vec[2]);glVertex3fv(vec[1]);glVertex3fv(vec[0]); + glVertex3fv(vec[2]); glVertex3fv(vec[1]); glVertex3fv(vec[0]); CalcNormFloat(vec[3], vec[2], vec[0], nor); glNormal3fv(nor); - glVertex3fv(vec[3]);glVertex3fv(vec[2]);glVertex3fv(vec[0]); + glVertex3fv(vec[3]); glVertex3fv(vec[2]); glVertex3fv(vec[0]); CalcNormFloat(vec[4], vec[3], vec[0], nor); glNormal3fv(nor); - glVertex3fv(vec[4]);glVertex3fv(vec[3]);glVertex3fv(vec[0]); + glVertex3fv(vec[4]); glVertex3fv(vec[3]); glVertex3fv(vec[0]); CalcNormFloat(vec[1], vec[4], vec[0], nor); glNormal3fv(nor); - glVertex3fv(vec[1]);glVertex3fv(vec[4]);glVertex3fv(vec[0]); + glVertex3fv(vec[1]); glVertex3fv(vec[4]); glVertex3fv(vec[0]); /* top */ CalcNormFloat(vec[5], vec[1], vec[2], nor); glNormal3fv(nor); - glVertex3fv(vec[5]);glVertex3fv(vec[1]);glVertex3fv(vec[2]); + glVertex3fv(vec[5]); glVertex3fv(vec[1]); glVertex3fv(vec[2]); CalcNormFloat(vec[5], vec[2], vec[3], nor); glNormal3fv(nor); - glVertex3fv(vec[5]);glVertex3fv(vec[2]);glVertex3fv(vec[3]); + glVertex3fv(vec[5]); glVertex3fv(vec[2]); glVertex3fv(vec[3]); CalcNormFloat(vec[5], vec[3], vec[4], nor); glNormal3fv(nor); - glVertex3fv(vec[5]);glVertex3fv(vec[3]);glVertex3fv(vec[4]); + glVertex3fv(vec[5]); glVertex3fv(vec[3]); glVertex3fv(vec[4]); CalcNormFloat(vec[5], vec[4], vec[1], nor); glNormal3fv(nor); - glVertex3fv(vec[5]);glVertex3fv(vec[4]);glVertex3fv(vec[1]); + glVertex3fv(vec[5]); glVertex3fv(vec[4]); glVertex3fv(vec[1]); glEnd(); @@ -592,38 +592,38 @@ static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id) UI_ThemeColor(TH_BONE_SOLID); } - glTranslatef(0.0, 1.0, 0.0); + glTranslatef(0.0f, 1.0f, 0.0f); if (dt > OB_WIRE) draw_bonevert_solid(); else draw_bonevert(); - glTranslatef(0.0, -1.0, 0.0); + glTranslatef(0.0f, -1.0f, 0.0f); } /* 16 values of sin function (still same result!) */ static float si[16] = { - 0.00000000, - 0.20129852, 0.39435585, - 0.57126821, 0.72479278, - 0.84864425, 0.93775213, - 0.98846832, 0.99871650, - 0.96807711, 0.89780453, - 0.79077573, 0.65137248, - 0.48530196, 0.29936312, - 0.10116832 + 0.00000000f, + 0.20129852f, 0.39435585f, + 0.57126821f, 0.72479278f, + 0.84864425f, 0.93775213f, + 0.98846832f, 0.99871650f, + 0.96807711f, 0.89780453f, + 0.79077573f, 0.65137248f, + 0.48530196f, 0.29936312f, + 0.10116832f }; /* 16 values of cos function (still same result!) */ static float co[16] ={ - 1.00000000, - 0.97952994, 0.91895781, - 0.82076344, 0.68896691, - 0.52896401, 0.34730525, - 0.15142777, -0.05064916, - -0.25065253, -0.44039415, - -0.61210598, -0.75875812, - -0.87434661, -0.95413925, - -0.99486932 + 1.00000000f, + 0.97952994f, 0.91895781f, + 0.82076344f, 0.68896691f, + 0.52896401f, 0.34730525f, + 0.15142777f, -0.05064916f, + -0.25065253f, -0.44039415f, + -0.61210598f, -0.75875812f, + -0.87434661f, -0.95413925f, + -0.99486932f }; @@ -667,7 +667,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag VecSubf(dirvec, tailvec, headvec); Mat4Mul3Vecfl(smat, dirvec); /* clear zcomp */ - dirvec[2]= 0.0; + dirvec[2]= 0.0f; /* move vector back */ Mat4Mul3Vecfl(imat, dirvec); @@ -807,7 +807,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag, /* move vector to viewspace */ Mat4Mul3Vecfl(smat, dirvec); /* clear zcomp */ - dirvec[2]= 0.0; + dirvec[2]= 0.0f; /* move vector back */ Mat4Mul3Vecfl(imat, dirvec); @@ -916,9 +916,9 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u if (id != -1) glLoadName(id | BONESEL_TIP); - glTranslatef(0.0, 0.0, length); + glTranslatef(0.0f, 0.0f, length); gluSphere(qobj, tail, 16, 10); - glTranslatef(0.0, 0.0, -length); + glTranslatef(0.0f, 0.0f, -length); /* base */ if (armflag & ARM_EDITMODE) { @@ -938,7 +938,7 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u glLoadName (id | BONESEL_BONE); glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(-1.0, -1.0); + glPolygonOffset(-1.0f, -1.0f); glTranslatef(0.0f, 0.0f, head); gluCylinder(qobj, fac1*head + (1.0f-fac1)*tail, fac2*tail + (1.0f-fac2)*head, length-head-tail, 16, 1); @@ -956,7 +956,7 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u } else { /* 1 sphere in center */ - glTranslatef(0.0f, 0.0f, (head + length-tail)/2.0); + glTranslatef(0.0f, 0.0f, (head + length-tail)/2.0f); gluSphere(qobj, fac1*head + (1.0f-fac1)*tail, 16, 10); } @@ -994,7 +994,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in /* this chunk not in object mode */ if (armflag & (ARM_EDITMODE|ARM_POSEMODE)) { - glLineWidth(4.0); + glLineWidth(4.0f); if (armflag & ARM_POSEMODE) set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag); else if (armflag & ARM_EDITMODE) { @@ -1331,11 +1331,11 @@ static void bgl_sphere_project(float ax, float az) { float dir[3], sine, q3; - sine= 1.0f-ax*ax-az*az; - q3= (sine < 0.0f)? 0.0f: 2.0f*sqrt(sine); + sine= 1.0f - ax*ax - az*az; + q3= (sine < 0.0f)? 0.0f: (float)(2.0*sqrt(sine)); dir[0]= -az*q3; - dir[1]= 1.0f-2.0f*sine; + dir[1]= 1.0f - 2.0f*sine; dir[2]= ax*q3; glVertex3fv(dir); @@ -1344,11 +1344,11 @@ static void bgl_sphere_project(float ax, float az) static void draw_dof_ellipse(float ax, float az) { static float staticSine[16] = { - 0.0, 0.104528463268, 0.207911690818, 0.309016994375, - 0.406736643076, 0.5, 0.587785252292, 0.669130606359, - 0.743144825477, 0.809016994375, 0.866025403784, - 0.913545457643, 0.951056516295, 0.978147600734, - 0.994521895368, 1.0 + 0.0f, 0.104528463268f, 0.207911690818f, 0.309016994375f, + 0.406736643076f, 0.5f, 0.587785252292f, 0.669130606359f, + 0.743144825477f, 0.809016994375f, 0.866025403784f, + 0.913545457643f, 0.951056516295f, 0.978147600734f, + 0.994521895368f, 1.0f }; int i, j, n=16; @@ -1363,11 +1363,11 @@ static void draw_dof_ellipse(float ax, float az) pz= 0.0f; for(i=1; ilimitmin[i]*M_PI/360.0); - amax[i]= sin(pchan->limitmax[i]*M_PI/360.0); + amin[i]= (float)sin(pchan->limitmin[i]*M_PI/360.0); + amax[i]= (float)sin(pchan->limitmax[i]*M_PI/360.0); } - glScalef(1.0, -1.0, 1.0); - if (amin[0] != 0.0 && amin[2] != 0.0) + glScalef(1.0f, -1.0f, 1.0f); + if ((amin[0] != 0.0f) && (amin[2] != 0.0f)) draw_dof_ellipse(amin[0], amin[2]); - if (amin[0] != 0.0 && amax[2] != 0.0) + if ((amin[0] != 0.0f) && (amax[2] != 0.0f)) draw_dof_ellipse(amin[0], amax[2]); - if (amax[0] != 0.0 && amin[2] != 0.0) + if ((amax[0] != 0.0f) && (amin[2] != 0.0f)) draw_dof_ellipse(amax[0], amin[2]); - if (amax[0] != 0.0 && amax[2] != 0.0) + if ((amax[0] != 0.0f) && (amax[2] != 0.0f)) draw_dof_ellipse(amax[0], amax[2]); - glScalef(1.0, -1.0, 1.0); + glScalef(1.0f, -1.0f, 1.0f); } } /* arcs */ if (pchan->ikflag & BONE_IK_ZLIMIT) { - theta= 0.5*(pchan->limitmin[2]+pchan->limitmax[2]); + theta= 0.5f*(pchan->limitmin[2]+pchan->limitmax[2]); glRotatef(theta, 0.0f, 0.0f, 1.0f); glColor3ub(50, 50, 255); // blue, Z axis limit glBegin(GL_LINE_STRIP); for (a=-16; a<=16; a++) { float fac= ((float)a)/16.0f; - phi= fac*(M_PI/360.0f)*(pchan->limitmax[2]-pchan->limitmin[2]); + + phi= fac * (float)(M_PI/360.0f) * (pchan->limitmax[2] - pchan->limitmin[2]); i= (a == -16) ? 0 : 1; - corner[i][0]= sin(phi); - corner[i][1]= cos(phi); + corner[i][0]= (float)sin(phi); + corner[i][1]= (float)cos(phi); corner[i][2]= 0.0f; glVertex3fv(corner[i]); } @@ -1482,19 +1483,19 @@ static void draw_pose_dofs(Object *ob) } if (pchan->ikflag & BONE_IK_XLIMIT) { - theta= 0.5*(pchan->limitmin[0]+pchan->limitmax[0]); + theta= 0.5f * (pchan->limitmin[0] + pchan->limitmax[0]); glRotatef(theta, 1.0f, 0.0f, 0.0f); glColor3ub(255, 50, 50); // Red, X axis limit glBegin(GL_LINE_STRIP); for (a=-16; a<=16; a++) { float fac= ((float)a)/16.0f; - phi= 0.5f*M_PI + fac*(M_PI/360.0f)*(pchan->limitmax[0]-pchan->limitmin[0]); + phi= (float)(0.5*M_PI) + fac * (float)(M_PI/360.0f) * (pchan->limitmax[0] - pchan->limitmin[0]); i= (a == -16) ? 2 : 3; corner[i][0]= 0.0f; - corner[i][1]= sin(phi); - corner[i][2]= cos(phi); + corner[i][1]= (float)sin(phi); + corner[i][2]= (float)cos(phi); glVertex3fv(corner[i]); } glEnd(); @@ -1840,7 +1841,7 @@ static void set_matrix_editbone(EditBone *eBone) VecSubf(delta, eBone->tail, eBone->head); - eBone->length = sqrt (delta[0]*delta[0] + delta[1]*delta[1] +delta[2]*delta[2]); + eBone->length = (float)sqrt(delta[0]*delta[0] + delta[1]*delta[1] +delta[2]*delta[2]); vec_roll_to_mat3(delta, eBone->roll, mat); Mat4CpyMat3(bmat, mat); @@ -1920,7 +1921,7 @@ static void draw_ebones(View3D *v3d, RegionView3D *rv3d, Object *ob, int dt) index= 0; } else if (dt > OB_WIRE) - bglPolygonOffset(rv3d->dist, 1.0); + bglPolygonOffset(rv3d->dist, 1.0f); else if (arm->flag & ARM_EDITMODE) index= 0; /* do selection codes */ @@ -1971,7 +1972,7 @@ static void draw_ebones(View3D *v3d, RegionView3D *rv3d, Object *ob, int dt) /* restore */ if (arm->drawtype==ARM_LINE); - else if (dt>OB_WIRE) bglPolygonOffset(rv3d->dist, 0.0); + else if (dt>OB_WIRE) bglPolygonOffset(rv3d->dist, 0.0f); /* finally names and axes */ if (arm->flag & (ARM_DRAWNAMES|ARM_DRAWAXES)) { @@ -2091,11 +2092,11 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec if ((a+sfra) < CFRA) { /* black - before cfra */ if (pchan->bone->flag & BONE_SELECTED) { - // intensity= 0.5; + // intensity= 0.5f; intensity = SET_INTENSITY(sfra, a, CFRA, 0.25f, 0.75f); } else { - //intensity= 0.8; + //intensity= 0.8f; intensity = SET_INTENSITY(sfra, a, CFRA, 0.68f, 0.92f); } UI_ThemeColorBlend(TH_WIRE, TH_BACK, intensity); @@ -2103,11 +2104,11 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec else if ((a+sfra) > CFRA) { /* blue - after cfra */ if (pchan->bone->flag & BONE_SELECTED) { - //intensity = 0.5; + //intensity = 0.5f; intensity = SET_INTENSITY(CFRA, a, efra, 0.25f, 0.75f); } else { - //intensity = 0.8; + //intensity = 0.8f; intensity = SET_INTENSITY(CFRA, a, efra, 0.68f, 0.92f); } UI_ThemeColorBlend(TH_BONE_POSE, TH_BACK, intensity); @@ -2115,10 +2116,10 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec else { /* green - on cfra */ if (pchan->bone->flag & BONE_SELECTED) { - intensity= 0.5; + intensity= 0.5f; } else { - intensity= 0.99; + intensity= 0.99f; } UI_ThemeColorBlendShade(TH_CFRAME, TH_BACK, intensity, 10); } @@ -2184,7 +2185,7 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec /* Draw slightly-larger yellow dots at each keyframe */ UI_ThemeColor(TH_VERTEX_SELECT); - glPointSize(5.0); + glPointSize(5.0f); glBegin(GL_POINTS); for (a=0, fp=fp_start; apathflag & ARM_PATH_FNUMS) || (arm->pathflag & ARM_PATH_KFNOS)) { @@ -2265,8 +2266,8 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, RegionView3D *rv3d float start, end, stepsize, range, colfac; int cfrao, flago, ipoflago; - start = arm->ghostsf; - end = arm->ghostef; + start = (float)arm->ghostsf; + end = (float)arm->ghostef; if (end <= start) return; @@ -2292,9 +2293,9 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, RegionView3D *rv3d if (v3d->zbuf) glDisable(GL_DEPTH_TEST); /* draw from first frame of range to last */ - for (CFRA= start; CFRAghostsf; - aki.end= end = arm->ghostef; + aki.start= start = (float)arm->ghostsf; + aki.end= end = (float)arm->ghostef; if (end <= start) return; @@ -2368,7 +2369,7 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, RegionView3D *rv3d, /* draw from first frame of range to last */ for (ak=keys.first, i=0; ak; ak=ak->next, i++) { colfac = i/range; - UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0f*sqrt(colfac))); + UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0*sqrt(colfac))); CFRA= (int)ak->cfra; @@ -2428,7 +2429,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base ob->flag &= ~OB_POSEMODE; cfrao= CFRA; if (maptime) actframe= get_action_frame(ob, (float)CFRA); - else actframe= CFRA; + else actframe= (float)CFRA; flago= arm->flag; arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES); @@ -2444,25 +2445,25 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base /* draw from darkest blend to lowest */ for(cur= stepsize; cur= start && actframe+ctime <= end) { if (maptime) CFRA= (int)get_action_frame_inv(ob, actframe+ctime); else CFRA= (int)floor(actframe+ctime); - if (CFRA!=cfrao) { + if (CFRA != cfrao) { //do_all_pose_actions(scene, ob); // xxx old animation system crap where_is_pose(scene, ob); draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE); } } - ctime= cur + fmod((float)cfrao, stepsize) - stepsize+1.0f; /* ensures consistant stepping */ + ctime= cur + (float)fmod((float)cfrao, stepsize) - stepsize+1.0f; /* ensures consistant stepping */ colfac= ctime/range; - UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0f*sqrt(colfac))); + UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0*sqrt(colfac))); /* only within action range */ if ((actframe-ctime >= start) && (actframe-ctime <= end)) { From ca418381fd23766997f222bd289d9a0e2fcf955c Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 09:49:36 +0000 Subject: [PATCH 25/63] 2.5 Bugfix: CTRL+W "Save file" still gave a 'save over' popup when the file didn't exist yet. It then attempted to free the operator twice. --- source/blender/editors/interface/interface_regions.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 696fde4b512..1eb4588ac0b 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -2301,16 +2301,15 @@ void uiPupMenuSaveOver(bContext *C, wmOperator *op, char *filename) if(len==0) return; - if(BLI_exists(filename)==0) - operator_cb(C, op, 1); - if(filename[len-1]=='/' || filename[len-1]=='\\') { uiPupMenuError(C, "Cannot overwrite a directory"); WM_operator_free(op); return; } - - confirm_operator(C, op, "Save over", filename); + if(BLI_exists(filename)==0) + operator_cb(C, op, 1); + else + confirm_operator(C, op, "Save over", filename); } void uiPupMenuNotice(bContext *C, char *str, ...) From c519d69a607ca41863092ab1a61bb84239b93719 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 10 Feb 2009 09:55:46 +0000 Subject: [PATCH 26/63] Armature Parenting: Fixing up this operator to use the new context iterators properly --- .../blender/editors/armature/editarmature.c | 95 ++++++++----------- 1 file changed, 42 insertions(+), 53 deletions(-) diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index be763cb21c7..b45390683b5 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3357,65 +3357,61 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op) { Object *ob= CTX_data_edit_object(C); bArmature *arm= (bArmature *)ob->data; - EditBone *flipbone, *flippar; EditBone *actbone = CTX_data_active_bone(C); - short allchildbones= 0, foundselbone= 0; + EditBone *actmirb = NULL; short val = RNA_enum_get(op->ptr, "type"); - /* find selected bones */ - CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { - if (ebone != actbone) { - foundselbone++; - if (ebone->parent != actbone) allchildbones= 1; - } + /* there must be an active bone */ + if (actbone == NULL) { + BKE_report(op->reports, RPT_ERROR, "Operation requires an Active Bone"); + return OPERATOR_CANCELLED; } - CTX_DATA_END; - - if (foundselbone==0 && actbone->parent) { + else if (arm->flag & ARM_MIRROR_EDIT) { + /* For X-Axis Mirror Editing option, we may need a mirror copy of actbone + * - if there's a mirrored copy of selbone, try to find a mirrored copy of actbone + * (i.e. selbone="child.L" and actbone="parent.L", find "child.R" and "parent.R"). + * This is useful for arm-chains, for example parenting lower arm to upper arm + * - if there's no mirrored copy of actbone (i.e. actbone = "parent.C" or "parent") + * then just use actbone. Useful when doing upper arm to spine. + */ + actmirb= ED_armature_bone_get_mirrored(arm->edbo, actbone); + if (actmirb == NULL) + actmirb= actbone; + } + + /* if there is only 1 selected bone, we assume that that is the active bone, + * since a user will need to have clicked on a bone (thus selecting it) to make it active + */ + if (CTX_DATA_COUNT(C, selected_editable_bones) <= 1) { /* When only the active bone is selected, and it has a parent, * connect it to the parent, as that is the only possible outcome. */ - bone_connect_to_existing_parent(actbone); - - if (arm->flag & ARM_MIRROR_EDIT) { - flipbone = ED_armature_bone_get_mirrored(arm->edbo, actbone); - if (flipbone) - bone_connect_to_existing_parent(flipbone); + if (actbone->parent) { + bone_connect_to_existing_parent(actbone); + + if ((arm->flag & ARM_MIRROR_EDIT) && (actmirb->parent)) + bone_connect_to_existing_parent(actmirb); } } else { - /* loop through all editbones, parenting all selected bones to the active bone */ - CTX_DATA_BEGIN(C, EditBone *, selbone, selected_editable_bones) { - if (selbone!=actbone) { - /* parent selbone to actbone */ - bone_connect_to_new_parent(arm->edbo, selbone, actbone, val); - - if (arm->flag & ARM_MIRROR_EDIT) { - /* - if there's a mirrored copy of selbone, try to find a mirrored copy of actbone - * (i.e. selbone="child.L" and actbone="parent.L", find "child.R" and "parent.R"). - * This is useful for arm-chains, for example parenting lower arm to upper arm - * - if there's no mirrored copy of actbone (i.e. actbone = "parent.C" or "parent") - * then just use actbone. Useful when doing upper arm to spine. - */ - flipbone = ED_armature_bone_get_mirrored(arm->edbo, selbone); - flippar = ED_armature_bone_get_mirrored(arm->edbo, actbone); - - if (flipbone) { - if (flippar) - bone_connect_to_new_parent(arm->edbo, flipbone, flippar, val); - else - bone_connect_to_new_parent(arm->edbo, flipbone, actbone, val); - } - } - } + /* Parent 'selected' bones to the active one + * - the context iterator contains both selected bones and their mirrored copies, + * so we assume that unselected bones are mirrored copies of some selected bone + */ + + /* align selected bones to the active one */ + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { + if (ebone->flag & BONE_SELECTED) + bone_connect_to_new_parent(arm->edbo, ebone, actbone, val); + else + bone_connect_to_new_parent(arm->edbo, ebone, actmirb, val); } CTX_DATA_END; } - - armature_sync_selection(arm->edbo); + /* note, notifier might evolve */ - WM_event_add_notifier(C, NC_OBJECT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); return OPERATOR_FINISHED; } @@ -3436,7 +3432,7 @@ static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *even uiMenuItemEnumO(head, 0, "ARMATURE_OT_set_parent", "type", ARM_PAR_CONNECT); /* ob becomes parent, make the associated menus */ - if(allchildbones) + if (allchildbones) uiMenuItemEnumO(head, 0, "ARMATURE_OT_set_parent", "type", ARM_PAR_OFFSET); uiPupMenuEnd(C, head); @@ -3458,7 +3454,7 @@ void ARMATURE_OT_parent_set(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - RNA_def_enum(ot->srna, "type", prop_editarm_make_parent_types, 0, "ParentType", "Type Of parenting"); + RNA_def_enum(ot->srna, "type", prop_editarm_make_parent_types, 0, "ParentType", "Type of parenting"); } static EnumPropertyItem prop_editarm_clear_parent_types[] = { @@ -3482,16 +3478,9 @@ static int armature_parent_clear_exec(bContext *C, wmOperator *op) { Object *ob= CTX_data_edit_object(C); bArmature *arm= (bArmature *)ob->data; - EditBone *flipbone = NULL; int val = RNA_enum_get(op->ptr, "type"); CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { - if (arm->flag & ARM_MIRROR_EDIT) - flipbone = ED_armature_bone_get_mirrored(arm->edbo, ebone); - - if (flipbone) - editbone_clear_parent(flipbone, val); - editbone_clear_parent(ebone, val); } CTX_DATA_END; From 6f2d5b8e8ac244509b5c4d4a0633d12bfb867b44 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 10 Feb 2009 10:42:04 +0000 Subject: [PATCH 27/63] Graph Editor: Restoring 'View All' (HomeKey) and Auto-Set Preview Range ('Ctrl Alt P') --- source/blender/blenkernel/BKE_fcurve.h | 3 + source/blender/blenkernel/intern/fcurve.c | 67 +++++++++++++++++++ .../blender/editors/space_graph/graph_edit.c | 35 +++++----- .../blender/editors/space_graph/graph_ops.c | 8 +-- 4 files changed, 90 insertions(+), 23 deletions(-) diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h index 87c230eec91..dd5e0dd6e21 100644 --- a/source/blender/blenkernel/BKE_fcurve.h +++ b/source/blender/blenkernel/BKE_fcurve.h @@ -89,6 +89,9 @@ struct FCurve *list_find_fcurve(ListBase *list, const char rna_path[], const int /* get the time extents for F-Curve */ void calc_fcurve_range(struct FCurve *fcu, float *min, float *max); +/* get the bounding-box extents for F-Curve */ +void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax); + /* -------- Curve Sanity -------- */ void calchandles_fcurve(struct FCurve *fcu); diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 72e4932e622..6f8732a35e2 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -170,6 +170,73 @@ FCurve *list_find_fcurve (ListBase *list, const char rna_path[], const int array return NULL; } +/* Calculate the extents of F-Curve's data */ +void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax) +{ + float xminv=999999999.0f, xmaxv=-999999999.0f; + float yminv=999999999.0f, ymaxv=-999999999.0f; + short foundvert=0; + int i; + + if (fcu->totvert) { + if (fcu->bezt) { + /* frame range can be directly calculated from end verts */ + if (xmin || xmax) { + xminv= MIN2(xminv, fcu->bezt[0].vec[1][0]); + xmaxv= MAX2(xmaxv, fcu->bezt[fcu->totvert-1].vec[1][0]); + } + + /* only loop over keyframes to find extents for values if needed */ + if (ymin || ymax) { + BezTriple *bezt; + + for (bezt=fcu->bezt, i=0; i < fcu->totvert; bezt++, i++) { + yminv= MIN2(yminv, bezt->vec[1][1]); + ymaxv= MAX2(ymaxv, bezt->vec[1][1]); + } + } + } + else if (fcu->fpt) { + /* frame range can be directly calculated from end verts */ + if (xmin || xmax) { + xminv= MIN2(xminv, fcu->fpt[0].vec[0]); + xmaxv= MAX2(xmaxv, fcu->fpt[fcu->totvert-1].vec[0]); + } + + /* only loop over keyframes to find extents for values if needed */ + if (ymin || ymax) { + FPoint *fpt; + + for (fpt=fcu->fpt, i=0; i < fcu->totvert; fpt++, i++) { + yminv= MIN2(yminv, fpt->vec[1]); + ymaxv= MAX2(ymaxv, fpt->vec[1]); + } + } + } + + foundvert=1; + } + + /* minimum sizes are 1.0f */ + if (foundvert) { + if (xminv == xmaxv) xmaxv += 1.0f; + if (yminv == ymaxv) ymaxv += 1.0f; + + if (xmin) *xmin= xminv; + if (xmax) *xmax= xmaxv; + + if (ymin) *ymin= yminv; + if (ymax) *ymax= ymaxv; + } + else { + if (xmin) *xmin= 0.0f; + if (xmax) *xmax= 0.0f; + + if (ymin) *ymin= 1.0f; + if (ymax) *ymax= 1.0f; + } +} + /* Calculate the extents of F-Curve's keyframes */ void calc_fcurve_range (FCurve *fcu, float *start, float *end) { diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index 08f724bb9a4..e5edbf7d5bb 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -84,15 +84,13 @@ #include "graph_intern.h" -#if 0 // XXX code to be sanitied for new system - /* ************************************************************************** */ /* KEYFRAME-RANGE STUFF */ /* *************************** Calculate Range ************************** */ /* Get the min/max keyframes*/ -static void get_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax) +static void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -105,23 +103,19 @@ static void get_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, fl /* set large values to try to override */ if (xmin) *xmin= 999999999.0f; if (xmax) *xmax= -999999999.0f; - //if (ymin) *ymin= 999999999.0f; - //if (ymax) *ymax= -999999999.0f; - - // XXX - if (ymin) *ymin= -10; - if (ymax) *ymax= 10; + if (ymin) *ymin= 999999999.0f; + if (ymax) *ymax= -999999999.0f; /* check if any channels to set range with */ if (anim_data.first) { /* go through channels, finding max extents */ for (ale= anim_data.first; ale; ale= ale->next) { - Object *nob= ANIM_nla_mapping_get(ac, ale); + Object *nob= NULL; //ANIM_nla_mapping_get(ac, ale); FCurve *fcu= (FCurve *)ale->key_data; float tmin, tmax; /* get range and apply necessary scaling before */ - calc_fcurve_range(fcu, &tmin, &tmax); + calc_fcurve_bounds(fcu, &tmin, &tmax, ymin, ymax); if (nob) { tmin= get_action_frame_inv(nob, tmin); @@ -146,6 +140,9 @@ static void get_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, fl if (xmin) *xmin= -5; if (xmax) *xmax= 100; } + + if (ymin) *ymin= -5; + if (ymax) *ymax= 5; } } @@ -166,7 +163,7 @@ static int graphkeys_previewrange_exec(bContext *C, wmOperator *op) scene= ac.scene; /* set the range directly */ - get_keyframe_extents(&ac, &min, &max); + get_graph_keyframe_extents(&ac, &min, &max, NULL, NULL); scene->r.psfra= (int)floor(min + 0.5f); scene->r.pefra= (int)floor(max + 0.5f); @@ -205,13 +202,13 @@ static int graphkeys_viewall_exec(bContext *C, wmOperator *op) v2d= &ac.ar->v2d; /* set the horizontal range, with an extra offset so that the extreme keys will be in view */ - get_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, &v2d->cur.ymin, &v2d->cur.ymax); + get_graph_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, &v2d->cur.ymin, &v2d->cur.ymax); - extra= 0.05f * (v2d->cur.xmax - v2d->cur.xmin); + extra= 0.1f * (v2d->cur.xmax - v2d->cur.xmin); v2d->cur.xmin -= extra; v2d->cur.xmax += extra; - extra= 0.05f * (v2d->cur.ymax - v2d->cur.ymin); + extra= 0.1f * (v2d->cur.ymax - v2d->cur.ymin); v2d->cur.ymin -= extra; v2d->cur.ymax += extra; @@ -238,17 +235,17 @@ void GRAPHEDIT_OT_view_all (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } + /* ************************************************************************** */ /* GENERAL STUFF */ +#if 0 // XXX stuff to be sanitised for the new anim system + // TODO: // - insert key /* ******************** Copy/Paste Keyframes Operator ************************* */ -/* - The copy/paste buffer currently stores a set of Action Channels, with temporary - * IPO-blocks, and also temporary IpoCurves which only contain the selected keyframes. - * - Only pastes between compatable data is possible (i.e. same achan->name, ipo-curve type, etc.) - * Unless there is only one element in the buffer, names are also tested to check for compatability. +/* - xxx... * - All pasted frames are offset by the same amount. This is calculated as the difference in the times of * the current frame and the 'first keyframe' (i.e. the earliest one in all channels). * - The earliest frame is calculated per copy operation. diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index 9c7fa307a7f..09c5b9c7f07 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -97,8 +97,8 @@ void graphedit_operatortypes(void) { /* view */ WM_operatortype_append(GRAPHEDIT_OT_view_togglehandles); - //WM_operatortype_append(GRAPHEDIT_OT_set_previewrange); - //WM_operatortype_append(GRAPHEDIT_OT_view_all); + WM_operatortype_append(GRAPHEDIT_OT_set_previewrange); + WM_operatortype_append(GRAPHEDIT_OT_view_all); /* keyframes */ /* selection */ @@ -183,8 +183,8 @@ static void graphedit_keymap_keyframes (wmWindowManager *wm, ListBase *keymap) #endif // XXX code to be sanitied for new system /* auto-set range */ - //WM_keymap_add_item(keymap, "GRAPHEDIT_OT_set_previewrange", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); - //WM_keymap_add_item(keymap, "GRAPHEDIT_OT_view_all", HOMEKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "GRAPHEDIT_OT_set_previewrange", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); + WM_keymap_add_item(keymap, "GRAPHEDIT_OT_view_all", HOMEKEY, KM_PRESS, 0, 0); /* transform system */ transform_keymap_for_space(wm, keymap, SPACE_IPO); From f7a65886326a8cc17d7f7cf5b6e3988699d95329 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 10 Feb 2009 11:37:14 +0000 Subject: [PATCH 28/63] Graph Editor: Visibility toggles F-Curves can now be hidden/shown in the Graph Editor in one of 3 ways: * Specialised VKEY toggle hotkey, which alters the visibility of all selected F-Curves * The setting toggle operators (Shift-W, Alt-W, Ctrl-Shift-W) * Checkmark (*1) boxes in front of names of F-Curves This allows irrelevant curves to be hidden from the keyframes area only if you want them hidden. By default, all curves are visible. Also note that a separate hotkey is used now for toggling visibility (VKEY) instead of lumping it under select-all (AKEY) as in the past, which was a major cause of confusion. Notes: 1) I've used the ICON_BLANK011 and ICON_BLANK012 icons, which in the current icon set are two states for a checkbox type thing. These defines should probably get renamed sometime, but I'll leave that up to Matt. --- .../blender/editors/animation/anim_channels.c | 72 +++++++++++++++++++ .../blender/editors/animation/anim_filter.c | 4 +- .../blender/editors/space_graph/graph_draw.c | 13 ++-- 3 files changed, 82 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/animation/anim_channels.c b/source/blender/editors/animation/anim_channels.c index a697580d674..c0025a1b0f5 100644 --- a/source/blender/editors/animation/anim_channels.c +++ b/source/blender/editors/animation/anim_channels.c @@ -608,12 +608,70 @@ void ANIM_OT_channels_move_bottom (wmOperatorType *ot) #endif // XXX old animation system - needs to be updated for new system... + +/* ******************** Toggle Channel Visibility Operator *********************** */ + +static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op) +{ + bAnimContext ac; + ListBase anim_data = {NULL, NULL}; + bAnimListElem *ale; + int filter; + short vis= ACHANNEL_SETFLAG_ADD; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* filter data */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); + + /* See if we should be making showing all selected or hiding */ + for (ale= anim_data.first; ale; ale= ale->next) { + if (vis == ACHANNEL_SETFLAG_CLEAR) + break; + + if (ale->flag & FCURVE_VISIBLE) + vis= ACHANNEL_SETFLAG_CLEAR; + } + + /* Now set the flags */ + for (ale= anim_data.first; ale; ale= ale->next) { + FCurve *fcu= (FCurve *)ale->data; + ACHANNEL_SET_FLAG(fcu, vis, FCURVE_VISIBLE); + } + + /* cleanup */ + BLI_freelistN(&anim_data); + + /* set notifier tha things have changed */ + ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS); + + return OPERATOR_FINISHED; +} + +void ANIM_OT_channels_visibility_toggle (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Toggle Visibility"; + ot->idname= "ANIM_OT_channels_visibility_toggle"; + + /* api callbacks */ + ot->exec= animchannels_visibility_toggle_exec; + ot->poll= ED_operator_ipo_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /* ********************** Set Flags Operator *********************** */ enum { // ACHANNEL_SETTING_SELECT = 0, ACHANNEL_SETTING_PROTECT = 1, ACHANNEL_SETTING_MUTE, + ACHANNEL_SETTING_VISIBLE, } eAnimChannel_Settings; /* defines for setting animation-channel flags */ @@ -672,6 +730,9 @@ static void setflag_anim_channels (bAnimContext *ac, short setting, short mode) else if (setting == ACHANNEL_SETTING_PROTECT) { ACHANNEL_SET_FLAG(fcu, mode, FCURVE_PROTECTED); } + else if (setting == ACHANNEL_SETTING_VISIBLE) { + ACHANNEL_SET_FLAG(fcu, mode, FCURVE_VISIBLE); + } } break; case ANIMTYPE_GPLAYER: @@ -1120,6 +1181,7 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s case ANIMTYPE_FCURVE: { FCurve *fcu= (FCurve *)ale->data; + short offset= (ac->datatype != ANIMCONT_ACTION)? 18 : 0; if (x >= (ACHANNEL_NAMEWIDTH-ACHANNEL_BUTTON_WIDTH)) { /* toggle protection */ @@ -1129,6 +1191,11 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s /* toggle mute */ fcu->flag ^= FCURVE_MUTED; } + else if ((x < (offset+17)) && (ac->spacetype==SPACE_IPO)) { + /* toggle visibility */ + // XXX this is supposed to be button before name, though this sometimes fails + fcu->flag ^= FCURVE_VISIBLE; + } else { /* select/deselect */ fcu->flag ^= FCURVE_SELECTED; @@ -1274,6 +1341,8 @@ void ED_operatortypes_animchannels(void) //WM_operatortype_append(ANIM_OT_channels_move_down); //WM_operatortype_append(ANIM_OT_channels_move_top); //WM_operatortype_append(ANIM_OT_channels_move_bottom); + + WM_operatortype_append(ANIM_OT_channels_visibility_toggle); } void ED_keymap_animchannels(wmWindowManager *wm) @@ -1304,6 +1373,9 @@ void ED_keymap_animchannels(wmWindowManager *wm) //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_down", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0); //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_to_top", PAGEUPKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0); //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_to_bottom", PAGEDOWNKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0); + + /* Graph Editor only */ + WM_keymap_add_item(keymap, "ANIM_OT_channels_visibility_toggle", VKEY, KM_PRESS, 0, 0); } /* ************************************************************************** */ diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index 8b14b9b2d5c..75bc145e267 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -484,7 +484,7 @@ static int animdata_filter_fcurves (ListBase *anim_data, FCurve *first, bActionG */ for (fcu= first; ((fcu) && (fcu->grp==grp)); fcu= fcu->next) { /* only include if visible (Graph Editor check, not channels check) */ - //if (!(filter_mode & ANIMFILTER_CURVEVISIBLE) || (fcu->flag & FCURVE_VISIBLE)) { // XXX don't do this till we have tools to set this + if (!(filter_mode & ANIMFILTER_CURVEVISIBLE) || (fcu->flag & FCURVE_VISIBLE)) { /* only work with this channel and its subchannels if it is editable */ if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_FCU(fcu)) { /* only include this curve if selected */ @@ -498,7 +498,7 @@ static int animdata_filter_fcurves (ListBase *anim_data, FCurve *first, bActionG } } } - //} + } } /* return the number of items added to the list */ diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 1924fc0b508..7adb90e7464 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -986,9 +986,7 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) group= (fcu->grp) ? 1 : 0; grp= fcu->grp; - - // XXX include some UI element to allow toggling of visibility - + switch (ale->ownertype) { case ANIMTYPE_NONE: /* no owner */ case ANIMTYPE_FCURVE: @@ -1005,6 +1003,13 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) break; } + /* for now, 'special' (i.e. in front of name) is used to show visibility status */ + // XXX these 'blank' icons are currently checkboxes + if (fcu->flag & FCURVE_VISIBLE) + special= ICON_BLANK012; + else + special= ICON_BLANK011; + if (fcu->flag & FCURVE_MUTED) mute = ICON_MUTE_IPO_ON; else @@ -1017,9 +1022,7 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) sel = SEL_FCU(fcu); - // for now, we just print the full path... this needs more work! getname_anim_fcurve(name, ale->id, fcu); - //sprintf(name, "%s[%d]", fcu->rna_path, fcu->array_index); } break; From 25440893dde5ac0f635649d2fbc99fa67f997b75 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 15:38:00 +0000 Subject: [PATCH 29/63] 2.5 *** Proof of concept! **** 3D window Panels back, in own designated region for now. Activate or hide it with Nkey. Note that Background Image doesn't work yet, Transform Orientations probably need tests by Martin, Sculpt options have to be recoded there by Nicholas. The UI design sessions will of course review all of this! We'll have to solve a lot of related topics; - navigation (where) and context (what) - non-overlapping layouts vs floating panels/bars - properties vs tools (toolbars) - drop panels and make nice (semi-automated) list views? I've also done experiments with making the main 3d view stay 'behind' the buttons region. That makes popping buttons in and out less distracting, but also makes it obscuring the view... it's not in this commit, it didn't work proper :) To get that work it has to be handled by the internal compositor, then it even can have fancy transparency in back. Anyhoo, time enough to play with this a while. Especially for Image window (paint) it can work well too. --- source/blender/blenlib/BLI_rect.h | 1 + source/blender/blenlib/intern/rct.c | 9 + .../editors/armature/armature_intern.h | 1 - source/blender/editors/include/ED_armature.h | 1 + source/blender/editors/include/UI_view2d.h | 2 + .../editors/interface/interface_panel.c | 65 +- source/blender/editors/interface/view2d.c | 23 +- source/blender/editors/interface/view2d_ops.c | 7 + source/blender/editors/screen/area.c | 10 +- source/blender/editors/space_node/drawnode.c | 2 +- .../editors/space_view3d/space_view3d.c | 116 +- .../editors/space_view3d/view3d_buttons.c | 1461 +++++++++++++++++ .../editors/space_view3d/view3d_edit.c | 2 +- .../editors/space_view3d/view3d_header.c | 10 +- .../editors/space_view3d/view3d_intern.h | 9 + .../blender/editors/space_view3d/view3d_ops.c | 14 +- .../editors/space_view3d/view3d_view.c | 2 - source/blender/editors/space_view3d/vpaint.c | 10 +- source/blender/makesdna/DNA_screen_types.h | 4 + 19 files changed, 1694 insertions(+), 55 deletions(-) create mode 100644 source/blender/editors/space_view3d/view3d_buttons.c diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h index ce8012963b0..45a96f6055d 100644 --- a/source/blender/blenlib/BLI_rect.h +++ b/source/blender/blenlib/BLI_rect.h @@ -57,6 +57,7 @@ int BLI_in_rctf(struct rctf *rect, float x, float y); int BLI_isect_rctf(struct rctf *src1, struct rctf *src2, struct rctf *dest); int BLI_isect_rcti(struct rcti *src1, struct rcti *src2, struct rcti *dest); void BLI_union_rctf(struct rctf *rcta, struct rctf *rctb); +void BLI_union_rcti(struct rcti *rct1, struct rcti *rct2); #ifdef __cplusplus } diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c index 0dc61db2342..48ba18515de 100644 --- a/source/blender/blenlib/intern/rct.c +++ b/source/blender/blenlib/intern/rct.c @@ -70,7 +70,16 @@ int BLI_in_rctf(rctf *rect, float x, float y) void BLI_union_rctf(rctf *rct1, rctf *rct2) { + + if(rct1->xmin>rct2->xmin) rct1->xmin= rct2->xmin; + if(rct1->xmaxxmax) rct1->xmax= rct2->xmax; + if(rct1->ymin>rct2->ymin) rct1->ymin= rct2->ymin; + if(rct1->ymaxymax) rct1->ymax= rct2->ymax; +} +void BLI_union_rcti(rcti *rct1, rcti *rct2) +{ + if(rct1->xmin>rct2->xmin) rct1->xmin= rct2->xmin; if(rct1->xmaxxmax) rct1->xmax= rct2->xmax; if(rct1->ymin>rct2->ymin) rct1->ymin= rct2->ymin; diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index 4fa11197cf1..0f416c240d2 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -32,7 +32,6 @@ struct wmOperatorType; /* editarmature.c */ -void armature_bone_rename(Object *ob, char *oldnamep, char *newnamep); void ARMATURE_OT_align_bones(struct wmOperatorType *ot); void ARMATURE_OT_calculate_roll(struct wmOperatorType *ot); diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index 9c17e002cb0..2aeec16f852 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -109,6 +109,7 @@ void docenter_armature (struct Scene *scene, struct View3D *v3d, struct Object * void auto_align_armature(struct Scene *scene, struct View3D *v3d, short mode); void unique_editbone_name (ListBase *edbo, char *name); +void armature_bone_rename(Object *ob, char *oldnamep, char *newnamep); void undo_push_armature(struct bContext *C, char *name); diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h index 3b2331157ce..cdb69477f12 100644 --- a/source/blender/editors/include/UI_view2d.h +++ b/source/blender/editors/include/UI_view2d.h @@ -54,6 +54,8 @@ enum { V2D_COMMONVIEW_LIST, /* headers (this is basically the same as listview, but no y-panning) */ V2D_COMMONVIEW_HEADER, + /* ui listviews, tries to wrap tot inside region width */ + V2D_COMMONVIEW_LIST_UI, } eView2D_CommonViewTypes; /* ---- Defines for Scroller/Grid Arguments ----- */ diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index fb12ebcde7d..4ee5de85675 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -94,6 +94,22 @@ typedef struct uiHandlePanelData { static void panel_activate_state(bContext *C, Panel *pa, uiHandlePanelState state); +/* ******************************** */ + +/* temporary code to remove all sbuts stuff from panel code */ + +static int panel_aligned(ScrArea *sa, ARegion *ar) +{ + if(sa->spacetype==SPACE_BUTS) { + SpaceButs *sbuts= sa->spacedata.first; + return sbuts->align; + } + else if(ar->regiontype==RGN_TYPE_UI) + return BUT_VERTICAL; + + return 0; +} + /* ************** panels ************* */ static void copy_panel_offset(Panel *pa, Panel *papar) @@ -868,14 +884,11 @@ static int find_highest_panel(const void *a1, const void *a2) /* returns 1 when it did something */ int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac) { - SpaceButs *sbuts= sa->spacedata.first; Panel *pa; PanelSort *ps, *panelsort, *psnext; static int sortcounter= 0; int a, tot=0, done; - - if(sa->spacetype!=SPACE_BUTS) - return 0; + int align= panel_aligned(sa, ar); /* count active, not tabbed Panels */ for(pa= ar->panels.first; pa; pa= pa->next) { @@ -887,10 +900,10 @@ int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac) /* extra; change close direction? */ for(pa= ar->panels.first; pa; pa= pa->next) { if(pa->active && pa->paneltab==NULL) { - if( (pa->flag & PNL_CLOSEDX) && (sbuts->align==BUT_VERTICAL) ) + if( (pa->flag & PNL_CLOSEDX) && (align==BUT_VERTICAL) ) pa->flag ^= PNL_CLOSED; - else if( (pa->flag & PNL_CLOSEDY) && (sbuts->align==BUT_HORIZONTAL) ) + else if( (pa->flag & PNL_CLOSEDY) && (align==BUT_HORIZONTAL) ) pa->flag ^= PNL_CLOSED; } @@ -908,20 +921,24 @@ int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac) } } - if(sbuts->align==BUT_VERTICAL) + if(align==BUT_VERTICAL) qsort(panelsort, tot, sizeof(PanelSort), find_highest_panel); else qsort(panelsort, tot, sizeof(PanelSort), find_leftmost_panel); /* no smart other default start loc! this keeps switching f5/f6/etc compatible */ ps= panelsort; - ps->pa->ofsx= 0; - ps->pa->ofsy= 0; + ps->pa->ofsx= PNL_DIST; + if(align==BUT_VERTICAL) + ps->pa->ofsy= -ps->pa->sizey-PNL_HEADER-PNL_DIST; + else + ps->pa->ofsy= 0; + for(a=0 ; aalign==BUT_VERTICAL) { + if(align==BUT_VERTICAL) { psnext->pa->ofsx = ps->pa->ofsx; psnext->pa->ofsy = get_panel_real_ofsy(ps->pa) - psnext->pa->sizey-PNL_HEADER-PNL_DIST; } @@ -1031,6 +1048,7 @@ void uiDrawPanels(const bContext *C, int re_align) if(re_align) uiAlignPanelStep(sa, ar, 1.0); if(sa->spacetype!=SPACE_BUTS) { +#if 0 // XXX make float panel exception SpaceLink *sl= sa->spacedata.first; for(block= ar->uiblocks.first; block; block= block->next) { if(block->active && block->panel && block->panel->active && block->panel->paneltab == NULL) { @@ -1108,6 +1126,7 @@ void uiDrawPanels(const bContext *C, int re_align) } } +#endif } /* draw panels, selected on top */ @@ -1217,17 +1236,12 @@ static void ui_do_drag(bContext *C, wmEvent *event, Panel *panel) uiHandlePanelData *data= panel->activedata; ScrArea *sa= CTX_wm_area(C); ARegion *ar= CTX_wm_region(C); - short align=0, dx=0, dy=0; + short align= panel_aligned(sa, ar), dx=0, dy=0; /* first clip for window, no dragging outside */ if(!BLI_in_rcti(&ar->winrct, event->x, event->y)) return; - if(sa->spacetype==SPACE_BUTS) { - SpaceButs *sbuts= sa->spacedata.first; - align= sbuts->align; - } - dx= (event->x-data->startx) & ~(PNL_GRID-1); dy= (event->y-data->starty) & ~(PNL_GRID-1); @@ -1334,11 +1348,8 @@ static void panel_clicked_tabs(bContext *C, ScrArea *sa, ARegion *ar, uiBlock *b } /* panels now differ size.. */ - if(sa->spacetype==SPACE_BUTS) { - SpaceButs *sbuts= sa->spacedata.first; - if(sbuts->align) - uiAlignPanelStep(sa, ar, 1.0); - } + if(panel_aligned(sa, ar)) + uiAlignPanelStep(sa, ar, 1.0); ED_region_tag_redraw(ar); } @@ -1353,12 +1364,7 @@ static void ui_handle_panel_header(bContext *C, uiBlock *block, int mx, int my) ScrArea *sa= CTX_wm_area(C); ARegion *ar= CTX_wm_region(C); Panel *pa; - int align= 0, button= 0; - - if(sa->spacetype==SPACE_BUTS) { - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); - align= sbuts->align; - } + int align= panel_aligned(sa, ar), button= 0; /* mouse coordinates in panel space! */ @@ -1423,7 +1429,6 @@ static void ui_handle_panel_header(bContext *C, uiBlock *block, int mx, int my) int ui_handler_panel_region(bContext *C, wmEvent *event) { - ScrArea *sa= CTX_wm_area(C); ARegion *ar= CTX_wm_region(C); uiBlock *block; int retval, mx, my, inside_header= 0, inside_scale= 0; @@ -1485,8 +1490,9 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) } else zoom=1; - +#if 0 // XXX make float panel exception? if(zoom) { + ScrArea *sa= CTX_wm_area(C); SpaceLink *sl= sa->spacedata.first; if(sa->spacetype!=SPACE_BUTS) { @@ -1500,6 +1506,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) } } } +#endif } return retval; diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 9e91abf14c5..85766adeef4 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -231,7 +231,28 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) } break; - /* other view types are completely defined using their own settings already */ + /* ui listviews, tries to wrap 'tot' inside region width */ + case V2D_COMMONVIEW_LIST_UI: + { + /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */ + v2d->keepzoom= (V2D_KEEPASPECT|V2D_KEEPZOOM); + v2d->minzoom= 0.5f; + v2d->maxzoom= 2.0f; + + v2d->align= (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y); + v2d->keeptot= V2D_KEEPTOT_BOUNDS; + + v2d->tot.xmin= 0.0f; + v2d->tot.xmax= 336.f; // XXX 320 width + 2 x PNL_DIST + + v2d->tot.ymax= 0.0f; + v2d->tot.ymin= -336.0f*((float)winy)/(float)winx; + + v2d->cur= v2d->tot; + + } + break; + /* other view types are completely defined using their own settings already */ default: /* we don't do anything here, as settings should be fine, but just make sure that rect */ break; diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index a83592df886..2fe33c0065d 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1299,5 +1299,12 @@ void UI_view2d_keymap(wmWindowManager *wm) /* scrollers */ WM_keymap_add_item(keymap, "View2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0); + + /* Alternative keymap for buttons listview */ + keymap= WM_keymap_listbase(wm, "View2D Buttons List", 0, 0); + WM_keymap_add_item(keymap, "View2D_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "View2D_OT_view_downscroll", WHEELDOWNMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "View2D_OT_view_upscroll", WHEELUPMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "View2D_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0); } diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index c22be24fd0b..c738aa78d51 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -375,7 +375,7 @@ static void region_rect_recursive(ARegion *ar, rcti *remainder, int quad) } } } - else if(ar->alignment==RGN_ALIGN_LEFT || ar->alignment==RGN_ALIGN_RIGHT) { + else if( ELEM4(ar->alignment, RGN_ALIGN_LEFT, RGN_ALIGN_RIGHT, RGN_OVERLAP_LEFT, RGN_OVERLAP_RIGHT)) { if( rct_fits(remainder, 'h', prefsizex) < 0 ) { ar->flag |= RGN_FLAG_TOO_SMALL; @@ -388,13 +388,15 @@ static void region_rect_recursive(ARegion *ar, rcti *remainder, int quad) ar->winrct= *remainder; - if(ar->alignment==RGN_ALIGN_RIGHT) { + if(ELEM(ar->alignment, RGN_ALIGN_RIGHT, RGN_OVERLAP_RIGHT)) { ar->winrct.xmin= ar->winrct.xmax - prefsizex + 1; - remainder->xmax= ar->winrct.xmin - 1; + if(ar->alignment==RGN_ALIGN_RIGHT) + remainder->xmax= ar->winrct.xmin - 1; } else { ar->winrct.xmax= ar->winrct.xmin + prefsizex - 1; - remainder->xmin= ar->winrct.xmax + 1; + if(ar->alignment==RGN_ALIGN_LEFT) + remainder->xmin= ar->winrct.xmax + 1; } } } diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 0770bc54ca6..f748df2db97 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2583,7 +2583,7 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t dist = 1.0f/(float)LINK_RESOL; glBegin(GL_LINE_STRIP); - for(i=0; iregionbase.first; ar; ar= ar->next) + if(ar->regiontype==RGN_TYPE_UI) + return ar; + + /* add subdiv level; after header */ + for(ar= sa->regionbase.first; ar; ar= ar->next) + if(ar->regiontype==RGN_TYPE_HEADER) + break; + + /* is error! */ + if(ar==NULL) return NULL; + + arnew= MEM_callocN(sizeof(ARegion), "buttons for view3d"); + + BLI_insertlinkafter(&sa->regionbase, ar, arnew); + arnew->regiontype= RGN_TYPE_UI; + arnew->alignment= RGN_ALIGN_LEFT; + + arnew->flag = RGN_FLAG_HIDDEN; + + return arnew; +} + + /* ******************** default callbacks for view3d space ***************** */ static SpaceLink *view3d_new(const bContext *C) @@ -103,6 +133,13 @@ static SpaceLink *view3d_new(const bContext *C) ar->regiontype= RGN_TYPE_HEADER; ar->alignment= RGN_ALIGN_BOTTOM; + /* buttons/list view */ + ar= MEM_callocN(sizeof(ARegion), "buttons for view3d"); + + BLI_addtail(&v3d->regionbase, ar); + ar->regiontype= RGN_TYPE_UI; + ar->alignment= RGN_OVERLAP_LEFT; + /* main area */ ar= MEM_callocN(sizeof(ARegion), "main area for view3d"); @@ -177,6 +214,8 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar) ListBase *keymap; /* own keymap */ + keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0); + WM_event_add_keymap_handler(&ar->handlers, keymap); keymap= WM_keymap_listbase(wm, "View3D", SPACE_VIEW3D, 0); WM_event_add_keymap_handler(&ar->handlers, keymap); @@ -344,6 +383,10 @@ static void view3d_main_area_cursor(wmWindow *win, ScrArea *sa, ARegion *ar) /* add handlers, stuff you only do once or on area/region changes */ static void view3d_header_area_init(wmWindowManager *wm, ARegion *ar) { + ListBase *keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0); + + WM_event_add_keymap_handler(&ar->handlers, keymap); + UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy); } @@ -386,6 +429,67 @@ static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn) } } +/* add handlers, stuff you only do once or on area/region changes */ +static void view3d_buttons_area_init(wmWindowManager *wm, ARegion *ar) +{ + ListBase *keymap; + + keymap= WM_keymap_listbase(wm, "View2D Buttons List", 0, 0); + WM_event_add_keymap_handler(&ar->handlers, keymap); + keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0); + WM_event_add_keymap_handler(&ar->handlers, keymap); + + UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST_UI, ar->winx, ar->winy); +} + +static void view3d_buttons_area_draw(const bContext *C, ARegion *ar) +{ + float col[3]; + + /* clear */ + UI_GetThemeColor3fv(TH_HEADER, col); + + glClearColor(col[0], col[1], col[2], 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + /* set view2d view matrix for scrolling (without scrollers) */ + UI_view2d_view_ortho(C, &ar->v2d); + + view3d_buttons_area_defbuts(C, ar); + + /* restore view matrix? */ + UI_view2d_view_restore(C); +} + +static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn) +{ + /* context changes */ + switch(wmn->category) { + case NC_SCENE: + switch(wmn->data) { + case ND_FRAME: + case ND_OB_ACTIVE: + case ND_OB_SELECT: + case ND_MODE: + ED_region_tag_redraw(ar); + break; + } + break; + case NC_OBJECT: + switch(wmn->data) { + case ND_BONE_ACTIVE: + case ND_BONE_SELECT: + case ND_TRANSFORM: + case ND_GEOM_SELECT: + case ND_GEOM_DATA: + case ND_DRAW: + case ND_KEYS: + ED_region_tag_redraw(ar); + break; + } + } +} + /* * Returns true if the Object is a from an external blend file (libdata) */ @@ -582,16 +686,24 @@ void ED_spacetype_view3d(void) art->cursor= view3d_main_area_cursor; BLI_addhead(&st->regiontypes, art); + /* regions: listview/buttons */ + art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region"); + art->regionid = RGN_TYPE_UI; + art->minsizex= 220; // XXX + art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES; + art->listener= view3d_buttons_area_listener; + art->init= view3d_buttons_area_init; + art->draw= view3d_buttons_area_draw; + BLI_addhead(&st->regiontypes, art); + /* regions: header */ art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region"); art->regionid = RGN_TYPE_HEADER; art->minsizey= HEADERY; art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES; art->listener= view3d_header_area_listener; - art->init= view3d_header_area_init; art->draw= view3d_header_area_draw; - BLI_addhead(&st->regiontypes, art); BKE_spacetype_register(st); diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c new file mode 100644 index 00000000000..e9c22ffee78 --- /dev/null +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -0,0 +1,1461 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include +#include +#include + +#include "DNA_action_types.h" +#include "DNA_armature_types.h" +#include "DNA_curve_types.h" +#include "DNA_camera_types.h" +#include "DNA_lamp_types.h" +#include "DNA_lattice_types.h" +#include "DNA_meta_types.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_space_types.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "DNA_userdef_types.h" +#include "DNA_view3d_types.h" +#include "DNA_world_types.h" + +#include "MEM_guardedalloc.h" + +#include "BLI_arithb.h" +#include "BLI_blenlib.h" +#include "BLI_editVert.h" +#include "BLI_rand.h" + +#include "BKE_action.h" +#include "BKE_context.h" +#include "BKE_curve.h" +#include "BKE_customdata.h" +#include "BKE_depsgraph.h" +#include "BKE_object.h" +#include "BKE_global.h" +#include "BKE_scene.h" +#include "BKE_screen.h" +#include "BKE_utildefines.h" + +#include "BIF_gl.h" +#include "BIF_transform.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "RNA_access.h" +#include "RNA_define.h" + +#include "ED_armature.h" +#include "ED_curve.h" +#include "ED_editparticle.h" +#include "ED_mesh.h" +#include "ED_object.h" +#include "ED_screen.h" +#include "ED_types.h" +#include "ED_util.h" + +#include "UI_interface.h" +#include "UI_resources.h" +#include "UI_view2d.h" + +#include "view3d_intern.h" // own include + + +/* ******************* view3d space & buttons ************** */ +#define B_NOP 1 +#define B_REDR 2 +#define B_OBJECTPANELROT 1007 +#define B_OBJECTPANELMEDIAN 1008 +#define B_ARMATUREPANEL1 1009 +#define B_ARMATUREPANEL2 1010 +#define B_OBJECTPANELPARENT 1011 +#define B_OBJECTPANEL 1012 +#define B_ARMATUREPANEL3 1013 +#define B_OBJECTPANELSCALE 1014 +#define B_OBJECTPANELDIMS 1015 +#define B_TRANSFORMSPACEADD 1016 +#define B_TRANSFORMSPACECLEAR 1017 +#define B_SETPT_AUTO 2125 +#define B_SETPT_VECTOR 2126 +#define B_SETPT_ALIGN 2127 +#define B_SETPT_FREE 2128 +#define B_RECALCMBALL 2501 + +#define B_WEIGHT0_0 2840 +#define B_WEIGHT1_4 2841 +#define B_WEIGHT1_2 2842 +#define B_WEIGHT3_4 2843 +#define B_WEIGHT1_0 2844 + +#define B_OPA1_8 2845 +#define B_OPA1_4 2846 +#define B_OPA1_2 2847 +#define B_OPA3_4 2848 +#define B_OPA1_0 2849 + +#define B_CLR_WPAINT 2850 + +#define B_IDNAME 3000 + +/* temporary struct for storing transform properties */ +typedef struct { + float ob_eul[4]; // used for quat too.... + float ob_scale[3]; // need temp space due to linked values + float ob_dims[3]; + short link_scale; + float ve_median[5]; + int curdef; + float *defweightp; +} TransformProperties; + + +/* is used for both read and write... */ +static void v3d_editvertex_buts(const bContext *C, uiBlock *block, View3D *v3d, Object *ob, float lim) +{ + MDeformVert *dvert=NULL; + TransformProperties *tfp= v3d->properties_storage; + float median[5], ve_median[5]; + int tot, totw, totweight, totedge; + char defstr[320]; + + median[0]= median[1]= median[2]= median[3]= median[4]= 0.0; + tot= totw= totweight= totedge= 0; + defstr[0]= 0; + + if(ob->type==OB_MESH) { + Mesh *me= ob->data; + EditMesh *em = me->edit_mesh; + EditVert *eve, *evedef=NULL; + EditEdge *eed; + + eve= em->verts.first; + while(eve) { + if(eve->f & SELECT) { + evedef= eve; + tot++; + VecAddf(median, median, eve->co); + } + eve= eve->next; + } + eed= em->edges.first; + while(eed) { + if((eed->f & SELECT)) { + totedge++; + median[3]+= eed->crease; + } + eed= eed->next; + } + + /* check for defgroups */ + if(evedef) + dvert= CustomData_em_get(&em->vdata, evedef->data, CD_MDEFORMVERT); + if(tot==1 && dvert && dvert->totweight) { + bDeformGroup *dg; + int i, max=1, init=1; + char str[320]; + + for (i=0; itotweight; i++){ + dg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr); + if(dg) { + max+= snprintf(str, sizeof(str), "%s %%x%d|", dg->name, dvert->dw[i].def_nr); + if(max<320) strcat(defstr, str); + } + else printf("oh no!\n"); + if(tfp->curdef==dvert->dw[i].def_nr) { + init= 0; + tfp->defweightp= &dvert->dw[i].weight; + } + } + + if(init) { // needs new initialized + tfp->curdef= dvert->dw[0].def_nr; + tfp->defweightp= &dvert->dw[0].weight; + } + } + } + else if(ob->type==OB_CURVE || ob->type==OB_SURF) { + Curve *cu= ob->data; + Nurb *nu; + BPoint *bp; + BezTriple *bezt; + int a; + + nu= cu->editnurb->first; + while(nu) { + if((nu->type & 7)==CU_BEZIER) { + bezt= nu->bezt; + a= nu->pntsu; + while(a--) { + if(bezt->f2 & SELECT) { + VecAddf(median, median, bezt->vec[1]); + tot++; + median[4]+= bezt->weight; + totweight++; + } + else { + if(bezt->f1 & SELECT) { + VecAddf(median, median, bezt->vec[0]); + tot++; + } + if(bezt->f3 & SELECT) { + VecAddf(median, median, bezt->vec[2]); + tot++; + } + } + bezt++; + } + } + else { + bp= nu->bp; + a= nu->pntsu*nu->pntsv; + while(a--) { + if(bp->f1 & SELECT) { + VecAddf(median, median, bp->vec); + median[3]+= bp->vec[3]; + totw++; + tot++; + median[4]+= bp->weight; + totweight++; + } + bp++; + } + } + nu= nu->next; + } + } + else if(ob->type==OB_LATTICE) { + Lattice *lt= ob->data; + BPoint *bp; + int a; + + a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw; + bp= lt->editlatt->def; + while(a--) { + if(bp->f1 & SELECT) { + VecAddf(median, median, bp->vec); + tot++; + median[4]+= bp->weight; + totweight++; + } + bp++; + } + } + + if(tot==0) return; + + median[0] /= (float)tot; + median[1] /= (float)tot; + median[2] /= (float)tot; + if(totedge) median[3] /= (float)totedge; + else if(totw) median[3] /= (float)totw; + if(totweight) median[4] /= (float)totweight; + + if(v3d->flag & V3D_GLOBAL_STATS) + Mat4MulVecfl(ob->obmat, median); + + if(block) { // buttons + int but_y; + if((ob->parent) && (ob->partype == PARBONE)) but_y = 135; + else but_y = 150; + + uiBlockBeginAlign(block); + uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 160, but_y, 70, 19, &v3d->flag, 0, 0, 0, 0, "Displays global values"); + uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local", 230, but_y, 70, 19, &v3d->flag, 0, 0, 0, 0, "Displays local values"); + uiBlockEndAlign(block); + + memcpy(tfp->ve_median, median, sizeof(tfp->ve_median)); + + uiBlockBeginAlign(block); + if(tot==1) { + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex X:", 10, 110, 290, 19, &(tfp->ve_median[0]), -lim, lim, 10, 3, ""); + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex Y:", 10, 90, 290, 19, &(tfp->ve_median[1]), -lim, lim, 10, 3, ""); + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex Z:", 10, 70, 290, 19, &(tfp->ve_median[2]), -lim, lim, 10, 3, ""); + if(totw==1) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex W:", 10, 50, 290, 19, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, ""); + uiBlockEndAlign(block); + + if(defstr[0]) { + uiDefBut(block, LABEL, 1, "Vertex Deform Groups", 10, 40, 290, 20, NULL, 0.0, 0.0, 0, 0, ""); + + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_NOP, "Weight:", 10, 20, 150, 19, tfp->defweightp, 0.0f, 1.0f, 10, 3, "Weight value"); + uiDefButI(block, MENU, B_REDR, defstr, 160, 20, 140, 19, &tfp->curdef, 0.0, 0.0, 0, 0, "Current Vertex Group"); + uiBlockEndAlign(block); + } + else if(totweight) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 10, 20, 290, 19, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, ""); + + } + else { + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median X:", 10, 110, 290, 19, &(tfp->ve_median[0]), -lim, lim, 10, 3, ""); + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Y:", 10, 90, 290, 19, &(tfp->ve_median[1]), -lim, lim, 10, 3, ""); + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Z:", 10, 70, 290, 19, &(tfp->ve_median[2]), -lim, lim, 10, 3, ""); + if(totw==tot) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median W:", 10, 50, 290, 19, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, ""); + uiBlockEndAlign(block); + if(totweight) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 10, 20, 290, 19, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal"); + } + + if(ob->type==OB_CURVE && (totw==0)) { /* bez curves have no w */ + uiBlockBeginAlign(block); + uiDefBut(block, BUT,B_SETPT_AUTO,"Auto", 10, 44, 72, 19, 0, 0, 0, 0, 0, "Auto handles (Shift H)"); + uiDefBut(block, BUT,B_SETPT_VECTOR,"Vector",82, 44, 73, 19, 0, 0, 0, 0, 0, "Vector handles (V)"); + uiDefBut(block, BUT,B_SETPT_ALIGN,"Align",155, 44, 73, 19, 0, 0, 0, 0, 0, "Align handles (H Toggles)"); + uiDefBut(block, BUT,B_SETPT_FREE,"Free", 227, 44, 72, 19, 0, 0, 0, 0, 0, "Align handles (H Toggles)"); + uiBlockEndAlign(block); + } + + if(totedge==1) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease W:", 10, 30, 290, 19, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, ""); + else if(totedge>1) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Crease W:", 10, 30, 290, 19, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, ""); + + } + else { // apply + memcpy(ve_median, tfp->ve_median, sizeof(tfp->ve_median)); + + if(v3d->flag & V3D_GLOBAL_STATS) { + Mat4Invert(ob->imat, ob->obmat); + Mat4MulVecfl(ob->imat, median); + Mat4MulVecfl(ob->imat, ve_median); + } + VecSubf(median, ve_median, median); + median[3]= ve_median[3]-median[3]; + median[4]= ve_median[4]-median[4]; + + if(ob->type==OB_MESH) { + Mesh *me= ob->data; + EditMesh *em = me->edit_mesh; + EditVert *eve; + EditEdge *eed; + + eve= em->verts.first; + while(eve) { + if(eve->f & SELECT) { + VecAddf(eve->co, eve->co, median); + } + eve= eve->next; + } + + for(eed= em->edges.first; eed; eed= eed->next) { + if(eed->f & SELECT) { + /* ensure the median can be set to zero or one */ + if(ve_median[3]==0.0f) eed->crease= 0.0f; + else if(ve_median[3]==1.0f) eed->crease= 1.0f; + else { + eed->crease+= median[3]; + CLAMP(eed->crease, 0.0, 1.0); + } + } + } + + recalc_editnormals(em); + } + else if(ob->type==OB_CURVE || ob->type==OB_SURF) { + Curve *cu= ob->data; + Nurb *nu; + BPoint *bp; + BezTriple *bezt; + int a; + + nu= cu->editnurb->first; + while(nu) { + if((nu->type & 7)==1) { + bezt= nu->bezt; + a= nu->pntsu; + while(a--) { + if(bezt->f2 & SELECT) { + VecAddf(bezt->vec[0], bezt->vec[0], median); + VecAddf(bezt->vec[1], bezt->vec[1], median); + VecAddf(bezt->vec[2], bezt->vec[2], median); + bezt->weight+= median[4]; + } + else { + if(bezt->f1 & SELECT) { + VecAddf(bezt->vec[0], bezt->vec[0], median); + } + if(bezt->f3 & SELECT) { + VecAddf(bezt->vec[2], bezt->vec[2], median); + } + } + bezt++; + } + } + else { + bp= nu->bp; + a= nu->pntsu*nu->pntsv; + while(a--) { + if(bp->f1 & SELECT) { + VecAddf(bp->vec, bp->vec, median); + bp->vec[3]+= median[3]; + bp->weight+= median[4]; + } + bp++; + } + } + test2DNurb(nu); + testhandlesNurb(nu); /* test for bezier too */ + + nu= nu->next; + } + } + else if(ob->type==OB_LATTICE) { + Lattice *lt= ob->data; + BPoint *bp; + int a; + + a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw; + bp= lt->editlatt->def; + while(a--) { + if(bp->f1 & SELECT) { + VecAddf(bp->vec, bp->vec, median); + bp->weight+= median[4]; + } + bp++; + } + } + +// ED_undo_push(C, "Transform properties"); + } +} + +/* assumes armature active */ +static void validate_bonebutton_cb(bContext *C, void *bonev, void *namev) +{ + Object *ob= CTX_data_active_object(C); + + if(ob && ob->type==OB_ARMATURE) { + Bone *bone= bonev; + char oldname[32], newname[32]; + + /* need to be on the stack */ + BLI_strncpy(newname, bone->name, 32); + BLI_strncpy(oldname, (char *)namev, 32); + /* restore */ + BLI_strncpy(bone->name, oldname, 32); + + armature_bone_rename(ob->data, oldname, newname); // editarmature.c + } +} + +static void v3d_posearmature_buts(uiBlock *block, View3D *v3d, Object *ob, float lim) +{ + uiBut *but; + bArmature *arm; + bPoseChannel *pchan; + Bone *bone= NULL; + TransformProperties *tfp= v3d->properties_storage; + + arm = ob->data; + if (!arm || !ob->pose) return; + + for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + bone = pchan->bone; + if(bone && (bone->flag & BONE_ACTIVE) && (bone->layer & arm->layer)) + break; + } + if (!pchan || !bone) return; + + if((ob->parent) && (ob->partype == PARBONE)) + but= uiDefBut (block, TEX, B_NOP, "Bone:", 160, 130, 140, 19, bone->name, 1, 31, 0, 0, ""); + else + but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 140, 140, 19, bone->name, 1, 31, 0, 0, ""); + uiButSetFunc(but, validate_bonebutton_cb, bone, NULL); + + QuatToEul(pchan->quat, tfp->ob_eul); + tfp->ob_eul[0]*= 180.0/M_PI; + tfp->ob_eul[1]*= 180.0/M_PI; + tfp->ob_eul[2]*= 180.0/M_PI; + + uiBlockBeginAlign(block); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCX, B_REDR, ICON_UNLOCKED, 10,140,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL2, "LocX:", 30, 140, 120, 19, pchan->loc, -lim, lim, 100, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCY, B_REDR, ICON_UNLOCKED, 10,120,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL2, "LocY:", 30, 120, 120, 19, pchan->loc+1, -lim, lim, 100, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCZ, B_REDR, ICON_UNLOCKED, 10,100,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL2, "LocZ:", 30, 100, 120, 19, pchan->loc+2, -lim, lim, 100, 3, ""); + + uiBlockBeginAlign(block); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 10,70,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotX:", 30, 70, 120, 19, tfp->ob_eul, -1000.0, 1000.0, 100, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 10,50,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotY:", 30, 50, 120, 19, tfp->ob_eul+1, -1000.0, 1000.0, 100, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 10,30,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotZ:", 30, 30, 120, 19, tfp->ob_eul+2, -1000.0, 1000.0, 100, 3, ""); + + uiBlockBeginAlign(block); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEX, B_REDR, ICON_UNLOCKED, 160,70,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL2, "ScaleX:", 180, 70, 120, 19, pchan->size, -lim, lim, 10, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEY, B_REDR, ICON_UNLOCKED, 160,50,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL2, "ScaleY:", 180, 50, 120, 19, pchan->size+1, -lim, lim, 10, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEZ, B_REDR, ICON_UNLOCKED, 160,30,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_ARMATUREPANEL2, "ScaleZ:", 180, 30, 120, 19, pchan->size+2, -lim, lim, 10, 3, ""); + uiBlockEndAlign(block); +} + +static void v3d_editarmature_buts(uiBlock *block, View3D *v3d, Object *ob, float lim) +{ + bArmature *arm= ob->data; + EditBone *ebone; + uiBut *but; + TransformProperties *tfp= v3d->properties_storage; + + ebone= arm->edbo->first; + + for (ebone = arm->edbo->first; ebone; ebone=ebone->next){ + if ((ebone->flag & BONE_ACTIVE) && (ebone->layer & arm->layer)) + break; + } + + if (!ebone) + return; + + if((ob->parent) && (ob->partype == PARBONE)) + but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 130, 140, 19, ebone->name, 1, 31, 0, 0, ""); + else + but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 150, 140, 19, ebone->name, 1, 31, 0, 0, ""); +// XXX uiButSetFunc(but, validate_editbonebutton_cb, ebone, NULL); + + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadX:", 10, 70, 140, 19, ebone->head, -lim, lim, 10, 3, ""); + uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadY:", 10, 50, 140, 19, ebone->head+1, -lim, lim, 10, 3, ""); + uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadZ:", 10, 30, 140, 19, ebone->head+2, -lim, lim, 10, 3, ""); + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailX:", 160, 70, 140, 19, ebone->tail, -lim, lim, 10, 3, ""); + uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailY:", 160, 50, 140, 19, ebone->tail+1, -lim, lim, 10, 3, ""); + uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailZ:", 160, 30, 140, 19, ebone->tail+2, -lim, lim, 10, 3, ""); + uiBlockEndAlign(block); + + tfp->ob_eul[0]= 180.0*ebone->roll/M_PI; + uiDefButF(block, NUM, B_ARMATUREPANEL1, "Roll:", 10, 100, 140, 19, tfp->ob_eul, -lim, lim, 1000, 3, ""); + + uiDefButBitI(block, TOG, BONE_EDITMODE_LOCKED, B_REDR, "Lock", 160, 100, 140, 19, &(ebone->flag), 0, 0, 0, 0, "Prevents bone from being transformed in edit mode"); + + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailRadius:", 10, 150, 140, 19, &ebone->rad_tail, 0, lim, 10, 3, ""); + if (ebone->parent && ebone->flag & BONE_CONNECTED ) + uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadRadius:", 10, 130, 140, 19, &ebone->parent->rad_tail, 0, lim, 10, 3, ""); + else + uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadRadius:", 10, 130, 140, 19, &ebone->rad_head, 0, lim, 10, 3, ""); + uiBlockEndAlign(block); +} + +static void v3d_editmetaball_buts(uiBlock *block, Object *ob, float lim) +{ + MetaElem *lastelem= NULL; // XXX + + if(lastelem) { + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_RECALCMBALL, "LocX:", 10, 70, 140, 19, &lastelem->x, -lim, lim, 100, 3, ""); + uiDefButF(block, NUM, B_RECALCMBALL, "LocY:", 10, 50, 140, 19, &lastelem->y, -lim, lim, 100, 3, ""); + uiDefButF(block, NUM, B_RECALCMBALL, "LocZ:", 10, 30, 140, 19, &lastelem->z, -lim, lim, 100, 3, ""); + + uiBlockBeginAlign(block); + if(lastelem->type!=MB_BALL) + uiDefButF(block, NUM, B_RECALCMBALL, "dx:", 160, 70, 140, 19, &lastelem->expx, 0, lim, 100, 3, ""); + if((lastelem->type!=MB_BALL) && (lastelem->type!=MB_TUBE)) + uiDefButF(block, NUM, B_RECALCMBALL, "dy:", 160, 50, 140, 19, &lastelem->expy, 0, lim, 100, 3, ""); + if((lastelem->type==MB_ELIPSOID) || (lastelem->type==MB_CUBE)) + uiDefButF(block, NUM, B_RECALCMBALL, "dz:", 160, 30, 140, 19, &lastelem->expz, 0, lim, 100, 3, ""); + + uiBlockEndAlign(block); + + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_RECALCMBALL, "Radius:", 10, 120, 140, 19, &lastelem->rad, 0, lim, 100, 3, "Size of the active metaball"); + uiDefButF(block, NUM, B_RECALCMBALL, "Stiffness:", 10, 100, 140, 19, &lastelem->s, 0, 10, 100, 3, "Stiffness of the active metaball"); + uiBlockEndAlign(block); + + uiDefButS(block, MENU, B_RECALCMBALL, "Type%t|Ball%x0|Tube%x4|Plane%x5|Elipsoid%x6|Cube%x7", 160, 120, 140, 19, &lastelem->type, 0.0, 0.0, 0, 0, "Set active element type"); + + } +} + +/* test if 'ob' is a parent somewhere in par's parents */ +static int test_parent_loop(Object *par, Object *ob) +{ + if(par == NULL) return 0; + if(ob == par) return 1; + return test_parent_loop(par->parent, ob); +} + +static void do_view3d_region_buttons(bContext *C, void *arg, int event) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + View3D *v3d= CTX_wm_view3d(C); + BoundBox *bb; + Object *ob= OBACT; + TransformProperties *tfp= v3d->properties_storage; + VPaint *wpaint= scene->toolsettings->wpaint; + + switch(event) { + + case B_REDR: + ED_area_tag_redraw(CTX_wm_area(C)); + return; /* no notifier! */ + + case B_OBJECTPANEL: + DAG_object_flush_update(scene, ob, OB_RECALC_OB); + break; + + case B_OBJECTPANELROT: + if(ob) { + ob->rot[0]= M_PI*tfp->ob_eul[0]/180.0; + ob->rot[1]= M_PI*tfp->ob_eul[1]/180.0; + ob->rot[2]= M_PI*tfp->ob_eul[2]/180.0; + DAG_object_flush_update(scene, ob, OB_RECALC_OB); + } + break; + + case B_OBJECTPANELSCALE: + if(ob) { + + /* link scale; figure out which axis changed */ + if (tfp->link_scale) { + float ratio, tmp, max = 0.0; + int axis; + + axis = 0; + max = fabs(tfp->ob_scale[0] - ob->size[0]); + tmp = fabs(tfp->ob_scale[1] - ob->size[1]); + if (tmp > max) { + axis = 1; + max = tmp; + } + tmp = fabs(tfp->ob_scale[2] - ob->size[2]); + if (tmp > max) { + axis = 2; + max = tmp; + } + + if (ob->size[axis] != tfp->ob_scale[axis]) { + if (fabs(ob->size[axis]) > FLT_EPSILON) { + ratio = tfp->ob_scale[axis] / ob->size[axis]; + ob->size[0] *= ratio; + ob->size[1] *= ratio; + ob->size[2] *= ratio; + } + } + } + else { + VECCOPY(ob->size, tfp->ob_scale); + + } + DAG_object_flush_update(scene, ob, OB_RECALC_OB); + } + break; + + case B_OBJECTPANELDIMS: + bb= object_get_boundbox(ob); + if(bb) { + float old_dims[3], scale[3], ratio, len[3]; + int axis; + + Mat4ToSize(ob->obmat, scale); + + len[0] = bb->vec[4][0] - bb->vec[0][0]; + len[1] = bb->vec[2][1] - bb->vec[0][1]; + len[2] = bb->vec[1][2] - bb->vec[0][2]; + + old_dims[0] = fabs(scale[0]) * len[0]; + old_dims[1] = fabs(scale[1]) * len[1]; + old_dims[2] = fabs(scale[2]) * len[2]; + + /* for each axis changed */ + for (axis = 0; axis<3; axis++) { + if (fabs(old_dims[axis] - tfp->ob_dims[axis]) > 0.0001) { + if (old_dims[axis] > 0.0) { + ratio = tfp->ob_dims[axis] / old_dims[axis]; + if (tfp->link_scale) { + ob->size[0] *= ratio; + ob->size[1] *= ratio; + ob->size[2] *= ratio; + break; + } + else { + ob->size[axis] *= ratio; + } + } + else { + if (len[axis] > 0) { + ob->size[axis] = tfp->ob_dims[axis] / len[axis]; + } + } + } + } + + /* prevent multiple B_OBJECTPANELDIMS events to keep scaling, cycling with TAB on buttons can cause that */ + VECCOPY(tfp->ob_dims, old_dims); + + DAG_object_flush_update(scene, ob, OB_RECALC_OB); + } + break; + + case B_OBJECTPANELMEDIAN: + if(ob) { + v3d_editvertex_buts(C, NULL, v3d, ob, 1.0); + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + } + break; + + /* note; this case also used for parbone */ + case B_OBJECTPANELPARENT: + if(ob) { + if(ob->id.lib || test_parent_loop(ob->parent, ob) ) + ob->parent= NULL; + else { + DAG_scene_sort(scene); + DAG_object_flush_update(scene, ob, OB_RECALC_OB); + } + } + break; + + case B_ARMATUREPANEL1: + { + bArmature *arm= obedit->data; + EditBone *ebone, *child; + + for (ebone = arm->edbo->first; ebone; ebone=ebone->next){ + if ((ebone->flag & BONE_ACTIVE) && (ebone->layer & arm->layer)) + break; + } + if (ebone) { + ebone->roll= M_PI*tfp->ob_eul[0]/180.0; + // Update our parent + if (ebone->parent && ebone->flag & BONE_CONNECTED){ + VECCOPY (ebone->parent->tail, ebone->head); + } + + // Update our children if necessary + for (child = arm->edbo->first; child; child=child->next){ + if (child->parent == ebone && (child->flag & BONE_CONNECTED)){ + VECCOPY (child->head, ebone->tail); + } + } + if(arm->flag & ARM_MIRROR_EDIT) { + EditBone *eboflip= ED_armature_bone_get_mirrored(arm->edbo, ebone); + if(eboflip) { + eboflip->roll= -ebone->roll; + eboflip->head[0]= -ebone->head[0]; + eboflip->tail[0]= -ebone->tail[0]; + + // Update our parent + if (eboflip->parent && eboflip->flag & BONE_CONNECTED){ + VECCOPY (eboflip->parent->tail, eboflip->head); + } + + // Update our children if necessary + for (child = arm->edbo->first; child; child=child->next){ + if (child->parent == eboflip && (child->flag & BONE_CONNECTED)){ + VECCOPY (child->head, eboflip->tail); + } + } + } + } + } + } + break; + case B_ARMATUREPANEL3: // rotate button on channel + { + bArmature *arm; + bPoseChannel *pchan; + Bone *bone; + float eul[3]; + + arm = ob->data; + if (!arm || !ob->pose) return; + + for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + bone = pchan->bone; + if(bone && (bone->flag & BONE_ACTIVE) && (bone->layer & arm->layer)) + break; + } + if (!pchan) return; + + /* make a copy to eul[3], to allow TAB on buttons to work */ + eul[0]= M_PI*tfp->ob_eul[0]/180.0; + eul[1]= M_PI*tfp->ob_eul[1]/180.0; + eul[2]= M_PI*tfp->ob_eul[2]/180.0; + EulToQuat(eul, pchan->quat); + } + /* no break, pass on */ + case B_ARMATUREPANEL2: + { + ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK); + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + } + break; + case B_TRANSFORMSPACEADD: + BIF_manageTransformOrientation(C, 1, 0); + break; + case B_TRANSFORMSPACECLEAR: + BIF_clearTransformOrientation(C); + break; + + case B_WEIGHT0_0: + wpaint->weight = 0.0f; + break; + + case B_WEIGHT1_4: + wpaint->weight = 0.25f; + break; + case B_WEIGHT1_2: + wpaint->weight = 0.5f; + break; + case B_WEIGHT3_4: + wpaint->weight = 0.75f; + break; + case B_WEIGHT1_0: + wpaint->weight = 1.0f; + break; + + case B_OPA1_8: + wpaint->a = 0.125f; + break; + case B_OPA1_4: + wpaint->a = 0.25f; + break; + case B_OPA1_2: + wpaint->a = 0.5f; + break; + case B_OPA3_4: + wpaint->a = 0.75f; + break; + case B_OPA1_0: + wpaint->a = 1.0f; + break; + case B_CLR_WPAINT: +// if(!multires_level1_test()) { + { + bDeformGroup *defGroup = BLI_findlink(&ob->defbase, ob->actdef-1); + if(defGroup) { + Mesh *me= ob->data; + int a; + for(a=0; atotvert; a++) + remove_vert_defgroup (ob, defGroup, a); + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + } + } + break; + + } + + /* default for now */ + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); +} + +void removeTransformOrientation_func(bContext *C, void *target, void *unused) +{ + BIF_removeTransformOrientation(C, (TransformOrientation *) target); +} + +void selectTransformOrientation_func(bContext *C, void *target, void *unused) +{ + BIF_selectTransformOrientation(C, (TransformOrientation *) target); +} + +static void view3d_panel_transform_spaces(const bContext *C, ARegion *ar, short cntrl) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + View3D *v3d= CTX_wm_view3d(C); + ListBase *transform_spaces = &scene->transform_spaces; + TransformOrientation *ts = transform_spaces->first; + uiBlock *block; + uiBut *but; + int xco = 20, yco = 70, height = 140; + int index; + + block= uiBeginBlock(C, ar, "view3d_panel_transform", UI_EMBOSS, UI_HELV); + if(uiNewPanel(C, ar, block, "Transform Orientations", "View3d", 1000, 0, 318, height)==0) return; + + uiNewPanelHeight(block, height); + + uiBlockBeginAlign(block); + + if (obedit) + uiDefBut(block, BUT, B_TRANSFORMSPACEADD, "Add", xco,120,80,20, 0, 0, 0, 0, 0, "Add the selected element as a Transform Orientation"); + else + uiDefBut(block, BUT, B_TRANSFORMSPACEADD, "Add", xco,120,80,20, 0, 0, 0, 0, 0, "Add the active object as a Transform Orientation"); + + uiDefBut(block, BUT, B_TRANSFORMSPACECLEAR, "Clear", xco + 80,120,80,20, 0, 0, 0, 0, 0, "Removal all Transform Orientations"); + + uiBlockEndAlign(block); + + uiBlockBeginAlign(block); + + uiDefButS(block, ROW, REDRAWHEADERS, "Global", xco, 90, 40,20, &v3d->twmode, 5.0, (float)V3D_MANIP_GLOBAL,0, 0, "Global Transform Orientation"); + uiDefButS(block, ROW, REDRAWHEADERS, "Local", xco + 40, 90, 40,20, &v3d->twmode, 5.0, (float)V3D_MANIP_LOCAL, 0, 0, "Local Transform Orientation"); + uiDefButS(block, ROW, REDRAWHEADERS, "Normal", xco + 80, 90, 40,20, &v3d->twmode, 5.0, (float)V3D_MANIP_NORMAL,0, 0, "Normal Transform Orientation"); + uiDefButS(block, ROW, REDRAWHEADERS, "View", xco + 120, 90, 40,20, &v3d->twmode, 5.0, (float)V3D_MANIP_VIEW, 0, 0, "View Transform Orientation"); + + for (index = V3D_MANIP_CUSTOM, ts = transform_spaces->first ; ts ; ts = ts->next, index++) { + + UI_ThemeColor(TH_BUT_ACTION); + if (v3d->twmode == index) { + but = uiDefIconButS(block,ROW, REDRAWHEADERS, ICON_CHECKBOX_HLT, xco,yco,XIC,YIC, &v3d->twmode, 5.0, (float)index, 0, 0, "Use this Custom Transform Orientation"); + } + else { + but = uiDefIconButS(block,ROW, REDRAWHEADERS, ICON_CHECKBOX_DEHLT, xco,yco,XIC,YIC, &v3d->twmode, 5.0, (float)index, 0, 0, "Use this Custom Transform Orientation"); + } + uiButSetFunc(but, selectTransformOrientation_func, ts, NULL); + uiDefBut(block, TEX, 0, "", xco+=XIC, yco,100+XIC,20, &ts->name, 0, 30, 0, 0, "Edits the name of this Transform Orientation"); + but = uiDefIconBut(block, BUT, B_REDR, ICON_X, xco+=100+XIC,yco,XIC,YIC, 0, 0, 0, 0, 0, "Deletes this Transform Orientation"); + uiButSetFunc(but, removeTransformOrientation_func, ts, NULL); + + xco = 20; + yco -= 25; + } + uiBlockEndAlign(block); + + if(yco < 0) uiNewPanelHeight(block, height-yco); + uiEndBlock(C, block); +} + +static void weight_paint_buttons(Scene *scene, uiBlock *block) +{ + VPaint *wpaint= scene->toolsettings->wpaint; + Object *ob; + ob= OBACT; + + if(ob==NULL || ob->type!=OB_MESH) return; + + uiBlockBeginAlign(block); + uiDefButF(block, NUMSLI, B_REDR, "Weight:",10,170,225,19, &wpaint->weight, 0, 1, 10, 0, "Sets the current vertex group's bone deformation strength"); + + uiDefBut(block, BUT, B_WEIGHT0_0 , "0", 10,150,45,19, 0, 0, 0, 0, 0, ""); + uiDefBut(block, BUT, B_WEIGHT1_4 , "1/4", 55,150,45,19, 0, 0, 0, 0, 0, ""); + uiDefBut(block, BUT, B_WEIGHT1_2 , "1/2", 100,150,45,19, 0, 0, 0, 0, 0, ""); + uiDefBut(block, BUT, B_WEIGHT3_4 , "3/4", 145,150,45,19, 0, 0, 0, 0, 0, ""); + uiDefBut(block, BUT, B_WEIGHT1_0 , "1", 190,150,45,19, 0, 0, 0, 0, 0, ""); + + uiDefButF(block, NUMSLI, B_NOP, "Opacity ", 10,130,225,19, &wpaint->a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush"); + + uiDefBut(block, BUT, B_OPA1_8 , "1/8", 10,110,45,19, 0, 0, 0, 0, 0, ""); + uiDefBut(block, BUT, B_OPA1_4 , "1/4", 55,110,45,19, 0, 0, 0, 0, 0, ""); + uiDefBut(block, BUT, B_OPA1_2 , "1/2", 100,110,45,19, 0, 0, 0, 0, 0, ""); + uiDefBut(block, BUT, B_OPA3_4 , "3/4", 145,110,45,19, 0, 0, 0, 0, 0, ""); + uiDefBut(block, BUT, B_OPA1_0 , "1", 190,110,45,19, 0, 0, 0, 0, 0, ""); + + uiDefButF(block, NUMSLI, B_NOP, "Size ", 10,90,225,19, &wpaint->size, 2.0, 64.0, 0, 0, "The size of the brush"); + + uiBlockBeginAlign(block); + uiDefButS(block, ROW, B_NOP, "Mix", 250,170,60,17, &wpaint->mode, 1.0, 0.0, 0, 0, "Mix the vertex colors"); + uiDefButS(block, ROW, B_NOP, "Add", 250,152,60,17, &wpaint->mode, 1.0, 1.0, 0, 0, "Add the vertex colors"); + uiDefButS(block, ROW, B_NOP, "Sub", 250,134,60,17, &wpaint->mode, 1.0, 2.0, 0, 0, "Subtract from the vertex color"); + uiDefButS(block, ROW, B_NOP, "Mul", 250,116,60,17, &wpaint->mode, 1.0, 3.0, 0, 0, "Multiply the vertex color"); + uiDefButS(block, ROW, B_NOP, "Blur", 250, 98,60,17, &wpaint->mode, 1.0, 4.0, 0, 0, "Blur the weight with surrounding values"); + uiDefButS(block, ROW, B_NOP, "Lighter", 250, 80,60,17, &wpaint->mode, 1.0, 5.0, 0, 0, "Paint over darker areas only"); + uiDefButS(block, ROW, B_NOP, "Darker", 250, 62,60,17, &wpaint->mode, 1.0, 6.0, 0, 0, "Paint over lighter areas only"); + uiBlockEndAlign(block); + + /* draw options same as below */ + uiBlockBeginAlign(block); + if (FACESEL_PAINT_TEST) { + Mesh *me= ob->data; + uiDefButBitI(block, TOG, ME_DRAWFACES, B_REDR, "Faces", 10,45,60,19, &me->drawflag, 0, 0, 0, 0, "Displays all faces as shades"); + uiDefButBitI(block,TOG, ME_DRAWEDGES, B_REDR,"Edges",70,45,60,19, &me->drawflag, 2.0, 0, 0, 0, "Displays edges of visible faces"); + uiDefButBitI(block,TOG, ME_HIDDENEDGES, B_REDR,"Hidden Edges",130,45,100,19, &me->drawflag, 2.0, 1.0, 0, 0, "Displays edges of hidden faces"); + } else{ + uiDefButBitC(block, TOG, OB_DRAWWIRE, B_REDR, "Wire", 10,45,75,19, &ob->dtx, 0, 0, 0, 0, "Displays the active object's wireframe in shaded drawing modes"); + } + uiBlockEndAlign(block); + + uiBlockBeginAlign(block); + uiDefButBitS(block, TOG, VP_AREA, 0, "All Faces", 10,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Paint on all faces inside brush (otherwise only on face under mouse cursor)"); + uiDefButBitS(block, TOG, VP_SOFT, 0, "Vert Dist", 70,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Use distances to vertices (instead of all vertices of face)"); + uiDefButBitS(block, TOGN, VP_HARD, 0, "Soft", 130,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Use a soft brush"); + uiDefButBitS(block, TOG, VP_NORMALS, 0, "Normals", 190,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Applies the vertex normal before painting"); + uiDefButBitS(block, TOG, VP_SPRAY, 0, "Spray", 250,20,55,19, &wpaint->flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse"); + uiBlockEndAlign(block); + + if(ob) { + uiBlockBeginAlign(block); + uiDefButBitS(block, TOG, VP_ONLYVGROUP, B_REDR, "Vgroup", 10,0,100,19, &wpaint->flag, 0, 0, 0, 0, "Only paint on vertices in the selected vertex group."); + uiDefButBitS(block, TOG, VP_MIRROR_X, B_REDR, "X-Mirror", 110,0,100,19, &wpaint->flag, 0, 0, 0, 0, "Mirrored Paint, applying on mirrored Weight Group name"); + uiDefBut(block, BUT, B_CLR_WPAINT, "Clear", 210,0,100,19, NULL, 0, 0, 0, 0, "Removes reference to this deform group from all vertices"); + uiBlockEndAlign(block); + } +} + +static void sculptmode_draw_interface_tools(Scene *scene, uiBlock *block, unsigned short cx, unsigned short cy) +{ +#if 0 + Sculpt *sd= scene->toolsettings->sculpt; + + uiBlockBeginAlign(block); + + uiDefBut(block,LABEL,B_NOP,"Brush",cx,cy,90,19,NULL,0,0,0,0,""); + cy-= 20; + + uiBlockBeginAlign(block); + uiDefButS(block,ROW,B_REDR,"Draw",cx,cy,67,19,&sd->brush_type,14.0,DRAW_BRUSH,0,0,"Draw lines on the model"); + uiDefButS(block,ROW,REDRAWBUTSEDIT,"Smooth",cx+67,cy,67,19,&sd->brush_type,14.0,SMOOTH_BRUSH,0,0,"Interactively smooth areas of the model"); + uiDefButS(block,ROW,B_REDR,"Pinch",cx+134,cy,67,19,&sd->brush_type,14.0,PINCH_BRUSH,0,0,"Interactively pinch areas of the model"); + uiDefButS(block,ROW,B_REDR,"Inflate",cx+201,cy,67,19,&sd->brush_type,14,INFLATE_BRUSH,0,0,"Push vertices along the direction of their normals"); + cy-= 20; + uiDefButS(block,ROW,B_REDR,"Grab", cx,cy,89,19,&sd->brush_type,14,GRAB_BRUSH,0,0,"Grabs a group of vertices and moves them with the mouse"); + uiDefButS(block,ROW,B_REDR,"Layer", cx+89,cy,89,19,&sd->brush_type,14, LAYER_BRUSH,0,0,"Adds a layer of depth"); + uiDefButS(block,ROW,B_REDR,"Flatten", cx+178,cy,90,19,&sd->brush_type,14, FLATTEN_BRUSH,0,0,"Interactively flatten areas of the model"); + cy-= 25; + uiBlockEndAlign(block); + + uiBlockBeginAlign(block); + uiDefBut(block,LABEL,B_NOP,"Shape",cx,cy,90,19,NULL,0,0,0,0,""); + cy-= 20; + + uiBlockBeginAlign(block); + if(sd->brush_type != SMOOTH_BRUSH && sd->brush_type != GRAB_BRUSH && sd->brush_type != FLATTEN_BRUSH) { + uiDefButC(block,ROW,B_NOP,"Add",cx,cy,89,19,&sculptmode_brush()->dir,15.0,1.0,0, 0,"Add depth to model [Shift]"); + uiDefButC(block,ROW,B_NOP,"Sub",cx+89,cy,89,19,&sculptmode_brush()->dir,15.0,2.0,0, 0,"Subtract depth from model [Shift]"); + } + if(sd->brush_type!=GRAB_BRUSH) + uiDefButBitC(block, TOG, SCULPT_BRUSH_AIRBRUSH, B_NOP, "Airbrush", cx+178,cy,89,19, &sculptmode_brush()->flag,0,0,0,0, "Brush makes changes without waiting for the mouse to move"); + cy-= 20; + uiDefButS(block,NUMSLI,B_NOP,"Size: ",cx,cy,268,19,&sculptmode_brush()->size,1.0,200.0,0,0,"Set brush radius in pixels"); + cy-= 20; + if(sd->brush_type!=GRAB_BRUSH) + uiDefButC(block,NUMSLI,B_NOP,"Strength: ",cx,cy,268,19,&sculptmode_brush()->strength,1.0,100.0,0,0,"Set brush strength"); + cy-= 25; + uiBlockEndAlign(block); + + uiBlockBeginAlign(block); + uiDefBut( block,LABEL,B_NOP,"Symmetry",cx,cy,90,19,NULL,0,0,0,0,""); + cy-= 20; + uiBlockBeginAlign(block); + uiDefButBitC(block, TOG, SYMM_X, B_NOP, "X", cx,cy,40,19, &sd->symm, 0,0,0,0, "Mirror brush across X axis"); + uiDefButBitC(block, TOG, SYMM_Y, B_NOP, "Y", cx+40,cy,40,19, &sd->symm, 0,0,0,0, "Mirror brush across Y axis"); + uiDefButBitC(block, TOG, SYMM_Z, B_NOP, "Z", cx+80,cy,40,19, &sd->symm, 0,0,0,0, "Mirror brush across Z axis"); + uiBlockEndAlign(block); + + + cy+= 20; + uiBlockBeginAlign(block); + uiDefBut( block,LABEL,B_NOP,"LockAxis",cx+140,cy,90,19,NULL,0,0,0,0,""); + cy-= 20; + uiBlockBeginAlign(block); + uiDefButBitC(block, TOG, AXISLOCK_X, B_NOP, "X", cx+140,cy,40,19, &sd->axislock, 0,0,0,0, "Constrain X axis"); + uiDefButBitC(block, TOG, AXISLOCK_Y, B_NOP, "Y", cx+180,cy,40,19, &sd->axislock, 0,0,0,0, "Constrain Y axis"); + uiDefButBitC(block, TOG, AXISLOCK_Z, B_NOP, "Z", cx+220,cy,40,19, &sd->axislock, 0,0,0,0, "Constrain Z axis"); + uiBlockEndAlign(block); + + cx+= 210; +#endif +} + + +static void view3d_panel_object(const bContext *C, ARegion *ar, short cntrl) // VIEW3D_HANDLER_OBJECT +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + View3D *v3d= CTX_wm_view3d(C); + uiBlock *block; + uiBut *bt; + Object *ob= OBACT; + TransformProperties *tfp; + float lim; + static char hexcol[128]; + + if(ob==NULL) return; + + /* make sure we got storage */ + if(v3d->properties_storage==NULL) + v3d->properties_storage= MEM_callocN(sizeof(TransformProperties), "TransformProperties"); + tfp= v3d->properties_storage; + + block= uiBeginBlock(C, ar, "view3d_panel_object", UI_EMBOSS, UI_HELV); + uiBlockSetHandleFunc(block, do_view3d_region_buttons, NULL); + + if((G.f & G_SCULPTMODE) && !obedit) { + if(!uiNewPanel(C, ar, block, "Transform Properties", "View3d", 10, 230, 318, 234)) + return; + } else if(G.f & G_PARTICLEEDIT && !obedit){ + if(!uiNewPanel(C, ar, block, "Transform Properties", "View3d", 10, 230, 318, 234)) + return; + } else { + if(!uiNewPanel(C, ar, block, "Transform Properties", "View3d", 10, 230, 318, 204)) + return; + } + +// XXX uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE); + + if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) { + } + else { + bt= uiDefBut(block, TEX, B_IDNAME, "OB: ", 10,180,140,20, ob->id.name+2, 0.0, 21.0, 0, 0, ""); +// XXX uiButSetFunc(bt, test_idbutton_cb, ob->id.name, NULL); + + if((G.f & G_PARTICLEEDIT)==0) { + uiBlockBeginAlign(block); +// XXX uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_OBJECTPANELPARENT, "Par:", 160, 180, 140, 20, &ob->parent, "Parent Object"); + if((ob->parent) && (ob->partype == PARBONE)) { + bt= uiDefBut(block, TEX, B_OBJECTPANELPARENT, "ParBone:", 160, 160, 140, 20, ob->parsubstr, 0, 30, 0, 0, ""); +// XXX uiButSetCompleteFunc(bt, autocomplete_bone, (void *)ob->parent); + } + else { + strcpy(ob->parsubstr, ""); + } + uiBlockEndAlign(block); + } + } + + lim= 10000.0f*MAX2(1.0, v3d->grid); + + if(ob==obedit) { + if(ob->type==OB_ARMATURE) v3d_editarmature_buts(block, v3d, ob, lim); + if(ob->type==OB_MBALL) v3d_editmetaball_buts(block, ob, lim); + else v3d_editvertex_buts(C, block, v3d, ob, lim); + } + else if(ob->flag & OB_POSEMODE) { + v3d_posearmature_buts(block, v3d, ob, lim); + } + else if(G.f & G_WEIGHTPAINT) { + uiNewPanelTitle(block, "Weight Paint Properties"); + weight_paint_buttons(scene, block); + } + else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT)) { + static float hsv[3], old[3]; // used as temp mem for picker + float *rgb= NULL; + ToolSettings *settings= scene->toolsettings; + + if(G.f & G_VERTEXPAINT) rgb= &settings->vpaint->r; + else if(settings->imapaint.brush) rgb= settings->imapaint.brush->rgb; + + uiNewPanelTitle(block, "Paint Properties"); + if (rgb) + /* 'f' is for floating panel */ + uiBlockPickerButtons(block, rgb, hsv, old, hexcol, 'f', B_REDR); + } + else if(G.f & G_SCULPTMODE) { + uiNewPanelTitle(block, "Sculpt Properties"); + sculptmode_draw_interface_tools(scene, block, 10, 150); + } + else if(G.f & G_PARTICLEEDIT){ + uiNewPanelTitle(block, "Particle Edit Properties"); +// XXX particle_edit_buttons(block); + } + else { + BoundBox *bb = NULL; + + uiBlockBeginAlign(block); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCX, B_REDR, ICON_UNLOCKED, 10,150,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANEL, "LocX:", 30, 150, 120, 19, &(ob->loc[0]), -lim, lim, 100, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCY, B_REDR, ICON_UNLOCKED, 10,130,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANEL, "LocY:", 30, 130, 120, 19, &(ob->loc[1]), -lim, lim, 100, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCZ, B_REDR, ICON_UNLOCKED, 10,110,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANEL, "LocZ:", 30, 110, 120, 19, &(ob->loc[2]), -lim, lim, 100, 3, ""); + + tfp->ob_eul[0]= 180.0*ob->rot[0]/M_PI; + tfp->ob_eul[1]= 180.0*ob->rot[1]/M_PI; + tfp->ob_eul[2]= 180.0*ob->rot[2]/M_PI; + + uiBlockBeginAlign(block); + if ((ob->parent) && (ob->partype == PARBONE)) { + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 160,130,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELROT, "RotX:", 180, 130, 120, 19, &(tfp->ob_eul[0]), -lim, lim, 1000, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 160,110,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELROT, "RotY:", 180, 110, 120, 19, &(tfp->ob_eul[1]), -lim, lim, 1000, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 160,90,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELROT, "RotZ:", 180, 90, 120, 19, &(tfp->ob_eul[2]), -lim, lim, 1000, 3, ""); + + } + else { + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 160,150,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELROT, "RotX:", 180, 150, 120, 19, &(tfp->ob_eul[0]), -lim, lim, 1000, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 160,130,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELROT, "RotY:", 180, 130, 120, 19, &(tfp->ob_eul[1]), -lim, lim, 1000, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 160,110,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELROT, "RotZ:", 180, 110, 120, 19, &(tfp->ob_eul[2]), -lim, lim, 1000, 3, ""); + } + + tfp->ob_scale[0]= ob->size[0]; + tfp->ob_scale[1]= ob->size[1]; + tfp->ob_scale[2]= ob->size[2]; + + uiBlockBeginAlign(block); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEX, B_REDR, ICON_UNLOCKED, 10,80,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleX:", 30, 80, 120, 19, &(tfp->ob_scale[0]), -lim, lim, 10, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEY, B_REDR, ICON_UNLOCKED, 10,60,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleY:", 30, 60, 120, 19, &(tfp->ob_scale[1]), -lim, lim, 10, 3, ""); + uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEZ, B_REDR, ICON_UNLOCKED, 10,40,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed"); + uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleZ:", 30, 40, 120, 19, &(tfp->ob_scale[2]), -lim, lim, 10, 3, ""); + uiBlockEndAlign(block); + + uiDefButS(block, TOG, B_REDR, "Link Scale", 10, 10, 140, 19, &(tfp->link_scale), 0, 1, 0, 0, "Scale values vary proportionally in all directions"); + + bb= object_get_boundbox(ob); + if (bb) { + float scale[3]; + + Mat4ToSize(ob->obmat, scale); + + tfp->ob_dims[0] = fabs(scale[0]) * (bb->vec[4][0] - bb->vec[0][0]); + tfp->ob_dims[1] = fabs(scale[1]) * (bb->vec[2][1] - bb->vec[0][1]); + tfp->ob_dims[2] = fabs(scale[2]) * (bb->vec[1][2] - bb->vec[0][2]); + + uiBlockBeginAlign(block); + if ((ob->parent) && (ob->partype == PARBONE)) { + uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimX:", 160, 60, 140, 19, &(tfp->ob_dims[0]), 0.0, lim, 10, 3, "Manipulate bounding box size"); + uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimY:", 160, 40, 140, 19, &(tfp->ob_dims[1]), 0.0, lim, 10, 3, "Manipulate bounding box size"); + uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimZ:", 160, 20, 140, 19, &(tfp->ob_dims[2]), 0.0, lim, 10, 3, "Manipulate bounding box size"); + + } + else { + uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimX:", 160, 80, 140, 19, &(tfp->ob_dims[0]), 0.0, lim, 10, 3, "Manipulate bounding box size"); + uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimY:", 160, 60, 140, 19, &(tfp->ob_dims[1]), 0.0, lim, 10, 3, "Manipulate bounding box size"); + uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimZ:", 160, 40, 140, 19, &(tfp->ob_dims[2]), 0.0, lim, 10, 3, "Manipulate bounding box size"); + } + + uiBlockEndAlign(block); + } + } +// XXX uiClearButLock(); + uiEndBlock(C, block); +} + +static void view3d_panel_background(const bContext *C, ARegion *ar, short cntrl) // VIEW3D_HANDLER_BACKGROUND +{ + View3D *v3d= CTX_wm_view3d(C); + uiBlock *block; + + block= uiBeginBlock(C, ar, "view3d_panel_background", UI_EMBOSS, UI_HELV); + if(uiNewPanel(C, ar, block, "Background Image", "View3d", 340, 10, 318, 204)==0) return; + + if(v3d->flag & V3D_DISPBGPIC) { + if(v3d->bgpic==NULL) { + v3d->bgpic= MEM_callocN(sizeof(BGpic), "bgpic"); + v3d->bgpic->size= 5.0; + v3d->bgpic->blend= 0.5; + v3d->bgpic->iuser.fie_ima= 2; + v3d->bgpic->iuser.ok= 1; + } + } + + if(!(v3d->flag & V3D_DISPBGPIC)) { + uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use Background Image", 10, 180, 150, 20, &v3d->flag, 0, 0, 0, 0, "Display an image in the background of this 3D View"); + uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, ""); + } + else { + uiBlockBeginAlign(block); + uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use", 10, 225, 50, 20, &v3d->flag, 0, 0, 0, 0, "Display an image in the background of this 3D View"); + uiDefButF(block, NUMSLI, B_REDR, "Blend:", 60, 225, 150, 20, &v3d->bgpic->blend, 0.0,1.0, 0, 0, "Set the transparency of the background image"); + uiDefButF(block, NUM, B_REDR, "Size:", 210, 225, 100, 20, &v3d->bgpic->size, 0.1, 250.0*v3d->grid, 100, 0, "Set the size (width) of the background image"); + + uiDefButF(block, NUM, B_REDR, "X Offset:", 10, 205, 150, 20, &v3d->bgpic->xof, -250.0*v3d->grid,250.0*v3d->grid, 10, 2, "Set the horizontal offset of the background image"); + uiDefButF(block, NUM, B_REDR, "Y Offset:", 160, 205, 150, 20, &v3d->bgpic->yof, -250.0*v3d->grid,250.0*v3d->grid, 10, 2, "Set the vertical offset of the background image"); + +// XXX uiblock_image_panel(block, &v3d->bgpic->ima, &v3d->bgpic->iuser, B_REDR, B_REDR); + uiBlockEndAlign(block); + } + uiEndBlock(C, block); +} + + +static void view3d_panel_properties(const bContext *C, ARegion *ar, short cntrl) // VIEW3D_HANDLER_SETTINGS +{ + Scene *scene= CTX_data_scene(C); + View3D *v3d= CTX_wm_view3d(C); + uiBlock *block; + float *curs; + + block= uiBeginBlock(C, ar, "view3d_panel_properties", UI_EMBOSS, UI_HELV); + if(uiNewPanel(C, ar, block, "View Properties", "View3d", 340, 30, 318, 254)==0) return; + uiBlockSetHandleFunc(block, do_view3d_region_buttons, NULL); + + /* to force height */ + uiNewPanelHeight(block, 264); + + uiDefBut(block, LABEL, 1, "Grid:", 10, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_REDR, "Spacing:", 10, 200, 140, 19, &v3d->grid, 0.001, 100.0, 10, 0, "Set the distance between grid lines"); + uiDefButS(block, NUM, B_REDR, "Lines:", 10, 180, 140, 19, &v3d->gridlines, 0.0, 100.0, 100, 0, "Set the number of grid lines in perspective view"); + uiDefButS(block, NUM, B_REDR, "Divisions:", 10, 160, 140, 19, &v3d->gridsubdiv, 1.0, 100.0, 100, 0, "Set the number of grid lines"); + uiBlockEndAlign(block); + + uiDefBut(block, LABEL, 1, "3D Display:", 160, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); + uiDefButBitS(block, TOG, V3D_SHOW_FLOOR, B_REDR, "Grid Floor",160, 200, 150, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the grid floor in free camera mode"); + uiDefButBitS(block, TOG, V3D_SHOW_X, B_REDR, "X Axis", 160, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the X Axis line"); + uiDefButBitS(block, TOG, V3D_SHOW_Y, B_REDR, "Y Axis", 212, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the Y Axis line"); + uiDefButBitS(block, TOG, V3D_SHOW_Z, B_REDR, "Z Axis", 262, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the Z Axis line"); + + uiDefBut(block, LABEL, 1, "View Camera:", 10, 140, 140, 19, NULL, 0.0, 0.0, 0, 0, ""); + + uiDefButF(block, NUM, B_REDR, "Lens:", 10, 120, 140, 19, &v3d->lens, 10.0, 120.0, 100, 0, "The lens angle in perspective view"); + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_REDR, "Clip Start:", 10, 96, 140, 19, &v3d->near, v3d->grid/100.0, 100.0, 10, 0, "Set the beginning of the range in which 3D objects are displayed (perspective view)"); + uiDefButF(block, NUM, B_REDR, "Clip End:", 10, 76, 140, 19, &v3d->far, 1.0, 10000.0*v3d->grid, 100, 0, "Set the end of the range in which 3D objects are displayed (perspective view)"); + uiBlockEndAlign(block); + + uiDefBut(block, LABEL, 1, "3D Cursor:", 160, 150, 140, 19, NULL, 0.0, 0.0, 0, 0, ""); + + uiBlockBeginAlign(block); + curs= give_cursor(scene, v3d); + uiDefButF(block, NUM, B_REDR, "X:", 160, 130, 150, 22, curs, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "X co-ordinate of the 3D cursor"); + uiDefButF(block, NUM, B_REDR, "Y:", 160, 108, 150, 22, curs+1, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "Y co-ordinate of the 3D cursor"); + uiDefButF(block, NUM, B_REDR, "Z:", 160, 86, 150, 22, curs+2, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "Z co-ordinate of the 3D cursor"); + uiBlockEndAlign(block); + + uiDefBut(block, LABEL, 1, "Display:", 10, 50, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); + uiBlockBeginAlign(block); + uiDefButBitS(block, TOG, V3D_SELECT_OUTLINE, B_REDR, "Outline Selected", 10, 30, 140, 19, &v3d->flag, 0, 0, 0, 0, "Highlight selected objects with an outline, in Solid, Shaded or Textured viewport shading modes"); + uiDefButBitS(block, TOG, V3D_DRAW_CENTERS, B_REDR, "All Object Centers", 10, 10, 140, 19, &v3d->flag, 0, 0, 0, 0, "Draw the center points on all objects"); + uiDefButBitS(block, TOGN, V3D_HIDE_HELPLINES, B_REDR, "Relationship Lines", 10, -10, 140, 19, &v3d->flag, 0, 0, 0, 0, "Draw dashed lines indicating Parent, Constraint, or Hook relationships"); + uiDefButBitS(block, TOG, V3D_SOLID_TEX, B_REDR, "Solid Tex", 10, -30, 140, 19, &v3d->flag2, 0, 0, 0, 0, "Display textures in Solid draw type (Shift T)"); + uiBlockEndAlign(block); + + uiDefBut(block, LABEL, 1, "View Locking:", 160, 60, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); + uiBlockBeginAlign(block); +// XXX uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_REDR, "Object:", 160, 40, 140, 19, &v3d->ob_centre, "Lock view to center to this Object"); + uiDefBut(block, TEX, B_REDR, "Bone:", 160, 20, 140, 19, v3d->ob_centre_bone, 1, 31, 0, 0, "If view locked to Object, use this Bone to lock to view to"); + +// XXX +// uiDefBut(block, LABEL, 1, "Keyframe Display:", 160, -2, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); +// uiBlockBeginAlign(block); +// uiDefButBitS(block, TOG, ANIMFILTER_ACTIVE, B_REDR, "Active",160, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for active element only (i.e. active bone or active material)"); +// uiDefButBitS(block, TOG, ANIMFILTER_MUTED, B_REDR, "Muted",210, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes in muted channels"); +// uiDefButBitS(block, TOG, ANIMFILTER_LOCAL, B_REDR, "Local",260, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes directly connected to datablock"); +// if ((v3d->keyflags & ANIMFILTER_LOCAL)==0) { +// uiDefButBitS(block, TOGN, ANIMFILTER_NOMAT, B_REDR, "Material",160, -42, 75, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for any available Materials"); +// uiDefButBitS(block, TOGN, ANIMFILTER_NOSKEY, B_REDR, "ShapeKey",235, -42, 75, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for any available Shape Keys"); +// } + uiBlockEndAlign(block); + + uiEndBlock(C, block); +} + +#if 0 +static void view3d_panel_preview(bContext *C, ARegion *ar, short cntrl) // VIEW3D_HANDLER_PREVIEW +{ + uiBlock *block; + View3D *v3d= sa->spacedata.first; + int ofsx, ofsy; + + block= uiBeginBlock(C, ar, "view3d_panel_preview", UI_EMBOSS, UI_HELV); + uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | UI_PNL_SCALE | cntrl); + uiSetPanelHandler(VIEW3D_HANDLER_PREVIEW); // for close and esc + + ofsx= -150+(sa->winx/2)/v3d->blockscale; + ofsy= -100+(sa->winy/2)/v3d->blockscale; + if(uiNewPanel(C, ar, block, "Preview", "View3d", ofsx, ofsy, 300, 200)==0) return; + + uiBlockSetDrawExtraFunc(block, BIF_view3d_previewdraw); + + if(scene->recalc & SCE_PRV_CHANGED) { + scene->recalc &= ~SCE_PRV_CHANGED; + //printf("found recalc\n"); + BIF_view3d_previewrender_free(sa->spacedata.first); + BIF_preview_changed(0); + } +} +#endif + +static void view3d_panel_gpencil(const bContext *C, ARegion *ar, short cntrl) // VIEW3D_HANDLER_GREASEPENCIL +{ + View3D *v3d= CTX_wm_view3d(C); + uiBlock *block; + + block= uiBeginBlock(C, ar, "view3d_panel_gpencil", UI_EMBOSS, UI_HELV); + if (uiNewPanel(C, ar, block, "Grease Pencil", "View3d", 100, 30, 318, 204)==0) return; + + /* allocate memory for gpd if drawing enabled (this must be done first or else we crash) */ + if (v3d->flag2 & V3D_DISPGP) { +// if (v3d->gpd == NULL) +// XXX gpencil_data_setactive(ar, gpencil_data_addnew()); + } + + if (v3d->flag2 & V3D_DISPGP) { +// XXX bGPdata *gpd= v3d->gpd; + short newheight; + + /* this is a variable height panel, newpanel doesnt force new size on existing panels */ + /* so first we make it default height */ + uiNewPanelHeight(block, 204); + + /* draw button for showing gpencil settings and drawings */ + uiDefButBitS(block, TOG, V3D_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &v3d->flag2, 0, 0, 0, 0, "Display freehand annotations overlay over this 3D View (draw using Shift-LMB)"); + + /* extend the panel if the contents won't fit */ +// newheight= draw_gpencil_panel(block, gpd, ar); + uiNewPanelHeight(block, newheight); + } + else { + uiDefButBitS(block, TOG, V3D_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &v3d->flag2, 0, 0, 0, 0, "Display freehand annotations overlay over this 3D View"); + uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, ""); + } + uiEndBlock(C, block); +} + + +void view3d_buttons_area_defbuts(const bContext *C, ARegion *ar) +{ + + view3d_panel_object(C, ar, 0); + view3d_panel_properties(C, ar, 0); + view3d_panel_background(C, ar, 0); + // XXX view3d_panel_preview(C, ar, 0); + view3d_panel_transform_spaces(C, ar, 0); + if(0) + view3d_panel_gpencil(C, ar, 0); + + uiDrawPanels(C, 1); /* 1 = align */ + uiMatchPanelsView2d(ar); /* sets v2d->totrct */ + +} + + +static int view3d_properties(bContext *C, wmOperator *op) +{ + ScrArea *sa= CTX_wm_area(C); + ARegion *ar= view3d_has_buttons_region(sa); + + if(ar) { + ar->flag ^= RGN_FLAG_HIDDEN; + + ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa); + ED_area_tag_redraw(sa); + } + return OPERATOR_FINISHED; +} + +void VIEW3D_OT_properties(wmOperatorType *ot) +{ + ot->name= "Properties"; + ot->idname= "VIEW3D_OT_properties"; + + ot->exec= view3d_properties; + ot->poll= ED_operator_view3d_active; + + /* flags */ + ot->flag= 0; +} diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index de899d28a0a..0dd83caa15a 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1818,7 +1818,7 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event) // VECCOPY(fp, oldcurs); // } // XXX notifier for scene */ - ED_region_tag_redraw(ar); + ED_area_tag_redraw(CTX_wm_area(C)); /* prevent other mouse ops to fail */ return OPERATOR_PASS_THROUGH; diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 20946b007d2..157be64e6e6 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -156,7 +156,7 @@ void ED_view3d_exit_paint_modes(bContext *C) -static void do_view3d_buttons(bContext *C, void *arg, int event); +static void do_view3d_header_buttons(bContext *C, void *arg, int event); #define B_SCENELOCK 101 #define B_FULL 102 @@ -218,7 +218,7 @@ void do_layer_buttons(bContext *C, short event) if(event==-1 && ctrl) { v3d->scenelock= !v3d->scenelock; - do_view3d_buttons(C, NULL, B_SCENELOCK); + do_view3d_header_buttons(C, NULL, B_SCENELOCK); } else if (event<0) { if(v3d->lay== (1<<20)-1) { if(event==-2 || shift) v3d->lay= oldlay; @@ -241,7 +241,7 @@ void do_layer_buttons(bContext *C, short event) if(v3d->lay & (1<lay -= (1<lay += (1<ptr, "mode", WM_RADIALCONTROL_SIZE); RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH); diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index fb9d5a73909..c45cb024e4f 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -918,8 +918,6 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi, return orth; } - -/* important to not set windows active in here, can be renderwin for example */ void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect) /* rect: for picking */ { RegionView3D *rv3d= ar->regiondata; diff --git a/source/blender/editors/space_view3d/vpaint.c b/source/blender/editors/space_view3d/vpaint.c index 902e6cf60b9..5d5efbeb091 100644 --- a/source/blender/editors/space_view3d/vpaint.c +++ b/source/blender/editors/space_view3d/vpaint.c @@ -1187,7 +1187,7 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */ mesh_octree_table(ob, NULL, NULL, 'e'); } - WM_event_add_notifier(C, NC_SCENE|ND_MODE, ob); + WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene); return OPERATOR_FINISHED; } @@ -1664,13 +1664,13 @@ static int set_vpaint(bContext *C, wmOperator *op) /* toggle */ VPaint *vp= scene->toolsettings->vpaint; Mesh *me; - if(object_data_is_libdata(ob)) { + me= get_mesh(ob); + + if(me==NULL || object_data_is_libdata(ob)) { G.f &= ~G_VERTEXPAINT; return OPERATOR_FINISHED; } - me= get_mesh(ob); - if(me && me->totface>=MAXINDEX) { error("Maximum number of faces: %d", MAXINDEX-1); G.f &= ~G_VERTEXPAINT; @@ -1706,7 +1706,7 @@ static int set_vpaint(bContext *C, wmOperator *op) /* toggle */ /* update modifier stack for mapping requirements */ DAG_object_flush_update(scene, ob, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_SCENE|ND_MODE, ob); + WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene); return OPERATOR_FINISHED; } diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index 24b397b0b82..89bf32ef16d 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -209,6 +209,10 @@ typedef struct ARegion { #define RGN_ALIGN_VSPLIT 6 #define RGN_ALIGN_FLOAT 7 #define RGN_ALIGN_QSPLIT 8 +#define RGN_OVERLAP_TOP 9 +#define RGN_OVERLAP_BOTTOM 10 +#define RGN_OVERLAP_LEFT 11 +#define RGN_OVERLAP_RIGHT 12 /* region flag */ #define RGN_FLAG_HIDDEN 1 From 9b76b5e103159aa4a41f697ac5e85e655b9580fb Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 15:51:33 +0000 Subject: [PATCH 30/63] 2.5 Bugfix: Node operators were called in empty node editor, causing NULL reading. Prevented it from happening with more strict poll() --- source/blender/editors/screen/screen_ops.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index b2995836732..6cd06faab68 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -148,7 +148,12 @@ int ED_operator_buttons_active(bContext *C) int ED_operator_node_active(bContext *C) { - return ed_spacetype_test(C, SPACE_NODE); + if(ed_spacetype_test(C, SPACE_NODE)) { + SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C); + if(snode->edittree) + return 1; + } + return 0; } int ED_operator_ipo_active(bContext *C) From ca1b1e07d7684486f373ec81ddaf4e989c9ddc2f Mon Sep 17 00:00:00 2001 From: Kent Mein Date: Tue, 10 Feb 2009 17:06:43 +0000 Subject: [PATCH 31/63] A few more files with dos line endings. Kent --- source/blender/blenlib/intern/string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 715a9316657..e0522e60dd0 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -163,4 +163,4 @@ void BLI_timestr(double _time, char *str) } str[11]=0; -} \ No newline at end of file +} From 149613622434f90f0deebe02dce04d44c95e2dda Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 17:53:10 +0000 Subject: [PATCH 32/63] 2.5 File Window: - Added PKEY parent directory - Made "P" button work - Removed confused theme colors for text, it caused selected text to print greyish. --- source/blender/editors/space_file/file_draw.c | 31 ++++++------------- .../blender/editors/space_file/file_intern.h | 2 ++ source/blender/editors/space_file/file_ops.c | 27 ++++++++++++++++ .../blender/editors/space_file/space_file.c | 2 ++ 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c index d3f30d47bcf..2c839adc451 100644 --- a/source/blender/editors/space_file/file_draw.c +++ b/source/blender/editors/space_file/file_draw.c @@ -85,6 +85,7 @@ enum { B_REDR = 0, B_FS_LOAD, B_FS_CANCEL, + B_FS_PARENT, } eFile_ButEvents; static void do_file_buttons(bContext *C, void *arg, int event) @@ -96,6 +97,9 @@ static void do_file_buttons(bContext *C, void *arg, int event) case B_FS_CANCEL: file_cancel_exec(C, NULL); /* file_ops.c */ break; + case B_FS_PARENT: + file_parent_exec(C, NULL); /* file_ops.c */ + break; } } @@ -168,7 +172,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar) MEM_freeN(menu); - uiDefBut(block, BUT, 0 /* XXX B_FS_PARDIR */, "P", xmin, filebuty2, parentbut_width, 21, 0, 0, 0, 0, 0, "Move to the parent directory (PKEY)"); + uiDefBut(block, BUT, B_FS_PARENT, "P", xmin, filebuty2, parentbut_width, 21, 0, 0, 0, 0, 0, "Move to the parent directory (PKEY)"); uiEndBlock(C, block); uiDrawBlock(C, block); } @@ -502,27 +506,10 @@ void file_draw_list(const bContext *C, ARegion *ar) glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } else { - if (S_ISDIR(file->type)) { - glColor4f(1.0f, 1.0f, 0.9f, 1.0f); - } - else if (file->flags & IMAGEFILE) { - UI_ThemeColor(TH_SEQ_IMAGE); - } - else if (file->flags & MOVIEFILE) { - UI_ThemeColor(TH_SEQ_MOVIE); - } - else if (file->flags & BLENDERFILE) { - UI_ThemeColor(TH_SEQ_SCENE); - } - else { - if (params->active_file == i) { - UI_ThemeColor(TH_GRID); /* grid used for active text */ - } else if (file->flags & ACTIVE) { - UI_ThemeColor(TH_TEXT_HI); - } else { - UI_ThemeColor(TH_TEXT); - } - } + if (S_ISDIR(file->type)) + UI_ThemeColor4(TH_TEXT_HI); + else + UI_ThemeColor4(TH_TEXT); } sw = UI_GetStringWidth(G.font, file->size, 0); diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h index 4f9e6681e6d..d4cb80c1b39 100644 --- a/source/blender/editors/space_file/file_intern.h +++ b/source/blender/editors/space_file/file_intern.h @@ -57,9 +57,11 @@ void ED_FILE_OT_select_bookmark(struct wmOperatorType *ot); void ED_FILE_OT_loadimages(struct wmOperatorType *ot); void ED_FILE_OT_load(struct wmOperatorType *ot); void ED_FILE_OT_cancel(struct wmOperatorType *ot); +void ED_FILE_OT_parent(struct wmOperatorType *ot); int file_load_exec(bContext *C, struct wmOperator *unused); int file_cancel_exec(bContext *C, struct wmOperator *unused); +int file_parent_exec(bContext *C, struct wmOperator *unused); int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my); #endif /* ED_FILE_INTERN_H */ diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 8b8fcbe57fa..2a95a1e15a1 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -514,5 +514,32 @@ void ED_FILE_OT_load(struct wmOperatorType *ot) ot->poll= ED_operator_file_active; /* <- important, handler is on window level */ } +int file_parent_exec(bContext *C, wmOperator *unused) +{ + SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + + if(sfile->params) { + BLI_parent_dir(sfile->params->dir); + filelist_setdir(sfile->files, sfile->params->dir); + filelist_free(sfile->files); + sfile->params->active_file = -1; + } + ED_area_tag_redraw(CTX_wm_area(C)); + + return OPERATOR_FINISHED; + +} + +void ED_FILE_OT_parent(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Parent File"; + ot->idname= "ED_FILE_OT_parent"; + + /* api callbacks */ + ot->exec= file_parent_exec; + ot->poll= ED_operator_file_active; /* <- important, handler is on window level */ +} + diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index e32527ee420..fe681e246ce 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -259,6 +259,7 @@ void file_operatortypes(void) WM_operatortype_append(ED_FILE_OT_highlight); WM_operatortype_append(ED_FILE_OT_load); WM_operatortype_append(ED_FILE_OT_cancel); + WM_operatortype_append(ED_FILE_OT_parent); } /* NOTE: do not add .blend file reading on this level */ @@ -269,6 +270,7 @@ void file_keymap(struct wmWindowManager *wm) WM_keymap_add_item(keymap, "ED_FILE_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ED_FILE_OT_border_select", BKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ED_FILE_OT_highlight", MOUSEMOVE, KM_ANY, 0, 0); + WM_keymap_add_item(keymap, "ED_FILE_OT_parent", PKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ED_FILE_OT_loadimages", TIMER1, KM_ANY, KM_ANY, 0); From 517b6cc3cb47b615c2f854b0405362cb395a2939 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 17:56:15 +0000 Subject: [PATCH 33/63] 2.5 Third attempt to get the invisible character going! --- source/blender/blenlib/BLI_rect.h | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h index 45a96f6055d..816347650fb 100644 --- a/source/blender/blenlib/BLI_rect.h +++ b/source/blender/blenlib/BLI_rect.h @@ -59,6 +59,7 @@ int BLI_isect_rcti(struct rcti *src1, struct rcti *src2, struct rcti *dest); void BLI_union_rctf(struct rctf *rcta, struct rctf *rctb); void BLI_union_rcti(struct rcti *rct1, struct rcti *rct2); + #ifdef __cplusplus } #endif From da775a369820d61fe62b1b37e3848bfdc543336c Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 18:06:26 +0000 Subject: [PATCH 34/63] 2.5 Made GE compile again --- source/gameengine/Converter/BL_ActionActuator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp index 273dbd2c3f0..536faa11b03 100644 --- a/source/gameengine/Converter/BL_ActionActuator.cpp +++ b/source/gameengine/Converter/BL_ActionActuator.cpp @@ -371,7 +371,7 @@ bool BL_ActionActuator::Update(double curtime, bool frame) obj->GetPose(&m_pose); /* Override the necessary channels with ones from the action */ - extract_pose_from_action(m_pose, m_action, m_localtime); + // XXX extract_pose_from_action(m_pose, m_action, m_localtime); /* Perform the user override (if any) */ if (m_userpose){ From a216695ee753bf109b5c214ed111e55ab75b34d7 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 18:33:32 +0000 Subject: [PATCH 35/63] 2.5 snprintf should be BLI_snprintf --- source/blender/editors/space_view3d/view3d_buttons.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index e9c22ffee78..556d52e4aff 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -187,7 +187,7 @@ static void v3d_editvertex_buts(const bContext *C, uiBlock *block, View3D *v3d, for (i=0; itotweight; i++){ dg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr); if(dg) { - max+= snprintf(str, sizeof(str), "%s %%x%d|", dg->name, dvert->dw[i].def_nr); + max+= BLI_snprintf(str, sizeof(str), "%s %%x%d|", dg->name, dvert->dw[i].def_nr); if(max<320) strcat(defstr, str); } else printf("oh no!\n"); From 12c17347cb095db8f8e19b22eeb7c8b8c508794b Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 18:36:34 +0000 Subject: [PATCH 36/63] 2.5 Fourth trial to get the invisible character gone! (I have to add/remove enters to get it committed even) Thanks to Thomas for retyping the faulty line entirely :) --- source/blender/blenlib/BLI_rect.h | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h index 816347650fb..45a96f6055d 100644 --- a/source/blender/blenlib/BLI_rect.h +++ b/source/blender/blenlib/BLI_rect.h @@ -59,7 +59,6 @@ int BLI_isect_rcti(struct rcti *src1, struct rcti *src2, struct rcti *dest); void BLI_union_rctf(struct rctf *rcta, struct rctf *rctb); void BLI_union_rcti(struct rcti *rct1, struct rcti *rct2); - #ifdef __cplusplus } #endif From e4ce4a00a08e3922529a550bdab7e01175d8dc94 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 10 Feb 2009 18:50:40 +0000 Subject: [PATCH 37/63] 2.5 Fifth attempt! Previous commit was wrong file :( --- source/blender/blenlib/BLI_rect.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h index 45a96f6055d..1bae821ae55 100644 --- a/source/blender/blenlib/BLI_rect.h +++ b/source/blender/blenlib/BLI_rect.h @@ -57,7 +57,8 @@ int BLI_in_rctf(struct rctf *rect, float x, float y); int BLI_isect_rctf(struct rctf *src1, struct rctf *src2, struct rctf *dest); int BLI_isect_rcti(struct rcti *src1, struct rcti *src2, struct rcti *dest); void BLI_union_rctf(struct rctf *rcta, struct rctf *rctb); -void BLI_union_rcti(struct rcti *rct1, struct rcti *rct2); +void BLI_union_rcti(struct rcti *rcti1, struct rcti *rcti2); + #ifdef __cplusplus } From 2c82163d5b20333ff13aea6b626b4cad803b7bd5 Mon Sep 17 00:00:00 2001 From: Diego Borghetti Date: Tue, 10 Feb 2009 21:41:14 +0000 Subject: [PATCH 38/63] commit to continue in my home. Also I remove some of the #if 0. --- source/blender/blenfont/intern/blf_dir.c | 4 - source/blender/blenfont/intern/blf_font.c | 1 + source/blender/blenfont/intern/blf_glyph.c | 47 ++++--- source/blender/blenfont/intern/blf_internal.h | 6 +- .../blenfont/intern/blf_internal_types.h | 4 +- source/blender/blenfont/intern/blf_util.c | 131 ++++++++++++++++++ 6 files changed, 168 insertions(+), 25 deletions(-) create mode 100644 source/blender/blenfont/intern/blf_util.c diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c index 2472d36a1d8..dea422a1765 100644 --- a/source/blender/blenfont/intern/blf_dir.c +++ b/source/blender/blenfont/intern/blf_dir.c @@ -25,8 +25,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#if 0 - #include #include #include @@ -167,5 +165,3 @@ int blf_dir_split(const char *str, char *file, int *size) } return(0); } - -#endif /* zero!! */ diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 8c7ec7a480f..42043a58781 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -48,6 +48,7 @@ #include "BLI_string.h" #include "blf_internal_types.h" +#include "blf_internal.h" /* freetype2 handle. */ diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index bea49ccb387..ca8751a8746 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -48,22 +48,9 @@ #include "BLI_string.h" #include "blf_internal_types.h" +#include "blf_internal.h" -unsigned int blf_glyph_hash(unsigned int val) -{ - unsigned int key; - - key= val; - key += ~(key << 16); - key ^= (key >> 5); - key += (key << 3); - key ^= (key >> 13); - key += ~(key << 9); - key ^= (key >> 17); - return(key % 257); -} - GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi) { GlyphCacheBLF *p; @@ -169,7 +156,7 @@ GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, FT_UInt idx) GlyphBLF *p; unsigned int key; - key= blf_glyph_hash(idx); + key= blf_hash(idx); p= gc->bucket[key].first; while (p) { if (p->index == idx) @@ -260,9 +247,37 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c) g->uv[1][0]= ((float)(g->xoff + g->width)) / ((float)g->p2_width); g->uv[1][1]= ((float)(g->yoff + g->height)) / ((float)g->p2_height); - key= blf_glyph_hash(g->index); + /* update the x offset for the next glyph. */ + gc->x_offs += (int)(g->box.xmax - g->box.xmin + gc->pad); + + key= blf_hash(g->index); BLI_addhead(&gc->bucket[key], g); return(g); } +void blf_glyph_render(GlyphBLF *g, float x, float y) +{ + GLint cur_tex; + float dx; + + glGetIntegerv(GL_TEXTURE_2D_BINDING_EXT, &cur_tex); + if (cur_tex != g->tex) + glBindTexture(GL_TEXTURE_2D, &g->tex); + + dx= floor(x + g->pos_x); + glBegin(GL_QUADS); + glTexCoord2f(g->uv[0][0], g->uv[0][1]); + glVertex2f(dx, y + g->pos_y); + + glTexCoord2f(g->uv[0][0], g->uv[1][1]); + glVertex2f(dx, y + g->pos_y - g->height); + + glTexCoord2f(g->uv[1][0], g->uv[1][1]); + glVertex2f(dx + g->width, y + g->pos_y - g->height); + + glTexCoord2f(g->uv[1][0], g->uv[0][1]); + glVertex2f(dx + g->width, y + g->pos_y); + glEnd(); +} + #endif /* zero!! */ diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h index b88c83e4b13..8af94a8fb99 100644 --- a/source/blender/blenfont/intern/blf_internal.h +++ b/source/blender/blenfont/intern/blf_internal.h @@ -28,11 +28,11 @@ #ifndef BLF_INTERNAL_H #define BLF_INTERNAL_H -#if 0 +unsigned int blf_next_p2(unsigned int x); +unsigned int blf_hash(unsigned int val); +int blf_utf8_next(unsigned char *buf, int *iindex); char *blf_dir_search(const char *file); int blf_dir_split(const char *str, char *file, int *size); -#endif /* zero! */ - #endif /* BLF_INTERNAL_H */ diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h index b9ae9dfdac7..396230410b2 100644 --- a/source/blender/blenfont/intern/blf_internal_types.h +++ b/source/blender/blenfont/intern/blf_internal_types.h @@ -28,8 +28,6 @@ #ifndef BLF_INTERNAL_TYPES_H #define BLF_INTERNAL_TYPES_H -#if 0 - typedef struct DirBLF { struct DirBLF *next; struct DirBLF *prev; @@ -38,6 +36,8 @@ typedef struct DirBLF { char *path; } DirBLF; +#if 0 + typedef struct _GlyphCacheBLF { struct _GlyphCacheBLF *next; struct _GlyphCacheBLF *prev; diff --git a/source/blender/blenfont/intern/blf_util.c b/source/blender/blenfont/intern/blf_util.c new file mode 100644 index 00000000000..a4ccbedc38b --- /dev/null +++ b/source/blender/blenfont/intern/blf_util.c @@ -0,0 +1,131 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include +#include + + +unsigned int blf_next_p2(unsigned int x) +{ + x -= 1; + x |= (x >> 16); + x |= (x >> 8); + x |= (x >> 4); + x |= (x >> 2); + x |= (x >> 1); + x += 1; + return(x); +} + +unsigned int blf_hash(unsigned int val) +{ + unsigned int key; + + key= val; + key += ~(key << 16); + key ^= (key >> 5); + key += (key << 3); + key ^= (key >> 13); + key += ~(key << 9); + key ^= (key >> 17); + return(key % 257); +} + +/* + * This function is from Imlib2 library (font_main.c), a + * library that does image file loading and saving as well + * as rendering, manipulation, arbitrary polygon support, etc. + * + * Copyright (C) 2000 Carsten Haitzler and various contributors + * The original name: imlib_font_utf8_get_next + * more info here: http://docs.enlightenment.org/api/imlib2/html/ + */ +int blf_utf8_next(unsigned char *buf, int *iindex) +{ + /* Reads UTF8 bytes from 'buf', starting at 'index' and + * returns the code point of the next valid code point. + * 'index' is updated ready for the next call. + * + * Returns 0 to indicate an error (e.g. invalid UTF8) + */ + int index= *iindex, r; + unsigned char d= buf[index++], d2, d3, d4; + + if (!d) + return(0); + + if (d < 0x80) { + *iindex= index; + return(d); + } + + if ((d & 0xe0) == 0xc0) { + /* 2 byte */ + d2= buf[index++]; + if ((d2 & 0xc0) != 0x80) + return(0); + r= d & 0x1f; /* copy lower 5 */ + r <<= 6; + r |= (d2 & 0x3f); /* copy lower 6 */ + } + else if ((d & 0xf0) == 0xe0) { + /* 3 byte */ + d2= buf[index++]; + d3= buf[index++]; + + if ((d2 & 0xc0) != 0x80 || (d3 & 0xc0) != 0x80) + return(0); + + r= d & 0x0f; /* copy lower 4 */ + r <<= 6; + r |= (d2 & 0x3f); + r <<= 6; + r |= (d3 & 0x3f); + } + else { + /* 4 byte */ + d2= buf[index++]; + d3= buf[index++]; + d4= buf[index++]; + + if ((d2 & 0xc0) != 0x80 || (d3 & 0xc0) != 0x80 || + (d4 & 0xc0) != 0x80) + return(0); + + r= d & 0x0f; /* copy lower 4 */ + r <<= 6; + r |= (d2 & 0x3f); + r <<= 6; + r |= (d3 & 0x3f); + r <<= 6; + r |= (d4 & 0x3f); + } + *iindex= index; + return(r); +} From 7e1e4dbb13621bdf3d0ea735bdc15ee35c7f09de Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 10 Feb 2009 22:45:20 +0000 Subject: [PATCH 39/63] Setting svn-property 'eol-style' to 'native' for all animation-related files. No more need to do save overs in text editors or with fancy UNIX tools. --- source/blender/editors/object/object_edit.c | 45 ++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index fc64b707e16..42a4dc0e0de 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -477,6 +477,49 @@ void OBJECT_OT_curve_add(wmOperatorType *ot) } +static int object_add_armature_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + bArmature *arm; + EditBone *ebone; + int newob= 0; + + if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) { + object_add_type(C, OB_ARMATURE); + ED_object_enter_editmode(C, 0); + newob = 1; + } + else DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + + //nu= addNurbprim(C, RNA_enum_get(op->ptr, "type"), newob); + //editnurb= curve_get_editcurve(CTX_data_edit_object(C)); + //BLI_addtail(editnurb, nu); + + /* userdef */ + if (newob && (U.flag & USER_ADD_EDITMODE)==0) { + ED_object_exit_editmode(C, EM_FREEDATA); + } + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_armature_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Armature"; + ot->idname= "OBJECT_OT_armature_add"; + + /* api callbacks */ + ot->exec= object_add_armature_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + + static int object_add_primitive_invoke(bContext *C, wmOperator *op, wmEvent *event) { uiMenuItem *head= uiPupMenuBegin("Add Object", 0); @@ -488,7 +531,7 @@ static int object_add_primitive_invoke(bContext *C, wmOperator *op, wmEvent *eve uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_CAMERA); uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_LAMP); uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_EMPTY); - uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_ARMATURE); + uiMenuItemEnumO(head, 0, "OBJECT_OT_armature_add", "type", OB_ARMATURE); uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_LATTICE); uiPupMenuEnd(C, head); From 1195c22207c452f1d6d974c8043d533ab8f41402 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 10 Feb 2009 23:08:53 +0000 Subject: [PATCH 40/63] DopeSheet/Action Editor: Fixed display and expand-widget of 'Group' channels --- source/blender/editors/animation/anim_channels.c | 2 +- source/blender/editors/space_action/action_draw.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/animation/anim_channels.c b/source/blender/editors/animation/anim_channels.c index c0025a1b0f5..9759d0905b6 100644 --- a/source/blender/editors/animation/anim_channels.c +++ b/source/blender/editors/animation/anim_channels.c @@ -1136,7 +1136,7 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s case ANIMTYPE_GROUP: { bActionGroup *agrp= (bActionGroup *)ale->data; - short offset= (ac->datatype == ANIMCONT_DOPESHEET)? 18 : 0; + short offset= (ELEM3(ac->datatype, ANIMCONT_DOPESHEET, ANIMCONT_FCURVES, ANIMCONT_DRIVERS))? 18 : 0; if ((x < (offset+17)) && (agrp->channels.first)) { /* toggle expand */ diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 4fb0690572e..9b3852e63bf 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -594,7 +594,7 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) indent= 0; special= -1; - offset= (ale->id) ? 16 : 0; + offset= (ac->datatype == ANIMCONT_DOPESHEET) ? 16 : 0; /* only show expand if there are any channels */ if (agrp->channels.first) { From b77da4893dc18adf981f158d52842f0c6d81498e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 10 Feb 2009 23:17:58 +0000 Subject: [PATCH 41/63] 2.5: Image window operators, quite a few of these still have missing parts and are work in progress. Set 3D Cursor Set Tile Sample Color New Open Replace Reload Save (As) Save Sequence Pack Unpack Record Composite The file select operators have context issues still. They need to get the image space in the context on exec() but it's not there currently, not sure how to solve that yet. Also added name parameter to uiMenuItemEnumO, and fixed "mute" argument in ED_update_for_newframe calls in fluidsim bake. --- .../blender/editors/armature/editarmature.c | 4 +- source/blender/editors/include/ED_image.h | 2 +- source/blender/editors/include/UI_interface.h | 2 +- .../editors/interface/interface_regions.c | 10 +- source/blender/editors/object/object_edit.c | 28 +- source/blender/editors/physics/ed_fluidsim.c | 10 +- .../blender/editors/space_image/image_draw.c | 38 +- .../editors/space_image/image_header.c | 139 +- .../editors/space_image/image_intern.h | 14 + .../blender/editors/space_image/image_ops.c | 1274 +++++++++++------ .../blender/editors/space_image/space_image.c | 37 +- .../editors/space_view3d/view3d_header.c | 14 +- .../transform/transform_orientations.c | 8 +- source/blender/editors/uvedit/uvedit_ops.c | 121 ++ source/blender/makesrna/intern/rna_space.c | 15 +- 15 files changed, 1084 insertions(+), 632 deletions(-) diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index b45390683b5..6262642f7f9 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3429,11 +3429,11 @@ static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *even } CTX_DATA_END; - uiMenuItemEnumO(head, 0, "ARMATURE_OT_set_parent", "type", ARM_PAR_CONNECT); + uiMenuItemEnumO(head, "", 0, "ARMATURE_OT_set_parent", "type", ARM_PAR_CONNECT); /* ob becomes parent, make the associated menus */ if (allchildbones) - uiMenuItemEnumO(head, 0, "ARMATURE_OT_set_parent", "type", ARM_PAR_OFFSET); + uiMenuItemEnumO(head, "", 0, "ARMATURE_OT_set_parent", "type", ARM_PAR_OFFSET); uiPupMenuEnd(C, head); diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h index f015001c0d5..99a8a02e7cf 100644 --- a/source/blender/editors/include/ED_image.h +++ b/source/blender/editors/include/ED_image.h @@ -33,7 +33,7 @@ struct bContext; /* space_image.c, exported for transform */ struct Image *ED_space_image(struct SpaceImage *sima); -void ED_space_image_set(struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima); +void ED_space_image_set(struct bContext *C, struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima); struct ImBuf *ED_space_image_buffer(struct SpaceImage *sima); void ED_space_image_size(struct SpaceImage *sima, int *width, int *height); diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index f516d953bc5..ab35089549b 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -212,7 +212,7 @@ void uiMenuContext(uiMenuItem *head, int opcontext); void uiMenuItemVal(uiMenuItem *head, const char *name, int icon, int argval); -void uiMenuItemEnumO(uiMenuItem *head, int icon, char *opname, char *propname, int value); +void uiMenuItemEnumO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value); void uiMenuItemBooleanO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value); void uiMenuItemsEnumO(uiMenuItem *head, char *opname, char *propname); void uiMenuItemIntO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value); diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 1eb4588ac0b..7830ec0e707 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -2009,9 +2009,9 @@ void uiMenuItemO(uiMenuItem *head, int icon, char *opname) } /* single operator item with property */ -void uiMenuItemEnumO(uiMenuItem *head, int icon, char *opname, char *propname, int value) +void uiMenuItemEnumO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value) { - uiMenuItem *item= ui_menu_add_item(head, "", icon, 0); + uiMenuItem *item= ui_menu_add_item(head, name, icon, 0); item->opname= opname; // static! item->propname= propname; // static! @@ -2072,7 +2072,7 @@ void uiMenuItemsEnumO(uiMenuItem *head, char *opname, char *propname) RNA_property_enum_items(&ptr, prop, &item, &totitem); for (i=0; iopname= opname; // static! item->propname= propname; // static! - - BLI_addtail(&head->items, item); } /* make a new level from enum properties */ @@ -2153,8 +2151,6 @@ void uiMenuLevelEnumR(uiMenuItem *head, PointerRNA *ptr, char *propname) item->rnapoin= *ptr; item->propname= propname; // static! - - BLI_addtail(&head->items, item); } /* separator */ diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 42a4dc0e0de..56281a288d0 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -526,13 +526,13 @@ static int object_add_primitive_invoke(bContext *C, wmOperator *op, wmEvent *eve uiMenuLevelEnumO(head, "OBJECT_OT_mesh_add", "type"); uiMenuLevelEnumO(head, "OBJECT_OT_curve_add", "type"); - uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_SURF); - uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_MBALL); - uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_CAMERA); - uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_LAMP); - uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_EMPTY); - uiMenuItemEnumO(head, 0, "OBJECT_OT_armature_add", "type", OB_ARMATURE); - uiMenuItemEnumO(head, 0, "OBJECT_OT_object_add", "type", OB_LATTICE); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_SURF); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_MBALL); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_CAMERA); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_LAMP); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_EMPTY); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_armature_add", "type", OB_ARMATURE); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_LATTICE); uiPupMenuEnd(C, head); @@ -2448,20 +2448,20 @@ static int make_parent_invoke(bContext *C, wmOperator *op, wmEvent *event) uiMenuItem *head= uiPupMenuBegin("Make Parent To", 0); uiMenuContext(head, WM_OP_EXEC_DEFAULT); - uiMenuItemEnumO(head, 0, "OBJECT_OT_make_parent", "type", PAR_OBJECT); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_make_parent", "type", PAR_OBJECT); /* ob becomes parent, make the associated menus */ if(ob->type==OB_ARMATURE) { - uiMenuItemEnumO(head, 0, "OBJECT_OT_make_parent", "type", PAR_ARMATURE); - uiMenuItemEnumO(head, 0, "OBJECT_OT_make_parent", "type", PAR_BONE); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_make_parent", "type", PAR_ARMATURE); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_make_parent", "type", PAR_BONE); } else if(ob->type==OB_CURVE) { - uiMenuItemEnumO(head, 0, "OBJECT_OT_make_parent", "type", PAR_CURVE); - uiMenuItemEnumO(head, 0, "OBJECT_OT_make_parent", "type", PAR_FOLLOW); - uiMenuItemEnumO(head, 0, "OBJECT_OT_make_parent", "type", PAR_PATH_CONST); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_make_parent", "type", PAR_CURVE); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_make_parent", "type", PAR_FOLLOW); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_make_parent", "type", PAR_PATH_CONST); } else if(ob->type == OB_LATTICE) { - uiMenuItemEnumO(head, 0, "OBJECT_OT_make_parent", "type", PAR_LATTICE); + uiMenuItemEnumO(head, "", 0, "OBJECT_OT_make_parent", "type", PAR_LATTICE); } uiPupMenuEnd(C, head); diff --git a/source/blender/editors/physics/ed_fluidsim.c b/source/blender/editors/physics/ed_fluidsim.c index 1675313205b..5f84989be54 100644 --- a/source/blender/editors/physics/ed_fluidsim.c +++ b/source/blender/editors/physics/ed_fluidsim.c @@ -262,7 +262,7 @@ static void fluidsimInitMeshChannel(bContext *C, float **setchannel, int size, O float *verts=NULL; int *tris=NULL; scene->r.cfra = frame; - ED_update_for_newframe(C, 0); + ED_update_for_newframe(C, 1); initElbeemMesh(scene, obm, &numVerts, &verts, &numTris, &tris, 1, modifierIndex); //fprintf(stderr,"\nfluidsimInitMeshChannel frame%d verts%d/%d \n\n",frame,vertices,numVerts); @@ -596,7 +596,7 @@ void fluidsimBake(bContext *C, struct Object *ob) // CHECK more reasonable to number frames according to blender? // dump data for frame 0 scene->r.cfra = startFrame; - ED_update_for_newframe(C, 0); + ED_update_for_newframe(C, 1); // init common export vars for both file export and run for(i=0; i<256; i++) { @@ -985,7 +985,7 @@ void fluidsimBake(bContext *C, struct Object *ob) fsmesh.channelSizeVertices = allchannelSize; fluidsimInitMeshChannel(C, &fsmesh.channelVertices, allchannelSize, obit, numVerts, timeAtFrame, modifierIndex); scene->r.cfra = startFrame; - ED_update_for_newframe(C, 0); + ED_update_for_newframe(C, 1); // remove channels fsmesh.channelTranslation = fsmesh.channelRotation = @@ -1063,7 +1063,7 @@ void fluidsimBake(bContext *C, struct Object *ob) ScrArea *sa; scene->r.cfra = startFrame+globalBakeFrame; lastRedraw = globalBakeFrame; - ED_update_for_newframe(C, 0); + ED_update_for_newframe(C, 1); sa= G.curscreen->areabase.first; while(sa) { if(sa->spacetype == SPACE_VIEW3D) { scrarea_do_windraw(sa); } @@ -1096,7 +1096,7 @@ void fluidsimBake(bContext *C, struct Object *ob) } scene->r.cfra = origFrame; - ED_update_for_newframe(C, 0); + ED_update_for_newframe(C, 1); if(!simAborted) { char fsmessage[512]; diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 42c91d7ea1b..7311821a5ef 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -158,10 +158,12 @@ static void sima_draw_render_info(SpaceImage *sima, ARegion *ar) UI_DrawString(G.fonts, str, 0); } -/*static void sima_draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf) +void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf) { char str[256]; int ofs; + + ED_region_pixelspace(ar); ofs= sprintf(str, "X: %d Y: %d ", x, y); if(cp) @@ -193,7 +195,7 @@ static void sima_draw_render_info(SpaceImage *sima, ARegion *ar) UI_RasterPos(10, 10); UI_DrawString(G.fonts, str, 0); -}*/ +} /* image drawing */ @@ -493,36 +495,6 @@ static void draw_image_buffer_repeated(SpaceImage *sima, ARegion *ar, Scene *sce /* draw uv edit */ -/* XXX this becomes draw extra? */ -#if 0 - glPixelZoom(zoomx, zoomy); - - if(sima->flag & SI_EDITTILE) { - /* create char buffer from float if needed */ - image_verify_buffer_float(sima, ibuf); - - glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); - - glPixelZoom(1.0, 1.0); - - dx= ibuf->x/sima->image->xrep; - dy= ibuf->y/sima->image->yrep; - sy= (sima->curtile / sima->image->xrep); - sx= sima->curtile - sy*sima->image->xrep; - - sx*= dx; - sy*= dy; - - calc_image_view(sima, 'p'); /* pixel */ - myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax); - - cpack(0x0); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glRects(sx, sy, sx+dx-1, sy+dy-1); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - cpack(0xFFFFFF); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glRects(sx+1, sy+1, sx+dx, sy+dy); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - } -#endif - /* draw grease pencil */ static void draw_image_grease_pencil(SpaceImage *sima, ImBuf *ibuf) @@ -653,7 +625,7 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene) what_image(sima); if(sima->image) { - image_pixel_aspect(sima->image, &xuser_asp, &yuser_asp); + ED_image_aspect(sima->image, &xuser_asp, &yuser_asp); /* UGLY hack? until now iusers worked fine... but for flipbook viewer we need this */ if(sima->image->type==IMA_TYPE_COMPOSITE) { diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index 9a6bab08238..997ba867121 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -197,12 +197,6 @@ static void do_image_imagemenu(void *arg, int event) case 2: pack_image_sima(); break; - case 4: /* Texture Painting */ - brush_check_exists(&G.scene->toolsettings->imapaint.brush); - if(sima->flag & SI_DRAWTOOL) sima->flag &= ~SI_DRAWTOOL; - else sima->flag |= SI_DRAWTOOL; - allqueue(REDRAWBUTSSHADING, 0); - break; case 5: save_as_image_sima(); break; @@ -226,28 +220,11 @@ static void do_image_imagemenu(void *arg, int event) } #endif -/* move to realtime properties panel */ -#if 0 -static void do_image_image_rtmappingmenu(void *arg, int event) -{ - switch(event) { - case 0: /* UV Co-ordinates */ - sima->image->flag &= ~IMA_REFLECT; - break; - case 1: /* Reflection */ - sima->image->flag |= IMA_REFLECT; - break; - } - - allqueue(REDRAWVIEW3D, 0); -} -#endif - static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused) { bScreen *sc= CTX_wm_screen(C); SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); - PointerRNA spaceptr; + PointerRNA spaceptr, imaptr; Image *ima; ImBuf *ibuf; int show_render; @@ -261,13 +238,13 @@ static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused) RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr); /* create menu */ - uiMenuItemO(head, 0, "IMAGE_OT_new"); // New...|Alt N - uiMenuItemO(head, 0, "IMAGE_OT_open"); // Open...|Alt O + uiMenuItemO(head, 0, "IMAGE_OT_new"); // New... + uiMenuItemO(head, 0, "IMAGE_OT_open"); // Open... if(ima) { uiMenuItemO(head, 0, "IMAGE_OT_replace"); // Replace... - uiMenuItemO(head, 0, "IMAGE_OT_reload"); // Reload...|Alt R - uiMenuItemO(head, 0, "IMAGE_OT_save"); // Save|Alt S + uiMenuItemO(head, 0, "IMAGE_OT_reload"); // Reload... + uiMenuItemO(head, 0, "IMAGE_OT_save"); // Save uiMenuItemO(head, 0, "IMAGE_OT_save_as"); // Save As... if(ima->source == IMA_SRC_SEQUENCE) uiMenuItemO(head, 0, "IMAGE_OT_save_changed"); // Save Changed Images @@ -281,12 +258,15 @@ static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused) /* only for dirty && specific image types : XXX poll? */ if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) if(ELEM(ima->source, IMA_SRC_FILE, IMA_SRC_GENERATED) && ima->type != IMA_TYPE_MULTILAYER) - uiMenuItemO(head, 0, "IMAGE_OT_pack_as_png"); // Pack Image As PNG + uiMenuItemBooleanO(head, "Pack As PNG", 0, "IMAGE_OT_pack", "as_png", 1); // Pack Image As PNG uiMenuSeparator(head); - /* XXX check state better */ uiMenuItemBooleanR(head, &spaceptr, "image_painting"); + + /* move to realtime properties panel */ + RNA_id_pointer_create(&ima->id, &imaptr); + uiMenuLevelEnumR(head, &imaptr, "mapping"); } } @@ -317,15 +297,15 @@ static void image_uvs_showhidemenu(bContext *C, uiMenuItem *head, void *arg_unus static void image_uvs_transformmenu(bContext *C, uiMenuItem *head, void *arg_unused) { - uiMenuItemEnumO(head, 0, "TFM_OT_transform", "mode", TFM_TRANSLATION); - uiMenuItemEnumO(head, 0, "TFM_OT_transform", "mode", TFM_ROTATION); - uiMenuItemEnumO(head, 0, "TFM_OT_transform", "mode", TFM_RESIZE); + uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TRANSLATION); + uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_ROTATION); + uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_RESIZE); } static void image_uvs_mirrormenu(bContext *C, uiMenuItem *head, void *arg_unused) { - uiMenuItemEnumO(head, 0, "UV_OT_mirror", "axis", 'x'); // "X Axis", M, 1 - uiMenuItemEnumO(head, 0, "UV_OT_mirror", "axis", 'y'); // "Y Axis", M, 2 + uiMenuItemEnumO(head, "", 0, "UV_OT_mirror", "axis", 'x'); // "X Axis", M, 1 + uiMenuItemEnumO(head, "", 0, "UV_OT_mirror", "axis", 'y'); // "Y Axis", M, 2 } static void image_uvs_weldalignmenu(bContext *C, uiMenuItem *head, void *arg_unused) @@ -369,26 +349,6 @@ static void image_uvs_scriptsmenu (void *args_unused) #endif /* DISABLE_PYTHON */ #endif -#if 0 -static void do_uvsmenu(bContext *C, void *arg, int event) -{ - switch(event) { - case 10: - unwrap_lscm(0); - break; - case 12: - minimize_stretch_tface_uv(); - break; - case 13: - pack_charts_tface_uv(); - break; - case 14: - average_charts_tface_uv(); - break; - } -} -#endif - static void image_uvsmenu(bContext *C, uiMenuItem *head, void *arg_unused) { bScreen *sc= CTX_wm_screen(C); @@ -490,13 +450,6 @@ static void do_image_buttons(bContext *C, void *arg, int event) } switch(event) { - case B_SIMAPIN: - allqueue (REDRAWIMAGE, 0); - break; - case B_SIMAGEHOME: - image_home(); - break; - case B_SIMABROWSE: if(sima->imanr== -2) { if(G.qual & LR_CTRLKEY) { @@ -541,14 +494,6 @@ static void do_image_buttons(bContext *C, void *arg, int event) allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWIMAGE, 0); break; - case B_SIMAGEPAINTTOOL: - if(sima->flag & SI_DRAWTOOL) - /* add new brush if none exists */ - brush_check_exists(&G.scene->toolsettings->imapaint.brush); - allqueue(REDRAWBUTSSHADING, 0); - allqueue(REDRAWIMAGE, 0); - allqueue(REDRAWVIEW3D, 0); - break; case B_SIMAPACKIMA: pack_image_sima(); @@ -770,29 +715,19 @@ static void sima_idpoin_handle(bContext *C, ID *id, int event) switch(event) { case UI_ID_BROWSE: case UI_ID_DELETE: - ED_space_image_set(sima, scene, obedit, sima->image); - - if(sima->image && sima->image->id.us==0) - sima->image->id.us= 1; - - if(obedit) - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); - - ED_area_tag_redraw(CTX_wm_area(C)); + ED_space_image_set(C, sima, scene, obedit, sima->image); ED_undo_push(C, "Assign Image UV"); break; case UI_ID_RENAME: break; case UI_ID_ADD_NEW: - /* XXX not implemented */ + WM_operator_name_call(C, "IMAGE_OT_new", WM_OP_INVOKE_REGION_WIN, NULL); break; case UI_ID_OPEN: - /* XXX not implemented */ - break; - case UI_ID_ALONE: - /* XXX not implemented */ + WM_operator_name_call(C, "IMAGE_OT_open", WM_OP_INVOKE_REGION_WIN, NULL); break; case UI_ID_PIN: + ED_area_tag_refresh(CTX_wm_area(C)); break; } } @@ -808,7 +743,7 @@ void image_header_buttons(const bContext *C, ARegion *ar) uiBlock *block; uiBut *but; PointerRNA spaceptr, uvptr, sceneptr; - int xco, yco= 3, show_uvedit, show_render, show_paint; + int xco, yco= 3, show_uvedit, show_render, show_paint, pinflag; /* retrieve state */ ima= ED_space_image(sima); @@ -861,35 +796,27 @@ void image_header_buttons(const bContext *C, ARegion *ar) /* image select */ + pinflag= (show_render)? 0: UI_ID_PIN; xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID**)&sima->image, ID_IM, &sima->pin, xco, yco, - sima_idpoin_handle, UI_ID_BROWSE|UI_ID_BROWSE_RENDER|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE|UI_ID_ALONE|UI_ID_PIN); + sima_idpoin_handle, UI_ID_BROWSE|UI_ID_BROWSE_RENDER|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE|pinflag); xco += 8; -#if 0 - char naam[256]; - - /* This should not be a static var */ - static int headerbuttons_packdummy; - - headerbuttons_packdummy = 0; - - int allow_pin= (show_render)? 0: B_SIMAPIN; - - xco= 8 + std_libbuttons(block, xco, yco, allow_pin, &sima->pin, B_SIMABROWSE, ID_IM, 0, (ID *)ima, 0, &(sima->imanr), 0, 0, B_IMAGEDELETE, 0, 0); - if(ima && !ELEM3(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE, IMA_SRC_VIEWER) && ima->ok) { + /* XXX this should not be a static var */ + static int headerbuttons_packdummy; + + headerbuttons_packdummy = 0; if (ima->packedfile) { headerbuttons_packdummy = 1; } if (ima->packedfile && ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) - uiDefIconButBitI(block, TOG, 1, B_SIMA_REPACK, ICON_UGLYPACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Re-Pack this image as PNG"); + uiDefIconButBitI(block, TOG, 1, 0 /* XXX B_SIMA_REPACK */, ICON_UGLYPACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Re-Pack this image as PNG"); else - uiDefIconButBitI(block, TOG, 1, B_SIMAPACKIMA, ICON_PACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this image"); + uiDefIconButBitI(block, TOG, 1, 0 /* XXX B_SIMAPACKIMA */, ICON_PACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this image"); xco+= XIC+8; } -#endif /* uv editing */ if(show_uvedit) { @@ -955,7 +882,7 @@ void image_header_buttons(const bContext *C, ARegion *ar) } uiBlockEndAlign(block); - xco+= 10; + xco+= 8; /* uv layers */ { @@ -968,14 +895,14 @@ void image_header_buttons(const bContext *C, ARegion *ar) but = uiDefButI(block, MENU, B_NOP, menustr ,xco,yco,85,YIC, &act, 0, 0, 0, 0, "Active UV Layer for editing."); // uiButSetFunc(but, do_image_buttons_set_uvlayer_callback, &act, NULL); - xco+= 90; + xco+= 85; } + + xco+= 8; } if(ima) { RenderResult *rr; - - xco+= 8; /* render layers and passes */ rr= BKE_image_get_renderresult(scene, ima); @@ -1013,7 +940,7 @@ void image_header_buttons(const bContext *C, ARegion *ar) /* record & play */ uiBlockBeginAlign(block); if(ima->type==IMA_TYPE_COMPOSITE) { -//XXX uiDefIconButO(block, BUT, "IMAGE_OT_record_composite", WM_OP_INVOKE_REGION_WIN, ICON_REC, xco, yco, XIC, YIC, NULL); // Record Composite + uiDefIconButO(block, BUT, "IMAGE_OT_record_composite", WM_OP_INVOKE_REGION_WIN, ICON_REC, xco, yco, XIC, YIC, NULL); // Record Composite xco+= XIC; } if((ima->type==IMA_TYPE_COMPOSITE) || ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) { diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h index bbf0ed792c0..384689bb000 100644 --- a/source/blender/editors/space_image/image_intern.h +++ b/source/blender/editors/space_image/image_intern.h @@ -46,6 +46,7 @@ void IMAGE_OT_toolbox(struct wmOperatorType *ot); /* image_draw.c */ void draw_image_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene); +void draw_image_info(struct ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf); /* image_ops.c */ int space_image_main_area_poll(struct bContext *C); @@ -58,6 +59,19 @@ void IMAGE_OT_view_zoom_in(struct wmOperatorType *ot); void IMAGE_OT_view_zoom_out(struct wmOperatorType *ot); void IMAGE_OT_view_zoom_ratio(struct wmOperatorType *ot); +void IMAGE_OT_new(struct wmOperatorType *ot); +void IMAGE_OT_open(struct wmOperatorType *ot); +void IMAGE_OT_replace(struct wmOperatorType *ot); +void IMAGE_OT_reload(struct wmOperatorType *ot); +void IMAGE_OT_save(struct wmOperatorType *ot); +void IMAGE_OT_save_as(struct wmOperatorType *ot); +void IMAGE_OT_save_sequence(struct wmOperatorType *ot); +void IMAGE_OT_pack(struct wmOperatorType *ot); +void IMAGE_OT_unpack(struct wmOperatorType *ot); +void IMAGE_OT_sample(struct wmOperatorType *ot); + +void IMAGE_OT_record_composite(struct wmOperatorType *ot); + /* uvedit_draw.c */ void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index afda954b074..6ad1207f7cd 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -47,6 +47,7 @@ #include "BKE_library.h" #include "BKE_node.h" #include "BKE_packedFile.h" +#include "BKE_report.h" #include "BKE_screen.h" #include "BLI_arithb.h" @@ -62,58 +63,18 @@ #include "RNA_types.h" #include "ED_image.h" +#include "ED_fileselect.h" #include "ED_screen.h" +#include "ED_space_api.h" #include "ED_uvedit.h" +#include "UI_view2d.h" + #include "WM_api.h" #include "WM_types.h" #include "image_intern.h" -void imagespace_composite_flipbook(SpaceImage *sima, Scene *scene) -{ - ImBuf *ibuf; - int cfrao= scene->r.cfra; - int sfra, efra; - - if(sima->iuser.frames<2) - return; - if(scene->nodetree==NULL) - return; - - sfra= sima->iuser.sfra; - efra= sima->iuser.sfra + sima->iuser.frames-1; - scene->nodetree->test_break= NULL; // XXX blender_test_break; - - for(scene->r.cfra=sfra; scene->r.cfra<=efra; scene->r.cfra++) { - - // XXX set_timecursor(CFRA); - - BKE_image_all_free_anim_ibufs(CFRA); - ntreeCompositTagAnimated(scene->nodetree); - ntreeCompositExecTree(scene->nodetree, &scene->r, scene->r.cfra!=cfrao); /* 1 is no previews */ - - // XXX force_draw(0); - - ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser); - /* save memory in flipbooks */ - if(ibuf) - imb_freerectfloatImBuf(ibuf); - - // XXX if(blender_test_break()) - // XXX break; - } - scene->nodetree->test_break= NULL; - // XXX waitcursor(0); - - // XXX play_anim(0); - - // XXX allqueue(REDRAWNODE, 1); - // XXX allqueue(REDRAWIMAGE, 1); - - scene->r.cfra= cfrao; -} - /******************** view navigation utilities *********************/ static void sima_zoom_set(SpaceImage *sima, ARegion *ar, float zoom) @@ -145,6 +106,13 @@ static void sima_zoom_set_factor(SpaceImage *sima, ARegion *ar, float zoomfac) sima_zoom_set(sima, ar, sima->zoom*zoomfac); } +int space_image_poll(bContext *C) +{ + SpaceLink *slink= CTX_wm_space_data(C); + + return (slink && (slink->spacetype == SPACE_IMAGE)); +} + int space_image_main_area_poll(bContext *C) { SpaceLink *slink= CTX_wm_space_data(C); @@ -268,9 +236,6 @@ void IMAGE_OT_view_pan(wmOperatorType *ot) ot->cancel= view_pan_cancel; ot->poll= space_image_main_area_poll; - /* flags */ - ot->flag= OPTYPE_REGISTER; - /* properties */ RNA_def_float_vector(ot->srna, "offset", 2, NULL, -FLT_MAX, FLT_MAX, "Offset", "Offset in floating point units, 1.0 is the width and height of the image.", -FLT_MAX, FLT_MAX); @@ -383,9 +348,6 @@ void IMAGE_OT_view_zoom(wmOperatorType *ot) ot->cancel= view_zoom_cancel; ot->poll= space_image_main_area_poll; - /* flags */ - ot->flag= OPTYPE_REGISTER; - /* properties */ RNA_def_float(ot->srna, "factor", 0.0f, 0.0f, FLT_MAX, "Factor", "Zoom factor, values higher than 1.0 zoom in, lower values zoom out.", -FLT_MAX, FLT_MAX); @@ -451,9 +413,6 @@ void IMAGE_OT_view_all(wmOperatorType *ot) /* api callbacks */ ot->exec= view_all_exec; ot->poll= space_image_main_area_poll; - - /* flags */ - ot->flag= OPTYPE_REGISTER; } /********************** view selected operator *********************/ @@ -508,9 +467,6 @@ void IMAGE_OT_view_selected(wmOperatorType *ot) /* api callbacks */ ot->exec= view_selected_exec; ot->poll= ED_operator_uvedit; - - /* flags */ - ot->flag= OPTYPE_REGISTER; } /********************** view zoom in/out operator *********************/ @@ -536,9 +492,6 @@ void IMAGE_OT_view_zoom_in(wmOperatorType *ot) /* api callbacks */ ot->exec= view_zoom_in_exec; ot->poll= space_image_main_area_poll; - - /* flags */ - ot->flag= OPTYPE_REGISTER; } static int view_zoom_out_exec(bContext *C, wmOperator *op) @@ -562,9 +515,6 @@ void IMAGE_OT_view_zoom_out(wmOperatorType *ot) /* api callbacks */ ot->exec= view_zoom_out_exec; ot->poll= space_image_main_area_poll; - - /* flags */ - ot->flag= OPTYPE_REGISTER; } /********************** view zoom ratio operator *********************/ @@ -604,42 +554,165 @@ void IMAGE_OT_view_zoom_ratio(wmOperatorType *ot) ot->exec= view_zoom_ratio_exec; ot->poll= space_image_main_area_poll; - /* flags */ - ot->flag= OPTYPE_REGISTER; - /* properties */ RNA_def_float(ot->srna, "ratio", 0.0f, 0.0f, FLT_MAX, "Ratio", "Zoom ratio, 1.0 is 1:1, higher is zoomed in, lower is zoomed out.", -FLT_MAX, FLT_MAX); } -/* Image functions */ +/**************** load/replace/save callbacks ******************/ -#if 0 -static void load_image_filesel(SpaceImage *sima, Scene *scene, Object *obedit, char *str) /* called from fileselect */ +static char *filesel_imagetype_string(Image *ima) { - Image *ima= NULL; - - ima= BKE_add_image_file(str, scene->r.cfra); - if(ima) { - BKE_image_signal(ima, &sima->iuser, IMA_SIGNAL_RELOAD); - ED_space_image_set(sima, scene, obedit, ima); - } - // XXX BIF_undo_push("Load image UV"); - // XXX allqueue(REDRAWIMAGE, 0); -} - -static void replace_image_filesel(SpaceImage *sima, char *str) /* called from fileselect */ -{ - if (!sima->image) - return; + char *strp, *str= MEM_callocN(14*32, "menu for filesel"); - BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */ - BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); - // XXX BIF_undo_push("Replace image UV"); - // XXX allqueue(REDRAWIMAGE, 0); - // XXX allqueue(REDRAWVIEW3D, 0); + strp= str; + str += sprintf(str, "Save Image as: %%t|"); + str += sprintf(str, "Targa %%x%d|", R_TARGA); + str += sprintf(str, "Targa Raw %%x%d|", R_RAWTGA); + str += sprintf(str, "PNG %%x%d|", R_PNG); + str += sprintf(str, "BMP %%x%d|", R_BMP); + str += sprintf(str, "Jpeg %%x%d|", R_JPEG90); + str += sprintf(str, "Iris %%x%d|", R_IRIS); + if(G.have_libtiff) + str += sprintf(str, "Tiff %%x%d|", R_TIFF); + str += sprintf(str, "Radiance HDR %%x%d|", R_RADHDR); + str += sprintf(str, "Cineon %%x%d|", R_CINEON); + str += sprintf(str, "DPX %%x%d|", R_DPX); +#ifdef WITH_OPENEXR + str += sprintf(str, "OpenEXR %%x%d|", R_OPENEXR); + /* saving sequences of multilayer won't work, they copy buffers */ + if(ima->source==IMA_SRC_SEQUENCE && ima->type==IMA_TYPE_MULTILAYER); + else str += sprintf(str, "MultiLayer %%x%d|", R_MULTILAYER); +#endif + return strp; } -#endif + +static void image_filesel(bContext *C, wmOperator *op, const char *path) +{ + SpaceFile *sfile; + + ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_FILE); + + /* settings for filebrowser */ + sfile= (SpaceFile*)CTX_wm_space_data(C); + sfile->op= op; + + /* XXX right params for image filter browse, filters, .. */ + ED_fileselect_set_params(sfile, FILE_SPECIAL, op->type->name, path, 0, 0, 0); +} + +/******************** open image operator ********************/ + +static int open_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + Image *ima= NULL; + char *str; + + str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0); + ima= BKE_add_image_file(str, scene->r.cfra); + MEM_freeN(str); + + if(!ima) + return OPERATOR_CANCELLED; + + return OPERATOR_FINISHED; // XXX context not correct! + + BKE_image_signal(ima, &sima->iuser, IMA_SIGNAL_RELOAD); + ED_space_image_set(C, sima, scene, obedit, ima); + + return OPERATOR_FINISHED; +} + +static int open_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + char *path= (sima->image)? sima->image->name: U.textudir; + + if(RNA_property_is_set(op->ptr, "filename")) + return open_exec(C, op); + + image_filesel(C, op, path); + + return OPERATOR_RUNNING_MODAL; +} + +void IMAGE_OT_open(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Open"; + ot->idname= "IMAGE_OT_open"; + + /* api callbacks */ + ot->exec= open_exec; + ot->invoke= open_invoke; + ot->poll= space_image_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of image to open."); +} + +/******************** replace image operator ********************/ + +static int replace_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + char *str; + + return OPERATOR_CANCELLED; // XXX context not correct! + + if(!sima->image) + return OPERATOR_CANCELLED; + + str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0); + BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */ + MEM_freeN(str); + + BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); + + return OPERATOR_FINISHED; +} + +static int replace_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + char *path= (sima->image)? sima->image->name: U.textudir; + + if(!sima->image) + return OPERATOR_CANCELLED; + + if(RNA_property_is_set(op->ptr, "filename")) + return replace_exec(C, op); + + image_filesel(C, op, path); + + return OPERATOR_RUNNING_MODAL; +} + +void IMAGE_OT_replace(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Replace"; + ot->idname= "IMAGE_OT_replace"; + + /* api callbacks */ + ot->exec= replace_exec; + ot->invoke= replace_invoke; + ot->poll= space_image_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of image to replace current image with."); +} + +/******************** save image as operator ********************/ static void save_image_doit(SpaceImage *sima, Scene *scene, char *name) { @@ -660,7 +733,7 @@ static void save_image_doit(SpaceImage *sima, Scene *scene, char *name) BKE_add_image_extension(scene, name, sima->imtypenr); } - if (1) { // XXX saveover(str)) { + if(1) { // XXX saveover(str)) { /* enforce user setting for RGB or RGBA, but skip BW */ if(scene->r.planes==32) @@ -668,7 +741,8 @@ static void save_image_doit(SpaceImage *sima, Scene *scene, char *name) else if(scene->r.planes==24) ibuf->depth= 24; - // XXX waitcursor(1); + WM_cursor_wait(1); + if(sima->imtypenr==R_MULTILAYER) { RenderResult *rr= BKE_image_get_renderresult(scene, ima); if(rr) { @@ -710,133 +784,152 @@ static void save_image_doit(SpaceImage *sima, Scene *scene, char *name) // XXX allqueue(REDRAWHEADERS, 0); // XXX allqueue(REDRAWBUTSSHADING, 0); - // XXX waitcursor(0); + WM_cursor_wait(0); } } } -void open_image_sima(SpaceImage *sima, short imageselect) +static int save_as_exec(bContext *C, wmOperator *op) { - char name[FILE_MAXDIR+FILE_MAXFILE]; + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Scene *scene= CTX_data_scene(C); + //Image *ima = ED_space_image(sima); + char *str; - if(sima->image) - BLI_strncpy(name, sima->image->name, sizeof(name)); - else - BLI_strncpy(name, U.textudir, sizeof(name)); + return OPERATOR_CANCELLED; // XXX context not correct! - if(imageselect) - ; // XXX activate_imageselect(FILE_SPECIAL, "Open Image", name, load_image_filesel); - else - ; // XXX activate_fileselect(FILE_SPECIAL, "Open Image", name, load_image_filesel); + /*if(!ima) + return OPERATOR_CANCELLED;*/ + + str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0); + save_image_doit(sima, scene, str); + MEM_freeN(str); + + return OPERATOR_FINISHED; } -void replace_image_sima(SpaceImage *sima, short imageselect) -{ - char name[FILE_MAXDIR+FILE_MAXFILE]; - - if(sima->image) - BLI_strncpy(name, sima->image->name, sizeof(name)); - else - BLI_strncpy(name, U.textudir, sizeof(name)); - - if(imageselect) - ; // XXX activate_imageselect(FILE_SPECIAL, "Replace Image", name, replace_image_filesel); - else - ; // XXX activate_fileselect(FILE_SPECIAL, "Replace Image", name, replace_image_filesel); -} - - -static char *filesel_imagetype_string(Image *ima) -{ - char *strp, *str= MEM_callocN(14*32, "menu for filesel"); - - strp= str; - str += sprintf(str, "Save Image as: %%t|"); - str += sprintf(str, "Targa %%x%d|", R_TARGA); - str += sprintf(str, "Targa Raw %%x%d|", R_RAWTGA); - str += sprintf(str, "PNG %%x%d|", R_PNG); - str += sprintf(str, "BMP %%x%d|", R_BMP); - str += sprintf(str, "Jpeg %%x%d|", R_JPEG90); - str += sprintf(str, "Iris %%x%d|", R_IRIS); - if(G.have_libtiff) - str += sprintf(str, "Tiff %%x%d|", R_TIFF); - str += sprintf(str, "Radiance HDR %%x%d|", R_RADHDR); - str += sprintf(str, "Cineon %%x%d|", R_CINEON); - str += sprintf(str, "DPX %%x%d|", R_DPX); -#ifdef WITH_OPENEXR - str += sprintf(str, "OpenEXR %%x%d|", R_OPENEXR); - /* saving sequences of multilayer won't work, they copy buffers */ - if(ima->source==IMA_SRC_SEQUENCE && ima->type==IMA_TYPE_MULTILAYER); - else str += sprintf(str, "MultiLayer %%x%d|", R_MULTILAYER); -#endif - return strp; -} - -/* always opens fileselect */ -void save_as_image_sima(SpaceImage *sima, Scene *scene) -{ - Image *ima = sima->image; - ImBuf *ibuf= ED_space_image_buffer(sima); - char name[FILE_MAXDIR+FILE_MAXFILE]; - - if (ima) { - strcpy(name, ima->name); - - if (ibuf) { - char *strp; - - strp= filesel_imagetype_string(ima); - - /* cant save multilayer sequence, ima->rr isn't valid for a specific frame */ - if(ima->rr && !(ima->source==IMA_SRC_SEQUENCE && ima->type==IMA_TYPE_MULTILAYER)) - sima->imtypenr= R_MULTILAYER; - else if(ima->type==IMA_TYPE_R_RESULT) - sima->imtypenr= scene->r.imtype; - else sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); - - // XXX activate_fileselect_menu(FILE_SPECIAL, "Save Image", name, strp, &sima->imtypenr, save_image_doit); - } - } -} - -/* if exists, saves over without fileselect */ -void save_image_sima(SpaceImage *sima, Scene *scene) +static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) { + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); Image *ima = ED_space_image(sima); ImBuf *ibuf= ED_space_image_buffer(sima); - char name[FILE_MAXDIR+FILE_MAXFILE]; + Scene *scene= CTX_data_scene(C); - if (ima) { - strcpy(name, ima->name); + if(RNA_property_is_set(op->ptr, "filename")) + return save_as_exec(C, op); + + if(!ima) + return OPERATOR_CANCELLED; - if (ibuf) { - if (BLI_exists(ibuf->name)) { - if(BKE_image_get_renderresult(scene, ima)) - sima->imtypenr= R_MULTILAYER; - else - sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); - - save_image_doit(sima, scene, ibuf->name); - } - else - save_as_image_sima(sima, scene); - } + /* always opens fileselect */ + if(ibuf) { + char *strp; + + strp= filesel_imagetype_string(ima); + + /* cant save multilayer sequence, ima->rr isn't valid for a specific frame */ + if(ima->rr && !(ima->source==IMA_SRC_SEQUENCE && ima->type==IMA_TYPE_MULTILAYER)) + sima->imtypenr= R_MULTILAYER; + else if(ima->type==IMA_TYPE_R_RESULT) + sima->imtypenr= scene->r.imtype; + else + sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); + + // XXX activate_fileselect_menu(FILE_SPECIAL, "Save Image", name, strp, &sima->imtypenr, save_image_doit); + + image_filesel(C, op, ima->name); + + return OPERATOR_RUNNING_MODAL; } + + return OPERATOR_CANCELLED; } -void save_image_sequence_sima(SpaceImage *sima) +void IMAGE_OT_save_as(wmOperatorType *ot) { + /* identifiers */ + ot->name= "Save As"; + ot->idname= "IMAGE_OT_save_as"; + + /* api callbacks */ + ot->exec= save_as_exec; + ot->invoke= save_as_invoke; + ot->poll= space_image_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path to save image to."); +} + +/******************** save image operator ********************/ + +static int save_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Image *ima = ED_space_image(sima); + ImBuf *ibuf= ED_space_image_buffer(sima); + Scene *scene= CTX_data_scene(C); + char name[FILE_MAXDIR+FILE_MAXFILE]; + + if(!ima) + return OPERATOR_CANCELLED; + + /* if exists, saves over without fileselect */ + + strcpy(name, ima->name); + + if(ibuf) { + if(BLI_exists(ibuf->name)) { + if(BKE_image_get_renderresult(scene, ima)) + sima->imtypenr= R_MULTILAYER; + else + sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); + + save_image_doit(sima, scene, ibuf->name); + } + else + return save_as_exec(C, op); + } + + return OPERATOR_FINISHED; +} + +void IMAGE_OT_save(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Save"; + ot->idname= "IMAGE_OT_save"; + + /* api callbacks */ + ot->exec= save_exec; + ot->poll= space_image_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/******************* save sequence operator ********************/ + +static int save_sequence_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); ImBuf *ibuf; int tot= 0; char di[FILE_MAX], fi[FILE_MAX]; if(sima->image==NULL) - return; - if(sima->image->source!=IMA_SRC_SEQUENCE) - return; + return OPERATOR_CANCELLED; + + if(sima->image->source!=IMA_SRC_SEQUENCE) { + BKE_report(op->reports, RPT_ERROR, "Can only save sequence on image sequences."); + return OPERATOR_CANCELLED; + } + if(sima->image->type==IMA_TYPE_MULTILAYER) { - // XXX error("Cannot save Multilayer Sequences"); - return; + BKE_report(op->reports, RPT_ERROR, "Can't save multilayer sequences."); + return OPERATOR_CANCELLED; } /* get total */ @@ -845,9 +938,10 @@ void save_image_sequence_sima(SpaceImage *sima) tot++; if(tot==0) { - // XXX notice("No Images have been changed"); - return; + BKE_report(op->reports, RPT_WARNING, "No images have been changed."); + return OPERATOR_CANCELLED; } + /* get a filename for menu */ for(ibuf= sima->image->ibufs.first; ibuf; ibuf= ibuf->next) if(ibuf->userflags & IB_BITMAPDIRTY) @@ -857,6 +951,7 @@ void save_image_sequence_sima(SpaceImage *sima) BLI_splitdirstring(di, fi); sprintf(fi, "%d Image(s) will be saved in %s", tot, di); + if(1) { // XXX okee(fi)) { for(ibuf= sima->image->ibufs.first; ibuf; ibuf= ibuf->next) { @@ -867,7 +962,7 @@ void save_image_sequence_sima(SpaceImage *sima) BLI_convertstringcode(name, G.sce); if(0 == IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat)) { - // XXX error("Could not write image", name); + BKE_reportf(op->reports, RPT_ERROR, "Could not write image %s.", name); break; } printf("Saved: %s\n", ibuf->name); @@ -875,86 +970,555 @@ void save_image_sequence_sima(SpaceImage *sima) } } } + + return OPERATOR_FINISHED; } -void reload_image_sima(SpaceImage *sima) +void IMAGE_OT_save_sequence(wmOperatorType *ot) { - if (sima ) { - BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); - /* ED_space_image_set(sima, scene, obedit, NULL); - do we really need this? */ - } - - // XXX allqueue(REDRAWIMAGE, 0); - // XXX allqueue(REDRAWVIEW3D, 0); - // XXX BIF_preview_changed(ID_TE); -} - -void new_image_sima(SpaceImage *sima, Scene *scene, Object *obedit) -{ - static int width= 1024, height= 1024; - static short uvtestgrid= 0; - static int floatbuf=0; - static float color[] = {0, 0, 0, 1}; - char name[22]; - Image *ima; + /* identifiers */ + ot->name= "Save Sequence"; + ot->idname= "IMAGE_OT_save_sequence"; - strcpy(name, "Untitled"); + /* api callbacks */ + ot->exec= save_sequence_exec; + ot->poll= space_image_poll; -#if 0 - add_numbut(0, TEX, "Name:", 0, 21, name, NULL); - add_numbut(1, NUM|INT, "Width:", 1, 16384, &width, NULL); - add_numbut(2, NUM|INT, "Height:", 1, 16384, &height, NULL); - add_numbut(3, COL, "", 0, 0, &color, NULL); - add_numbut(4, NUM|FLO, "Alpha:", 0.0, 1.0, &color[3], NULL); - add_numbut(5, TOG|SHO, "UV Test Grid", 0, 0, &uvtestgrid, NULL); - add_numbut(6, TOG|INT, "32 bit Float", 0, 0, &floatbuf, NULL); - if (!do_clever_numbuts("New Image", 7, REDRAW)) - return; -#endif + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/******************** reload image operator ********************/ + +static int reload_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima; + + /* retrieve state */ + sima= (SpaceImage*)CTX_wm_space_data(C); + + if(!sima->image) + return OPERATOR_CANCELLED; + + BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); + /* ED_space_image_set(C, sima, scene, obedit, NULL); - do we really need this? */ + + // XXX notifier + // XXX BIF_preview_changed(ID_TE); + ED_area_tag_redraw(CTX_wm_area(C)); + + return OPERATOR_FINISHED; +} + +void IMAGE_OT_reload(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Reload"; + ot->idname= "IMAGE_OT_reload"; + + /* api callbacks */ + ot->exec= reload_exec; + ot->poll= space_image_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/********************** new image operator *********************/ + +static int new_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima; + Scene *scene; + Object *obedit; + Image *ima; + char name[22]; + float color[4]; + int width, height, floatbuf, uvtestgrid; + + /* retrieve state */ + sima= (SpaceImage*)CTX_wm_space_data(C); + scene= (Scene*)CTX_data_scene(C); + obedit= CTX_data_edit_object(C); + + RNA_string_get(op->ptr, "name", name); + width= RNA_int_get(op->ptr, "width"); + height= RNA_int_get(op->ptr, "height"); + floatbuf= RNA_boolean_get(op->ptr, "float"); + uvtestgrid= RNA_boolean_get(op->ptr, "uv_test_grid"); + RNA_float_get_array(op->ptr, "color", color); + color[3]= RNA_float_get(op->ptr, "alpha"); ima = BKE_add_image_size(width, height, name, floatbuf, uvtestgrid, color); - ED_space_image_set(sima, scene, obedit, ima); BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE); - // XXX BIF_undo_push("Add image"); - - // XXX allqueue(REDRAWIMAGE, 0); - // XXX allqueue(REDRAWVIEW3D, 0); + ED_space_image_set(C, sima, scene, obedit, ima); + + return OPERATOR_FINISHED; } -void pack_image_sima(SpaceImage *sima) +void IMAGE_OT_new(wmOperatorType *ot) { - Image *ima = sima->image; + /* identifiers */ + ot->name= "New"; + ot->idname= "IMAGE_OT_new"; + + /* api callbacks */ + ot->exec= new_exec; + ot->poll= space_image_poll; - if (ima) { - if(ima->source!=IMA_SRC_SEQUENCE && ima->source!=IMA_SRC_MOVIE) { - if (ima->packedfile) { - if (G.fileflags & G_AUTOPACK) - if (1) // XXX okee("Disable AutoPack?")) - G.fileflags &= ~G_AUTOPACK; - - if ((G.fileflags & G_AUTOPACK) == 0) { - unpackImage(ima, PF_ASK); - // XXX BIF_undo_push("Unpack image"); - } - } - else { - ImBuf *ibuf= ED_space_image_buffer(sima); - if (ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) { - if(1) // XXX okee("Can't pack painted image. Use Repack as PNG?")) - BKE_image_memorypack(ima); - } - else { - ima->packedfile = newPackedFile(ima->name); - // XXX BIF_undo_push("Pack image"); - } - } + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - // XXX allqueue(REDRAWBUTSSHADING, 0); - // XXX allqueue(REDRAWHEADERS, 0); - } - } + /* properties */ + RNA_def_string(ot->srna, "name", "Untitled", 21, "Name", "Image datablock name."); + RNA_def_int(ot->srna, "width", 1024, 1, INT_MAX, "Width", "Image width.", 1, 16384); + RNA_def_int(ot->srna, "height", 1024, 1, INT_MAX, "Height", "Image height.", 1, 16384); + RNA_def_float_color(ot->srna, "color", 3, NULL, 0.0f, FLT_MAX, "Color", "Default fill color.", 0.0f, 1.0f); + RNA_def_float(ot->srna, "alpha", 1.0f, 0.0f, 1.0f, "Alpha", "Default fill alpha.", 0.0f, 1.0f); + RNA_def_boolean(ot->srna, "uv_test_grid", 0, "UV Test Grid", "Fill the image with a grid for UV map testing."); + RNA_def_boolean(ot->srna, "float", 0, "32 bit Float", "Create image with 32 bit floating point bit depth."); } +/********************* pack operator *********************/ + +static int pack_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Image *ima= CTX_data_edit_image(C); + ImBuf *ibuf= ED_space_image_buffer(sima); + int as_png= RNA_boolean_get(op->ptr, "as_png"); + + if(!ima) + return OPERATOR_CANCELLED; + if(!as_png && ima->packedfile) + return OPERATOR_CANCELLED; + + if(ima->source==IMA_SRC_SEQUENCE || ima->source==IMA_SRC_MOVIE) { + BKE_report(op->reports, RPT_ERROR, "Can't pack movie or image sequence."); + return OPERATOR_CANCELLED; + } + + if(as_png || (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) { + if(1) // XXX okee("Can't pack painted image. Use Repack as PNG?")) + BKE_image_memorypack(ima); + } + else { + ima->packedfile = newPackedFile(ima->name); + // XXX BIF_undo_push("Pack image"); + } + + return OPERATOR_CANCELLED; +} + +void IMAGE_OT_pack(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Pack"; + ot->idname= "IMAGE_OT_pack"; + + /* api callbacks */ + ot->exec= pack_exec; + ot->poll= space_image_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_boolean(ot->srna, "as_png", 0, "Pack As PNG", "Pack image as lossless PNG."); +} + +/********************* unpack operator *********************/ + +static int unpack_exec(bContext *C, wmOperator *op) +{ + Image *ima= CTX_data_edit_image(C); + + if(!ima) + return OPERATOR_CANCELLED; + if(!ima->packedfile) + return OPERATOR_CANCELLED; + + if(ima->source==IMA_SRC_SEQUENCE || ima->source==IMA_SRC_MOVIE) { + BKE_report(op->reports, RPT_ERROR, "Can't unpack movie or image sequence."); + return OPERATOR_CANCELLED; + } + + if(G.fileflags & G_AUTOPACK) + if(1) // XXX okee("Disable AutoPack?")) + G.fileflags &= ~G_AUTOPACK; + + if((G.fileflags & G_AUTOPACK) == 0) { + unpackImage(ima, PF_ASK); + // XXX BIF_undo_push("Ununpack image"); + } + + return OPERATOR_CANCELLED; +} + +void IMAGE_OT_unpack(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Unpack"; + ot->idname= "IMAGE_OT_unpack"; + + /* api callbacks */ + ot->exec= unpack_exec; + ot->poll= space_image_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/******************** sample image operator ********************/ + +typedef struct ImageSampleInfo { + ARegionType *art; + void *draw_handle; + int x, y; + + char col[4]; + float colf[4]; + int z; + float zf; + + char *colp; + float *colfp; + int *zp; + float *zfp; + + int draw; +} ImageSampleInfo; + +static void sample_draw(const bContext *C, ARegion *ar, void *arg_info) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + ImBuf *ibuf= ED_space_image_buffer(sima); + ImageSampleInfo *info= arg_info; + + draw_image_info(ar, ibuf->channels, info->x, info->y, info->colp, + info->colfp, info->zp, info->zfp); +} + +static void sample_apply(bContext *C, wmOperator *op, wmEvent *event) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + ARegion *ar= CTX_wm_region(C); + ImBuf *ibuf= ED_space_image_buffer(sima); + ImageSampleInfo *info= op->customdata; + float fx, fy; + int x, y; + + if(ibuf == NULL) + return; + + x= event->x - ar->winrct.xmin; + y= event->y - ar->winrct.ymin; + UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy); + + if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) { + float *fp; + char *cp; + int x= (int)(fx*ibuf->x), y= (int)(fy*ibuf->y); + + CLAMP(x, 0, ibuf->x-1); + CLAMP(y, 0, ibuf->y-1); + + info->x= x; + info->y= y; + info->draw= 1; + + info->colp= NULL; + info->colfp= NULL; + info->zp= NULL; + info->zfp= NULL; + + if(ibuf->rect) { + cp= (char *)(ibuf->rect + y*ibuf->x + x); + + info->col[0]= cp[0]; + info->col[1]= cp[1]; + info->col[2]= cp[2]; + info->col[3]= cp[3]; + info->colp= info->col; + + info->colf[0]= (float)cp[0]/255.0f; + info->colf[1]= (float)cp[1]/255.0f; + info->colf[2]= (float)cp[2]/255.0f; + info->colf[3]= (float)cp[3]/255.0f; + info->colfp= info->colf; + } + if(ibuf->rect_float) { + fp= (ibuf->rect_float + (ibuf->channels)*(y*ibuf->x + x)); + + info->colf[0]= fp[0]; + info->colf[1]= fp[1]; + info->colf[2]= fp[2]; + info->colf[3]= fp[4]; + info->colfp= info->colf; + } + + if(ibuf->zbuf) { + info->z= ibuf->zbuf[y*ibuf->x + x]; + info->zp= &info->z; + } + if(ibuf->zbuf_float) { + info->zf= ibuf->zbuf_float[y*ibuf->x + x]; + info->zfp= &info->zf; + } + + // XXX set white/black point + if(sima->cumap) { + if(ibuf->channels==4) { + if(0) { // XXX G.qual & LR_CTRLKEY) { + curvemapping_set_black_white(sima->cumap, NULL, fp); + curvemapping_do_ibuf(sima->cumap, ibuf); + } + else if(0) { // XXX G.qual & LR_SHIFTKEY) { + curvemapping_set_black_white(sima->cumap, fp, NULL); + curvemapping_do_ibuf(sima->cumap, ibuf); + } + } + } + + // XXX node curve integration .. +#if 0 + { + ScrArea *sa, *cur= curarea; + + node_curvemap_sample(fp); /* sends global to node editor */ + for(sa= G.curscreen->areabase.first; sa; sa= sa->next) { + if(sa->spacetype==SPACE_NODE) { + areawinset(sa->win); + scrarea_do_windraw(sa); + } + } + node_curvemap_sample(NULL); /* clears global in node editor */ + curarea= cur; + } +#endif + } + else + info->draw= 0; + + ED_area_tag_redraw(CTX_wm_area(C)); +} + +static void sample_exit(bContext *C, wmOperator *op) +{ + ImageSampleInfo *info= op->customdata; + + ED_region_draw_cb_exit(info->art, info->draw_handle); + ED_area_tag_redraw(CTX_wm_area(C)); + MEM_freeN(info); +} + +static int sample_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + ARegion *ar= CTX_wm_region(C); + ImBuf *ibuf= ED_space_image_buffer(sima); + ImageSampleInfo *info; + + if(ibuf == NULL) + return OPERATOR_CANCELLED; + + info= MEM_callocN(sizeof(ImageSampleInfo), "ImageSampleInfo"); + info->art= ar->type; + info->draw_handle = ED_region_draw_cb_activate(ar->type, sample_draw, info, REGION_DRAW_POST); + op->customdata= info; + + sample_apply(C, op, event); + + WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op); + + return OPERATOR_RUNNING_MODAL; +} + +static int sample_modal(bContext *C, wmOperator *op, wmEvent *event) +{ + switch(event->type) { + case LEFTMOUSE: + case RIGHTMOUSE: // XXX hardcoded + sample_exit(C, op); + return OPERATOR_CANCELLED; + case MOUSEMOVE: + sample_apply(C, op, event); + break; + } + + return OPERATOR_RUNNING_MODAL; +} + +static int sample_cancel(bContext *C, wmOperator *op) +{ + sample_exit(C, op); + return OPERATOR_CANCELLED; +} + +void IMAGE_OT_sample(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Sample"; + ot->idname= "IMAGE_OT_sample"; + + /* api callbacks */ + ot->invoke= sample_invoke; + ot->modal= sample_modal; + ot->cancel= sample_cancel; + ot->poll= space_image_main_area_poll; +} + +/******************** record composite operator *********************/ + +typedef struct RecordCompositeData { + wmTimer *timer; + int old_cfra; + int sfra, efra; +} RecordCompositeData; + +int record_composite_apply(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + RecordCompositeData *rcd= op->customdata; + Scene *scene= CTX_data_scene(C); + ImBuf *ibuf; + + // XXX scene->nodetree->test_break= blender_test_break; + // XXX scene->nodetree->test_break= NULL; + // XXX set_timecursor(CFRA); + + BKE_image_all_free_anim_ibufs(CFRA); + ntreeCompositTagAnimated(scene->nodetree); + ntreeCompositExecTree(scene->nodetree, &scene->r, scene->r.cfra != rcd->old_cfra); /* 1 is no previews */ + + ED_area_tag_redraw(CTX_wm_area(C)); + + ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser); + /* save memory in flipbooks */ + if(ibuf) + imb_freerectfloatImBuf(ibuf); + + scene->r.cfra++; + + return (scene->r.cfra <= rcd->efra); +} + +static int record_composite_init(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Scene *scene= CTX_data_scene(C); + RecordCompositeData *rcd; + + if(sima->iuser.frames < 2) + return 0; + if(scene->nodetree == NULL) + return 0; + + op->customdata= rcd= MEM_callocN(sizeof(RecordCompositeData), "ImageRecordCompositeData"); + + rcd->old_cfra= scene->r.cfra; + rcd->sfra= sima->iuser.sfra; + rcd->efra= sima->iuser.sfra + sima->iuser.frames-1; + scene->r.cfra= rcd->sfra; + + WM_cursor_wait(1); + + return 1; +} + +static void record_composite_exit(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + RecordCompositeData *rcd= op->customdata; + + scene->r.cfra= rcd->old_cfra; + + WM_cursor_wait(0); + + if(rcd->timer) + WM_event_remove_window_timer(CTX_wm_window(C), rcd->timer); + + // XXX play_anim(0); + + // XXX allqueue(REDRAWNODE, 1); + // XXX allqueue(REDRAWIMAGE, 1); + + MEM_freeN(rcd); +} + +static int record_composite_exec(bContext *C, wmOperator *op) +{ + if(!record_composite_init(C, op)) + return OPERATOR_CANCELLED; + + while(record_composite_apply(C, op)) + ; + + record_composite_exit(C, op); + + return OPERATOR_FINISHED; +} + +static int record_composite_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + RecordCompositeData *rcd= op->customdata; + + if(!record_composite_init(C, op)) + return OPERATOR_CANCELLED; + + rcd= op->customdata; + rcd->timer= WM_event_add_window_timer(CTX_wm_window(C), TIMER, 0.0f); + WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op); + + if(!record_composite_apply(C, op)) + return OPERATOR_FINISHED; + + return OPERATOR_RUNNING_MODAL; +} + +static int record_composite_modal(bContext *C, wmOperator *op, wmEvent *event) +{ + RecordCompositeData *rcd= op->customdata; + + switch(event->type) { + case TIMER: + if(rcd->timer == event->customdata) { + if(!record_composite_apply(C, op)) { + record_composite_exit(C, op); + return OPERATOR_FINISHED; + } + } + break; + case ESCKEY: + record_composite_exit(C, op); + return OPERATOR_FINISHED; + } + + return OPERATOR_RUNNING_MODAL; +} + +static int record_composite_cancel(bContext *C, wmOperator *op) +{ + record_composite_exit(C, op); + return OPERATOR_CANCELLED; +} + +void IMAGE_OT_record_composite(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Record Composite"; + ot->idname= "IMAGE_OT_record_composite"; + + /* api callbacks */ + ot->exec= record_composite_exec; + ot->invoke= record_composite_invoke; + ot->modal= record_composite_modal; + ot->cancel= record_composite_cancel; + ot->poll= space_image_poll; +} + +/******************** TODO ********************/ + /* XXX notifier? */ #if 0 /* goes over all ImageUsers, and sets frame numbers if auto-refresh is set */ @@ -1005,189 +1569,3 @@ void BIF_image_update_frame(void) } #endif -void image_pixel_aspect(Image *image, float *x, float *y) -{ - *x = *y = 1.0; - - if( (image == NULL) || - (image->type == IMA_TYPE_R_RESULT) || - (image->type == IMA_TYPE_COMPOSITE) || - (image->tpageflag & IMA_TILES) || - (image->aspx==0.0 || image->aspy==0.0) - ) { - return; - } - - /* x is always 1 */ - *y = image->aspy / image->aspx; -} - -void image_final_aspect(Image *image, float *x, float *y) -{ - *x = *y = 1.0; - - if( (image == NULL) || - (image->type == IMA_TYPE_R_RESULT) || - (image->type == IMA_TYPE_COMPOSITE) || - (image->tpageflag & IMA_TILES) || - (image->aspx==0.0 || image->aspy==0.0) - ) { - return; - } else { - ImBuf *ibuf= BKE_image_get_ibuf(image, NULL); - if (ibuf && ibuf->x && ibuf->y) { - *y = (image->aspy * ibuf->y) / (image->aspx * ibuf->x); - } else { - /* x is always 1 */ - *y = image->aspy / image->aspx; - } - } -} - -void sima_sample_color(SpaceImage *sima) -{ - ImBuf *ibuf= ED_space_image_buffer(sima); - float fx, fy; - short mval[2], mvalo[2], firsttime=1; - - if(ibuf==NULL) - return; - - // XXX calc_image_view(sima, 'f'); - // XXX getmouseco_areawin(mvalo); - - while(0) { // XXX get_mbut() & L_MOUSE) { - - // XXX getmouseco_areawin(mval); - if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || firsttime) { - firsttime= 0; - // XXX areamouseco_to_ipoco(G.v2d, mval, &fx, &fy); - - if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) { - float *fp= NULL, *zpf= NULL; - float vec[3]; - int *zp= NULL; - char *cp= NULL; - - int x= (int) (fx*ibuf->x); - int y= (int) (fy*ibuf->y); - - if(x>=ibuf->x) x= ibuf->x-1; - if(y>=ibuf->y) y= ibuf->y-1; - - if(ibuf->rect) - cp= (char *)(ibuf->rect + y*ibuf->x + x); - if(ibuf->zbuf) - zp= ibuf->zbuf + y*ibuf->x + x; - if(ibuf->zbuf_float) - zpf= ibuf->zbuf_float + y*ibuf->x + x; - if(ibuf->rect_float) - fp= (ibuf->rect_float + (ibuf->channels)*(y*ibuf->x + x)); - - if(fp==NULL) { - fp= vec; - vec[0]= (float)cp[0]/255.0f; - vec[1]= (float)cp[1]/255.0f; - vec[2]= (float)cp[2]/255.0f; - } - - if(sima->cumap) { - - if(ibuf->channels==4) { - if(0) { // XXX G.qual & LR_CTRLKEY) { - curvemapping_set_black_white(sima->cumap, NULL, fp); - curvemapping_do_ibuf(sima->cumap, ibuf); - } - else if(0) { // XXX G.qual & LR_SHIFTKEY) { - curvemapping_set_black_white(sima->cumap, fp, NULL); - curvemapping_do_ibuf(sima->cumap, ibuf); - } - } - } - -#if 0 - { - ScrArea *sa, *cur= curarea; - - node_curvemap_sample(fp); /* sends global to node editor */ - for(sa= G.curscreen->areabase.first; sa; sa= sa->next) { - if(sa->spacetype==SPACE_NODE) { - areawinset(sa->win); - scrarea_do_windraw(sa); - } - } - node_curvemap_sample(NULL); /* clears global in node editor */ - curarea= cur; - } - - areawinset(curarea->win); - scrarea_do_windraw(curarea); - myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375); - glLoadIdentity(); - - sima_show_info(ibuf->channels, x, y, cp, (ibuf->rect_float)?fp:NULL, zp, zpf); - - screen_swapbuffers(); -#endif - - } - } - // XXX BIF_wait_for_statechange(); - } - - // XXX scrarea_queue_winredraw(curarea); -} - -void mouseco_to_curtile(SpaceImage *sima, struct Object *obedit) -{ - float fx, fy; - short mval[2]; - int show_uvedit; - - show_uvedit= ED_space_image_show_uvedit(sima, obedit); - if(!show_uvedit) return; - - if(sima->image && sima->image->tpageflag & IMA_TILES) { - - sima->flag |= SI_EDITTILE; - - while(0) { // XXX get_mbut()&L_MOUSE) { - - // XXX calc_image_view(sima, 'f'); - - // XXX getmouseco_areawin(mval); - // XXX areamouseco_to_ipoco(G.v2d, mval, &fx, &fy); - - if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) { - - fx= (fx)*sima->image->xrep; - fy= (fy)*sima->image->yrep; - - mval[0]= fx; - mval[1]= fy; - - sima->curtile= mval[1]*sima->image->xrep + mval[0]; - } - - // XXX scrarea_do_windraw(curarea); - // XXX screen_swapbuffers(); - } - - sima->flag &= ~SI_EDITTILE; - - // XXX image_set_tile(sima, 2); - - // XXX allqueue(REDRAWVIEW3D, 0); - // XXX scrarea_queue_winredraw(curarea); - } -} - -/* Could be used for other 2D views also */ -void mouseco_to_cursor_sima(void) -{ - // XXX short mval[2]; - // XXX getmouseco_areawin(mval); - // XXX areamouseco_to_ipoco(G.v2d, mval, &G.v2d->cursor[0], &G.v2d->cursor[1]); - // XXX scrarea_queue_winredraw(curarea); -} - diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 4f40dff378b..a3208331a3f 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -147,6 +147,19 @@ void image_operatortypes(void) WM_operatortype_append(IMAGE_OT_view_zoom_out); WM_operatortype_append(IMAGE_OT_view_zoom_ratio); + WM_operatortype_append(IMAGE_OT_new); + WM_operatortype_append(IMAGE_OT_open); + WM_operatortype_append(IMAGE_OT_replace); + WM_operatortype_append(IMAGE_OT_reload); + WM_operatortype_append(IMAGE_OT_save); + WM_operatortype_append(IMAGE_OT_save_as); + WM_operatortype_append(IMAGE_OT_save_sequence); + WM_operatortype_append(IMAGE_OT_pack); + WM_operatortype_append(IMAGE_OT_unpack); + WM_operatortype_append(IMAGE_OT_sample); + + WM_operatortype_append(IMAGE_OT_record_composite); + WM_operatortype_append(IMAGE_OT_toolbox); } @@ -172,6 +185,12 @@ void image_keymap(struct wmWindowManager *wm) RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f); RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f); + WM_keymap_add_item(keymap, "IMAGE_OT_new", NKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "IMAGE_OT_open", OKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "IMAGE_OT_reload", RKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "IMAGE_OT_save", SKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "IMAGE_OT_sample", ACTIONMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "IMAGE_OT_toolbox", SPACEKEY, KM_PRESS, 0, 0); } @@ -190,7 +209,7 @@ static void image_refresh(const bContext *C, ScrArea *sa) EditMesh *em= me->edit_mesh; MTFace *tf; - if(EM_texFaceCheck(em)) { + if(em && EM_texFaceCheck(em)) { sima->image= ima= NULL; tf = EM_get_active_mtface(em, NULL, NULL, 1); /* partially selected face is ok */ @@ -261,7 +280,7 @@ static void image_main_area_set_view2d(SpaceImage *sima, ARegion *ar) ImBuf *ibuf= imagewindow_get_ibuf(sima); float xuser_asp, yuser_asp; - image_pixel_aspect(sima->image, &xuser_asp, &yuser_asp); + ED_image_aspect(sima->image, &xuser_asp, &yuser_asp); if(ibuf) { xim= ibuf->x * xuser_asp; yim= ibuf->y * yuser_asp; @@ -368,6 +387,7 @@ static void image_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype) ListBase *keymap; keymap= WM_keymap_listbase(wm, "UVEdit", 0, 0); + if(stype==NS_EDITMODE_MESH) WM_event_add_keymap_handler(&ar->handlers, keymap); else @@ -479,7 +499,7 @@ Image *ED_space_image(SpaceImage *sima) } /* called to assign images to UV faces */ -void ED_space_image_set(SpaceImage *sima, Scene *scene, Object *obedit, Image *ima) +void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obedit, Image *ima) { ED_uvedit_assign_image(scene, obedit, ima, sima->image); @@ -487,11 +507,22 @@ void ED_space_image_set(SpaceImage *sima, Scene *scene, Object *obedit, Image *i * to check if the face is displayed in UV-localview */ sima->image= ima; + if(ima) + printf("assign %s\n", ima->id.name); + if(ima == NULL || ima->type==IMA_TYPE_R_RESULT || ima->type==IMA_TYPE_COMPOSITE) sima->flag &= ~SI_DRAWTOOL; if(sima->image) BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE); + + if(sima->image && sima->image->id.us==0) + sima->image->id.us= 1; + + if(obedit) + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + ED_area_tag_redraw(CTX_wm_area(C)); } ImBuf *ED_space_image_buffer(SpaceImage *sima) diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 157be64e6e6..20a6f15e057 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -593,10 +593,10 @@ static void view3d_viewmenu(bContext *C, uiMenuItem *head, void *arg_unused) // uiMenuSeparator(head); - uiMenuItemEnumO(head, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_CAMERA); - uiMenuItemEnumO(head, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_TOP); - uiMenuItemEnumO(head, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_FRONT); - uiMenuItemEnumO(head, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_RIGHT); + uiMenuItemEnumO(head, "", 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_CAMERA); + uiMenuItemEnumO(head, "", 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_TOP); + uiMenuItemEnumO(head, "", 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_FRONT); + uiMenuItemEnumO(head, "", 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_RIGHT); //uiMenuLevel(head, "Cameras", view3d_view_camerasmenu); @@ -4898,9 +4898,9 @@ static void view3d_sculpt_menu(bContext *C, uiMenuItem *head, void *arg_unused) /* Curve */ uiMenuSeparator(head); - uiMenuItemEnumO(head, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SHARP); - uiMenuItemEnumO(head, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SMOOTH); - uiMenuItemEnumO(head, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_MAX); + uiMenuItemEnumO(head, "", 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SHARP); + uiMenuItemEnumO(head, "", 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SMOOTH); + uiMenuItemEnumO(head, "", 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_MAX); uiMenuSeparator(head); diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c index ec64d1483a1..fd1db9e1984 100644 --- a/source/blender/editors/transform/transform_orientations.c +++ b/source/blender/editors/transform/transform_orientations.c @@ -360,10 +360,10 @@ void BIF_menuTransformOrientation(bContext *C, uiMenuItem *head, void *arg) TransformOrientation *ts; int i= V3D_MANIP_CUSTOM; - uiMenuItemEnumO(head, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_GLOBAL); - uiMenuItemEnumO(head, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_LOCAL); - uiMenuItemEnumO(head, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_NORMAL); - uiMenuItemEnumO(head, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_VIEW); + uiMenuItemEnumO(head, "", 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_GLOBAL); + uiMenuItemEnumO(head, "", 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_LOCAL); + uiMenuItemEnumO(head, "", 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_NORMAL); + uiMenuItemEnumO(head, "", 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_VIEW); for(ts = transform_spaces->first; ts; ts = ts->next) uiMenuItemIntO(head, ts->name, 0, "TFM_OT_select_orientation", "custom_index", i++); diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 4c27151acef..6697cc83845 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -2897,6 +2897,120 @@ void UV_OT_show_hidden(wmOperatorType *ot) ot->poll= ED_operator_uvedit; } + +/******************** set 3d cursor operator ********************/ + +static int set_3d_cursor_exec(bContext *C, wmOperator *op) +{ + ARegion *ar= CTX_wm_region(C); + float location[2]; + + RNA_float_get_array(op->ptr, "location", location); + ar->v2d.cursor[0]= location[0]; + ar->v2d.cursor[1]= location[1]; + + ED_area_tag_redraw(CTX_wm_area(C)); + + return OPERATOR_FINISHED; +} + +static int set_3d_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + int x, y; + float location[2]; + + x= event->x - ar->winrct.xmin; + y= event->y - ar->winrct.ymin; + UI_view2d_region_to_view(&ar->v2d, x, y, &location[0], &location[1]); + RNA_float_set_array(op->ptr, "location", location); + + return set_3d_cursor_exec(C, op); +} + +void UV_OT_set_3d_cursor(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set 3D Cursor"; + ot->idname= "UV_OT_set_3d_cursor"; + + /* api callbacks */ + ot->exec= set_3d_cursor_exec; + ot->invoke= set_3d_cursor_invoke; + ot->poll= ED_operator_uvedit; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX, "Location", "Cursor location in 0.0-1.0 coordinates.", -10.0f, 10.0f); +} + +/********************** set tile operator **********************/ + +static int set_tile_exec(bContext *C, wmOperator *op) +{ + Image *ima= CTX_data_edit_image(C); + int tile[2]; + + if(!ima || !(ima->tpageflag & IMA_TILES)) + return OPERATOR_CANCELLED; + + RNA_int_get_array(op->ptr, "tile", tile); + ED_uvedit_set_tile(C, CTX_data_scene(C), CTX_data_edit_object(C), ima, tile[0] + ima->xrep*tile[1], 1); + + ED_area_tag_redraw(CTX_wm_area(C)); + + return OPERATOR_FINISHED; +} + +static int set_tile_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Image *ima= CTX_data_edit_image(C); + ARegion *ar= CTX_wm_region(C); + float fx, fy; + int x, y, tile[2]; + + if(!ima || !(ima->tpageflag & IMA_TILES)) + return OPERATOR_CANCELLED; + + x= event->x - ar->winrct.xmin; + y= event->y - ar->winrct.ymin; + UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy); + + if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) { + fx= fx*ima->xrep; + fy= fy*ima->yrep; + + tile[0]= fx; + tile[1]= fy; + + sima->curtile= tile[1]*ima->xrep + tile[0]; + RNA_int_set_array(op->ptr, "tile", tile); + } + + return set_tile_exec(C, op); +} + +void UV_OT_set_tile(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set Tile"; + ot->idname= "UV_OT_set_tile"; + + /* api callbacks */ + ot->exec= set_tile_exec; + ot->invoke= set_tile_invoke; + ot->poll= ED_operator_uvedit; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_int_vector(ot->srna, "tile", 2, NULL, 0, INT_MAX, "Tile", "Tile coordinate.", 0, 10); +} + /* ************************** registration **********************************/ void ED_operatortypes_uvedit(void) @@ -2934,6 +3048,9 @@ void ED_operatortypes_uvedit(void) WM_operatortype_append(UV_OT_show_hidden); WM_operatortype_append(UV_OT_hide_selected); WM_operatortype_append(UV_OT_hide_deselected); + + WM_operatortype_append(UV_OT_set_3d_cursor); + WM_operatortype_append(UV_OT_set_tile); } void ED_keymap_uvedit(wmWindowManager *wm) @@ -2974,6 +3091,10 @@ void ED_keymap_uvedit(wmWindowManager *wm) WM_keymap_add_item(keymap, "UV_OT_hide_deselected", HKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "UV_OT_show_hidden", HKEY, KM_PRESS, KM_ALT, 0); + /* cursor */ + WM_keymap_add_item(keymap, "UV_OT_set_3d_cursor", ACTIONMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "UV_OT_set_tile", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0); + transform_keymap_for_space(wm, keymap, SPACE_IMAGE); } diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 33f386fd35a..793727d4d7b 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -33,6 +33,11 @@ #ifdef RNA_RUNTIME +#include "DNA_scene_types.h" + +#include "BKE_brush.h" +#include "BKE_context.h" + static StructRNA* rna_Space_refine(struct PointerRNA *ptr) { SpaceLink *space= (SpaceLink*)ptr->data; @@ -80,6 +85,14 @@ static PointerRNA rna_SpaceImage_uvedit_get(PointerRNA *ptr) return rna_pointer_inherit_refine(ptr, &RNA_SpaceUVEditor, ptr->data); } +static void rna_SpaceImage_paint_update(bContext *C, PointerRNA *ptr) +{ + Scene *scene= CTX_data_scene(C); + + if(scene) + brush_check_exists(&scene->toolsettings->imapaint.brush); +} + #else static void rna_def_space(BlenderRNA *brna) @@ -270,8 +283,8 @@ static void rna_def_space_image(BlenderRNA *brna) /* paint */ prop= RNA_def_property(srna, "image_painting", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAWTOOL); - RNA_def_property_flag(prop, PROP_NOT_EDITABLE); // brush check RNA_def_property_ui_text(prop, "Image Painting", "Enable image painting mode."); + RNA_def_property_update(prop, 0, "rna_SpaceImage_paint_update"); /* grease pencil */ prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE); From 50a6d77fc04cc030bf2d10cb414920502fc6e646 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 11 Feb 2009 02:09:41 +0000 Subject: [PATCH 42/63] Names from uiMenuItemEnumO were not being used. Changed some of the sequencer menus to use uiMenuItem's --- .../editors/interface/interface_regions.c | 9 +- .../editors/space_action/action_header.c | 1 + .../space_sequencer/sequencer_header.c | 244 +++++++----------- 3 files changed, 100 insertions(+), 154 deletions(-) diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 7830ec0e707..ad372077351 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -1835,8 +1835,13 @@ static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle, else if(item->type==MENU_ITEM_OPNAME_ENUM) { const char *name; char bname[64]; - - name= ui_menu_enumpropname(item->opname, item->propname, item->enumval); + + /* If no name is given, use the enum name */ + if (item->name[0] == '\0') + name= ui_menu_enumpropname(item->opname, item->propname, item->enumval); + else + name= item->name; + BLI_strncpy(bname, name, sizeof(bname)); but= uiDefIconTextButO(block, BUTM, item->opname, item->opcontext, item->icon, bname, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, ""); diff --git a/source/blender/editors/space_action/action_header.c b/source/blender/editors/space_action/action_header.c index aff87a2c341..6965db52714 100644 --- a/source/blender/editors/space_action/action_header.c +++ b/source/blender/editors/space_action/action_header.c @@ -42,6 +42,7 @@ #include "BLI_blenlib.h" +#include "BKE_animsys.h" #include "BKE_context.h" #include "BKE_screen.h" diff --git a/source/blender/editors/space_sequencer/sequencer_header.c b/source/blender/editors/space_sequencer/sequencer_header.c index c543c13bbf5..32a60f1fb54 100644 --- a/source/blender/editors/space_sequencer/sequencer_header.c +++ b/source/blender/editors/space_sequencer/sequencer_header.c @@ -91,7 +91,6 @@ static uiBlock *seq_viewmenu(bContext *C, ARegion *ar, void *arg_unused) uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Grease Pencil...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); - uiDefMenuSep(block); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, @@ -144,46 +143,23 @@ static uiBlock *seq_viewmenu(bContext *C, ARegion *ar, void *arg_unused) return block; } -static uiBlock *seq_selectmenu(bContext *C, ARegion *ar, void *arg_unused) +//static uiBlock *seq_selectmenu(bContext *C, ARegion *ar, void *arg_unused) +static void seq_selectmenu(bContext *C, uiMenuItem *head, void *arg_unused) { - ScrArea *sa= CTX_wm_area(C); + uiMenuContext(head, WM_OP_INVOKE_DEFAULT); - uiBlock *block= uiBeginBlock(C, ar, "seq_selectmenu", UI_EMBOSSP, UI_HELV); - uiBut *but; - - but= uiDefMenuButO(block, "SEQUENCER_OT_select_active_side", "Strips to the Left"); - RNA_enum_set(uiButGetOperatorPtrRNA(but), "side", 'l'); - but= uiDefMenuButO(block, "SEQUENCER_OT_select_active_side", "Strips to the Right"); - RNA_enum_set(uiButGetOperatorPtrRNA(but), "side", 'r'); - uiDefMenuSep(block); - but= uiDefMenuButO(block, "SEQUENCER_OT_select_handles", "Surrounding Handles"); - RNA_enum_set(uiButGetOperatorPtrRNA(but), "side", SEQ_SIDE_BOTH); - but= uiDefMenuButO(block, "SEQUENCER_OT_select_handles", "Left Handles"); - RNA_enum_set(uiButGetOperatorPtrRNA(but), "side", SEQ_SIDE_LEFT); - but= uiDefMenuButO(block, "SEQUENCER_OT_select_handles", "Right Handles"); - RNA_enum_set(uiButGetOperatorPtrRNA(but), "side", SEQ_SIDE_RIGHT); - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_borderselect", NULL); - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_select_linked", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_deselect_all", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_select_invert", NULL); - - - if(sa->headertype==HEADERTOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - /* position menu */ - uiTextBoundsBlock(block, 60); - - uiEndBlock(C, block); - - return block; + uiMenuItemEnumO(head, "Strips to the Left", 0, "SEQUENCER_OT_select_active_side", "side", SEQ_SIDE_LEFT); + uiMenuItemEnumO(head, "Strips to the Right", 0, "SEQUENCER_OT_select_active_side", "side", SEQ_SIDE_RIGHT); + uiMenuSeparator(head); + uiMenuItemEnumO(head, "Surrounding Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_BOTH); + uiMenuItemEnumO(head, "Left Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_LEFT); + uiMenuItemEnumO(head, "Right Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_RIGHT); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_select_linked"); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_select_linked"); + uiMenuItemO(head, 0, "SEQUENCER_OT_deselect_all"); + uiMenuItemO(head, 0, "SEQUENCER_OT_select_invert"); } static uiBlock *seq_markermenu(bContext *C, ARegion *ar, void *arg_unused) @@ -233,157 +209,115 @@ static uiBlock *seq_markermenu(bContext *C, ARegion *ar, void *arg_unused) return block; } -static uiBlock *seq_addmenu_effectmenu(bContext *C, ARegion *ar, void *arg_unused) +//static uiBlock *seq_addmenu_effectmenu(bContext *C, ARegion *ar, void *arg_unused) +static void seq_addmenu_effectmenu(bContext *C, uiMenuItem *head, void *arg_unused) { - uiBlock *block= uiBeginBlock(C, ar, "seq_addmenu_effectmenu", UI_EMBOSSP, UI_HELV); - - - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Add")), "type", SEQ_ADD); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Subtract")), "type", SEQ_SUB); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Multiply")), "type", SEQ_MUL); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Cross")), "type", SEQ_CROSS); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Gamma Cross")), "type", SEQ_GAMCROSS); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Alpha Over")), "type", SEQ_ALPHAOVER); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Alpha Under")), "type", SEQ_ALPHAUNDER); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Alpha Over Drop")), "type", SEQ_OVERDROP); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Wipe")), "type", SEQ_WIPE); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Glow")), "type", SEQ_GLOW); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Transform")), "type", SEQ_TRANSFORM); + uiMenuContext(head, WM_OP_INVOKE_DEFAULT); + + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_ADD); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_SUB); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_MUL); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_CROSS); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_GAMCROSS); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_ALPHAOVER); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_ALPHAUNDER); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_OVERDROP); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_WIPE); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_GLOW); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_TRANSFORM); /* Color is an effect but moved to the other menu since its not that exciting */ - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Speed Control")), "type", SEQ_SPEED); - uiDefMenuSep(block); - RNA_enum_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Plugin...")), "type", SEQ_PLUGIN); - - /* position menu */ - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - - uiEndBlock(C, block); - - return block; + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_SPEED); + uiMenuSeparator(head); + uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_PLUGIN); } -static uiBlock *seq_addmenu(bContext *C, ARegion *ar, void *arg_unused) +//static uiBlock *seq_addmenu(bContext *C, ARegion *ar, void *arg_unused) +static void seq_addmenu(bContext *C, uiMenuItem *head, void *arg_unused) { - ScrArea *sa= CTX_wm_area(C); - uiBlock *block= uiBeginBlock(C, ar, "seq_addmenu", UI_EMBOSSP, UI_HELV); - uiBut *but; - - uiDefMenuSub(block, seq_addmenu_effectmenu, "Effect"); + uiMenuLevel(head, "Effects...", seq_addmenu_effectmenu); + uiMenuSeparator(head); - uiDefMenuSep(block); + uiMenuContext(head, WM_OP_INVOKE_DEFAULT); #ifdef WITH_FFMPEG - uiDefMenuButO(block, "SEQUENCER_OT_add_sound_strip", "Audio (RAM)"); - but= uiDefMenuButO(block, "SEQUENCER_OT_add_sound_strip", "Audio (HD)"); - RNA_boolean_set(uiButGetOperatorPtrRNA(but), "hd", TRUE); + uiMenuItemBooleanO(head, "Audio (RAM)", 0, "SEQUENCER_OT_add_sound_strip", "hd", FALSE); + uiMenuItemBooleanO(head, "Audio (HD)", 0, "SEQUENCER_OT_add_sound_strip", "hd", TRUE); #else - uiDefMenuButO(block, "SEQUENCER_OT_add_sound_strip", NULL); + uiMenuItemO(head, 0, "SEQUENCER_OT_add_sound_strip"); #endif - but= uiDefMenuButO(block, "SEQUENCER_OT_add_effect_strip", "Add Color Strip"); - RNA_enum_set(uiButGetOperatorPtrRNA(but), "type", SEQ_COLOR); + uiMenuItemEnumO(head, "Add Color Strip", 0, "SEQUENCER_OT_add_effect_strip", "type", SEQ_COLOR); - uiDefMenuButO(block, "SEQUENCER_OT_add_image_strip", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_add_movie_strip", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_add_scene_strip", NULL); + uiMenuItemO(head, 0, "SEQUENCER_OT_add_image_strip"); + uiMenuItemO(head, 0, "SEQUENCER_OT_add_movie_strip"); + uiMenuItemO(head, 0, "SEQUENCER_OT_add_scene_strip"); #ifdef WITH_FFMPEG - but= uiDefMenuButO(block, "SEQUENCER_OT_add_movie_strip", NULL); - RNA_boolean_set(uiButGetOperatorPtrRNA(but), "sound", TRUE); + uiMenuItemBooleanO(head, "Movie and Sound", 0, "SEQUENCER_OT_add_movie_strip", "sound", TRUE); #endif - - if(sa->headertype==HEADERTOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - uiEndBlock(C, block); - - return block; } -static uiBlock *seq_editmenu(bContext *C, ARegion *ar, void *arg_unused) +//static uiBlock *seq_editmenu(bContext *C, ARegion *ar, void *arg_unused) +static void seq_editmenu(bContext *C, uiMenuItem *head, void *arg_unused) { - ScrArea *sa= CTX_wm_area(C); + Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); - - uiBlock *block= uiBeginBlock(C, ar, "seq_editmenu", UI_EMBOSSP, UI_HELV); - uiBut *but; + uiMenuContext(head, WM_OP_INVOKE_DEFAULT); - RNA_int_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "TFM_OT_transform", "Grab/Move")), "mode", TFM_TRANSLATION); - RNA_int_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "TFM_OT_transform", "Grab/Extend from frame")), "mode", TFM_TIME_EXTEND); + uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TRANSLATION); + uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TIME_EXTEND); - uiDefMenuButO(block, "SEQUENCER_OT_strip_snap", "Snap to Current Frame"); + // uiMenuItemO(head, 0, "SEQUENCER_OT_strip_snap"); // TODO - add this operator - RNA_int_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_cut", "Cut (hard) at Current Frame")), "type", SEQ_CUT_HARD); - RNA_int_set(uiButGetOperatorPtrRNA(uiDefMenuButO(block, "SEQUENCER_OT_cut", "Cut (soft) at Current Frame")), "type", SEQ_CUT_SOFT); + uiMenuItemEnumO(head, "Cut Hard", 0, "SEQUENCER_OT_cut", "type", SEQ_CUT_HARD); + uiMenuItemEnumO(head, "Cut Soft", 0, "SEQUENCER_OT_cut", "type", SEQ_CUT_SOFT); - - uiDefMenuButO(block, "SEQUENCER_OT_separate_images", NULL); - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_add_duplicate", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_delete", NULL); + uiMenuItemO(head, 0, "SEQUENCER_OT_separate_images"); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_add_duplicate"); + uiMenuItemO(head, 0, "SEQUENCER_OT_delete"); if (ed && ed->act_seq) { switch(ed->act_seq->type) { case SEQ_EFFECT: - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_effect_change", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_effect_reassign_inputs", NULL); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_effect_change"); + uiMenuItemO(head, 0, "SEQUENCER_OT_effect_reassign_inputs"); break; case SEQ_IMAGE: - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_image_change", NULL); // Change Scene... + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_image_change"); // Change Scene... break; case SEQ_SCENE: - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_scene_change", NULL); // Remap Paths... + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_scene_change"); // Remap Paths... break; case SEQ_MOVIE: - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_movie_change", NULL); // Remap Paths... + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_movie_change"); // Remap Paths... break; } } - uiDefMenuSep(block); + uiMenuSeparator(head); - uiDefMenuButO(block, "SEQUENCER_OT_meta_make", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_meta_separate", NULL); + uiMenuItemO(head, 0, "SEQUENCER_OT_meta_make"); + uiMenuItemO(head, 0, "SEQUENCER_OT_meta_separate"); if (ed && (ed->metastack.first || (ed->act_seq && ed->act_seq->type == SEQ_META))) { - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_meta_toggle", NULL); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_meta_toggle"); } - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_reload", NULL); - uiDefMenuSep(block); - uiDefMenuButO(block, "SEQUENCER_OT_lock", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_unlock", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_mute", NULL); - uiDefMenuButO(block, "SEQUENCER_OT_unmute", NULL); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_reload"); + uiMenuSeparator(head); + uiMenuItemO(head, 0, "SEQUENCER_OT_lock"); + uiMenuItemO(head, 0, "SEQUENCER_OT_unlock"); + uiMenuItemO(head, 0, "SEQUENCER_OT_mute"); + uiMenuItemO(head, 0, "SEQUENCER_OT_unmute"); - but= uiDefMenuButO(block, "SEQUENCER_OT_mute", "Mute Deselected Strips"); - RNA_enum_set(uiButGetOperatorPtrRNA(but), "type", SEQ_UNSELECTED); - - if(sa->headertype==HEADERTOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - uiEndBlock(C, block); - - return block; + uiMenuItemEnumO(head, "Mute Deselected Strips", 0, "SEQUENCER_OT_mute", "type", SEQ_UNSELECTED); } void sequencer_header_buttons(const bContext *C, ARegion *ar) @@ -405,23 +339,29 @@ void sequencer_header_buttons(const bContext *C, ARegion *ar) uiBlockSetEmboss(block, UI_EMBOSSP); xmax= GetButStringLength("View"); - uiDefPulldownBut(block, seq_viewmenu, sa, "View", xco, 0, xmax-3, 24, ""); + + //uiDefMenuBut(block, seq_viewmenu, NULL, "View", xco, 0, xmax-3, 24, ""); // TODO + uiDefPulldownBut(block, seq_viewmenu, sa, "View", xco, 0, xmax-3, 24, ""); xco+=xmax; xmax= GetButStringLength("Select"); - uiDefPulldownBut(block, seq_selectmenu, sa, "Select", xco, 0, xmax-3, 24, ""); + uiDefMenuBut(block, seq_selectmenu, NULL, "Select", xco, 0, xmax-3, 24, ""); + //uiDefPulldownBut(block, seq_selectmenu, sa, "Select", xco, 0, xmax-3, 24, ""); xco+=xmax; xmax= GetButStringLength("Marker"); - uiDefPulldownBut(block, seq_markermenu, sa, "Marker", xco, 0, xmax-3, 24, ""); + //uiDefMenuBut(block, seq_markermenu, NULL, "Marker", xco, 0, xmax-3, 24, ""); + uiDefPulldownBut(block, seq_markermenu, sa, "Marker", xco, 0, xmax-3, 24, ""); // TODO xco+=xmax; xmax= GetButStringLength("Add"); - uiDefPulldownBut(block, seq_addmenu, sa, "Add", xco, 0, xmax-3, 24, ""); + uiDefMenuBut(block, seq_addmenu, NULL, "Add", xco, 0, xmax-3, 24, ""); + //uiDefPulldownBut(block, seq_addmenu, sa, "Add", xco, 0, xmax-3, 24, ""); xco+=xmax; xmax= GetButStringLength("Strip"); - uiDefPulldownBut(block, seq_editmenu, sa, "Strip", xco, 0, xmax-3, 24, ""); + uiDefMenuBut(block, seq_editmenu, NULL, "Strip", xco, 0, xmax-3, 24, ""); + //uiDefPulldownBut(block, seq_editmenu, sa, "Strip", xco, 0, xmax-3, 24, ""); xco+=xmax; } From ba32199b23fb1b745109d7b25b8d7c6cdf903cd1 Mon Sep 17 00:00:00 2001 From: Michael Fox Date: Wed, 11 Feb 2009 03:46:14 +0000 Subject: [PATCH 43/63] 2.5 ****** -ported (de)select all for editarmature and pose mode - please review my loops and notifiers as i think they are pretty ugly --- .../editors/armature/armature_intern.h | 2 + .../blender/editors/armature/armature_ops.c | 11 +++ .../blender/editors/armature/editarmature.c | 93 ++++++++++++++++++- 3 files changed, 105 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index 0f416c240d2..2e021c2f4ae 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -41,12 +41,14 @@ void ARMATURE_OT_subdivide_simple(struct wmOperatorType *ot); void ARMATURE_OT_subdivide_multi(struct wmOperatorType *ot); void ARMATURE_OT_parent_set(struct wmOperatorType *ot); void ARMATURE_OT_parent_clear(struct wmOperatorType *ot); +void ARMATURE_OT_de_select_all(struct wmOperatorType *ot); void POSE_OT_hide(struct wmOperatorType *ot); void POSE_OT_reveil(struct wmOperatorType *ot); void POSE_OT_rot_clear(struct wmOperatorType *ot); void POSE_OT_loc_clear(struct wmOperatorType *ot); void POSE_OT_scale_clear(struct wmOperatorType *ot); +void POSE_OT_de_select_all(struct wmOperatorType *ot); #endif /* ED_ARMATURE_INTERN_H */ diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index 896982627da..65345094720 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -107,6 +107,7 @@ void ARMATURE_OT_test(wmOperatorType *ot) /* Both operators ARMATURE_OT_xxx and POSE_OT_xxx here */ void ED_operatortypes_armature(void) { + /* EDIT ARMATURE */ WM_operatortype_append(ARMATURE_OT_align_bones); WM_operatortype_append(ARMATURE_OT_calculate_roll); WM_operatortype_append(ARMATURE_OT_switch_direction); @@ -117,12 +118,18 @@ void ED_operatortypes_armature(void) WM_operatortype_append(ARMATURE_OT_parent_set); WM_operatortype_append(ARMATURE_OT_parent_clear); + WM_operatortype_append(ARMATURE_OT_de_select_all); + + /* POSE */ WM_operatortype_append(POSE_OT_hide); WM_operatortype_append(POSE_OT_reveil); + WM_operatortype_append(POSE_OT_rot_clear); WM_operatortype_append(POSE_OT_loc_clear); WM_operatortype_append(POSE_OT_scale_clear); + WM_operatortype_append(POSE_OT_de_select_all); + WM_operatortype_append(ARMATURE_OT_test); // XXX temp test for context iterators... to be removed } @@ -147,6 +154,8 @@ void ED_keymap_armature(wmWindowManager *wm) WM_keymap_add_item(keymap, "ARMATURE_OT_set_parent", PKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_clear_parent", PKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_de_select_all", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_test", TKEY, KM_PRESS, 0, 0); // XXX temp test for context iterators... to be removed /* Pose ------------------------ */ @@ -161,5 +170,7 @@ void ED_keymap_armature(wmWindowManager *wm) WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0); + + WM_keymap_add_item(keymap, "POSE_OT_de_select_all", AKEY, KM_PRESS, 0, 0); } diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 6262642f7f9..e18497c42c8 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3509,7 +3509,56 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", prop_editarm_clear_parent_types, 0, "ClearType", "What way to clear parenting"); } +/* ****** (de)select All *******/ +static int armature_de_select_all_exec(bContext *C, wmOperator *op) +{ + Object *obedit = CTX_data_edit_object(C); + bArmature *arm= obedit->data; + EditBone *ebone; + int sel=1; + + /* Determine if there are any selected bones + And therefore whether we are selecting or deselecting */ + if (CTX_DATA_COUNT(C, selected_bones) > 0) sel=0; + + /* Set the flags */ + for (ebone=arm->edbo->first;ebone;ebone=ebone->next) { + if (sel==1) { + /* select bone */ + if(arm->layer & ebone->layer && (ebone->flag & BONE_HIDDEN_A)==0) { + ebone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); + if(ebone->parent) + ebone->parent->flag |= (BONE_TIPSEL); + } + } + else { + /* deselect bone */ + ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL | BONE_ACTIVE); + } + } + + /* undo? */ + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL); + + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_de_select_all(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "deselect all editbone"; + ot->idname= "ARMATURE_OT_de_select_all"; + + /* api callbacks */ + ot->exec= armature_de_select_all_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + +} /* ***************** EditBone Alignment ********************* */ /* helper to fix a ebone position if its parent has moved due to alignment*/ @@ -4329,7 +4378,49 @@ void POSE_OT_rot_clear(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; -} +} + + +static int pose_de_select_all_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + bArmature *arm= ob->data; + bPoseChannel *pchan; + EditBone *ebone; + int sel=1; + + /* Determine if there are any selected bones + And therefore whether we are selecting or deselecting */ + if (CTX_DATA_COUNT(C, selected_pchans) > 0) sel=0; + + /* Set the flags */ + for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + if ((pchan->bone->layer & arm->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) { + if (sel==0) pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL|BONE_ACTIVE); + else pchan->bone->flag |= BONE_SELECTED; + } + } + + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL); + + return OPERATOR_FINISHED; +} + +void POSE_OT_de_select_all(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "deselect all bones"; + ot->idname= "POSE_OT_de_select_all"; + + /* api callbacks */ + ot->exec= pose_de_select_all_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + +} /* ************* hide/unhide pose bones ******************* */ static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr) From 7d3c88772b4cdf9cec8966390e84bdd21802395f Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Wed, 11 Feb 2009 12:19:42 +0000 Subject: [PATCH 44/63] Keying Sets: Initial commit of skeleton code When fully implemented, these will be the clearest demonstration of 'Everything is Animateable', as they will allow users to define an arbitary group of settings through selecting items in the Datablocks (RNA-Viewer) View of the Outliner to define custom 'sets'. Such Keying Sets are known as the 'absolute' ones, which are created for a custom purpose. Of course, 'builtin' Keying Sets will still be provided. Such built-in ones will not work on any particular paths, but will use context info to maintain the legacy method of inserting keyframes (via IKEY menu). Currently, KeyingSets cannot be created/edited through the UI, though the backend code is in place to do this. --- source/blender/blenkernel/BKE_animsys.h | 16 ++ source/blender/blenkernel/intern/anim_sys.c | 112 ++++++++ source/blender/blenkernel/intern/blender.c | 1 + source/blender/blenkernel/intern/scene.c | 1 + source/blender/blenloader/intern/readfile.c | 52 ++++ source/blender/blenloader/intern/writefile.c | 25 +- source/blender/editors/animation/keyframing.c | 264 ++++++++++++------ .../blender/editors/include/ED_keyframing.h | 5 + .../editors/space_action/action_draw.c | 2 +- .../blender/editors/space_graph/graph_draw.c | 3 +- .../blender/editors/space_outliner/outliner.c | 40 +++ .../editors/space_outliner/outliner_header.c | 1 + .../editors/space_outliner/outliner_intern.h | 2 + .../editors/space_outliner/outliner_ops.c | 7 + .../blender/editors/space_time/time_header.c | 17 +- .../editors/space_view3d/view3d_buttons.c | 1 + source/blender/makesdna/DNA_anim_types.h | 71 +++++ source/blender/makesdna/DNA_scene_types.h | 7 +- 18 files changed, 524 insertions(+), 103 deletions(-) diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index 3b6b01a2341..47eaf68cc83 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -9,6 +9,7 @@ struct ID; struct ListBase; struct Main; struct AnimData; +struct KeyingSet; /* ************************************* */ /* AnimData API */ @@ -25,6 +26,21 @@ void BKE_free_animdata(struct ID *id); /* Copy AnimData */ struct AnimData *BKE_copy_animdata(struct AnimData *adt); +/* ************************************* */ +/* KeyingSets API */ + +/* Used to create a new 'custom' KeyingSet for the user, that will be automatically added to the stack */ +struct KeyingSet *BKE_keyingset_add(struct ListBase *list, const char name[], short flag, short keyingflag); + +/* Add a destination to a KeyingSet */ +void BKE_keyingset_add_destination(struct KeyingSet *ks, struct ID *id, const char group_name[], const char rna_path[], int array_index, int flag); + +/* Free data for KeyingSet but not set itself */ +void BKE_keyingset_free(struct KeyingSet *ks); + +/* Free all the KeyingSets in the given list */ +void BKE_keyingsets_free(struct ListBase *list); + /* ************************************* */ // TODO: overrides, remapping, and path-finding api's diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index a7e65a9c585..55597b635c9 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -158,6 +158,118 @@ AnimData *BKE_copy_animdata (AnimData *adt) return dadt; } +/* *********************************** */ +/* KeyingSet API */ + +/* NOTES: + * It is very likely that there will be two copies of the api - one for internal use, + * and one 'operator' based wrapper of the internal API, which should allow for access + * from Python/scripts so that riggers can automate the creation of KeyingSets for their rigs. + */ + +/* Defining Tools --------------------------- */ + +/* Used to create a new 'custom' KeyingSet for the user, that will be automatically added to the stack */ +KeyingSet *BKE_keyingset_add (ListBase *list, const char name[], short flag, short keyingflag) +{ + KeyingSet *ks; + + /* allocate new KeyingSet */ + ks= MEM_callocN(sizeof(KeyingSet), "KeyingSet"); + + BLI_snprintf(ks->name, 64, name); + + ks->flag= flag; + ks->keyingflag= keyingflag; + + /* add KeyingSet to list */ + BLI_addtail(list, ks); + + /* return new KeyingSet for further editing */ + return ks; +} + +/* Add a destination to a KeyingSet. Nothing is returned for now... + * Checks are performed to ensure that destination is appropriate for the KeyingSet in question + */ +void BKE_keyingset_add_destination (KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int flag) +{ + KS_Path *ksp; + + /* sanity checks */ + if ELEM(NULL, ks, rna_path) + return; + + /* ID is optional, and should only be provided for absolute KeyingSets */ + if (id) { + if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) + return; + } + + /* allocate a new KeyingSet Path */ + ksp= MEM_callocN(sizeof(KS_Path), "KeyingSet Path"); + + /* just store absolute info */ + if (ks->flag & KEYINGSET_ABSOLUTE) { + ksp->id= id; + BLI_snprintf(ksp->group, 64, group_name); + } + + /* just copy path info */ + // XXX no checks are performed for templates yet + // should array index be checked too? + ksp->rna_path= BLI_strdupn(rna_path, strlen(rna_path)); + ksp->array_index= array_index; + + /* store flags */ + ksp->flag= flag; + + /* add KeyingSet path to KeyingSet */ + BLI_addtail(&ks->paths, ksp); +} + + +/* Freeing Tools --------------------------- */ + +/* Free data for KeyingSet but not set itself */ +void BKE_keyingset_free (KeyingSet *ks) +{ + KS_Path *ksp, *kspn; + + /* sanity check */ + if (ks == NULL) + return; + + /* free each path as we go to avoid looping twice */ + for (ksp= ks->paths.first; ksp; ksp= kspn) { + kspn= ksp->next; + + /* free RNA-path info */ + MEM_freeN(ksp->rna_path); + + /* free path itself */ + BLI_freelinkN(&ks->paths, ks); + } +} + +/* Free all the KeyingSets in the given list */ +void BKE_keyingsets_free (ListBase *list) +{ + KeyingSet *ks, *ksn; + + /* sanity check */ + if (list == NULL) + return; + + /* loop over KeyingSets freeing them + * - BKE_keyingset_free() doesn't free the set itself, but it frees its sub-data + */ + for (ks= list->first; ks; ks= ksn) { + ksn= ks->next; + BKE_keyingset_free(ks); + BLI_freelinkN(list, ks); + } +} /* ***************************************** */ /* Evaluation Data-Setting Backend */ diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 94a460ee0a0..4ad7d6da608 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -65,6 +65,7 @@ #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" +#include "BKE_animsys.h" #include "BKE_action.h" #include "BKE_blender.h" #include "BKE_context.h" diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 7b3ac9e4ec2..7db96c07592 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -150,6 +150,7 @@ void free_scene(Scene *sce) #endif BKE_free_animdata((ID *)sce); + BKE_keyingsets_free(&sce->keyingsets); if (sce->r.avicodecdata) { free_avicodecdata(sce->r.avicodecdata); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 2a0f98cfe8d..b3eee6e552e 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1929,6 +1929,39 @@ static void direct_link_action(FileData *fd, bAction *act) /* ------- */ +static void lib_link_keyingsets(FileData *fd, ID *id, ListBase *list) +{ + KeyingSet *ks; + KS_Path *ksp; + + /* here, we're only interested in the ID pointer stored in some of the paths */ + for (ks= list->first; ks; ks= ks->next) { + for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + ksp->id= newlibadr(fd, id->lib, ksp->id); + } + } +} + +/* NOTE: this assumes that link_list has already been called on the list */ +static void direct_link_keyingsets(FileData *fd, ListBase *list) +{ + KeyingSet *ks; + KS_Path *ksp; + + /* link KeyingSet data to KeyingSet again (non ID-libs) */ + for (ks= list->first; ks; ks= ks->next) { + /* paths */ + link_list(fd, &ks->paths); + + for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + /* rna path */ + ksp->rna_path= newdataadr(fd, ksp->rna_path); + } + } +} + +/* ------- */ + static void lib_link_animdata(FileData *fd, ID *id, AnimData *adt) { if (adt == NULL) @@ -3698,6 +3731,8 @@ static void lib_link_scene(FileData *fd, Main *main) if (sce->id.properties) IDP_LibLinkProperty(sce->id.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); if (sce->adt) lib_link_animdata(fd, &sce->id, sce->adt); + lib_link_keyingsets(fd, &sce->id, &sce->keyingsets); + sce->camera= newlibadr(fd, sce->id.lib, sce->camera); sce->world= newlibadr_us(fd, sce->id.lib, sce->world); sce->set= newlibadr(fd, sce->id.lib, sce->set); @@ -3791,6 +3826,9 @@ static void direct_link_scene(FileData *fd, Scene *sce) sce->adt= newdataadr(fd, sce->adt); direct_link_animdata(fd, sce->adt); + link_list(fd, &sce->keyingsets); + direct_link_keyingsets(fd, &sce->keyingsets); + sce->basact= newdataadr(fd, sce->basact); sce->radio= newdataadr(fd, sce->radio); @@ -9124,6 +9162,19 @@ static void expand_action(FileData *fd, Main *mainvar, bAction *act) } } +static void expand_keyingsets(FileData *fd, Main *mainvar, ListBase *list) +{ + KeyingSet *ks; + KS_Path *ksp; + + /* expand the ID-pointers in KeyingSets's paths */ + for (ks= list->first; ks; ks= ks->next) { + for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + expand_doit(fd, mainvar, ksp->id); + } + } +} + static void expand_animdata(FileData *fd, Main *mainvar, AnimData *adt) { FCurve *fcd; @@ -9655,6 +9706,7 @@ static void expand_scene(FileData *fd, Main *mainvar, Scene *sce) if(sce->adt) expand_animdata(fd, mainvar, sce->adt); + expand_keyingsets(fd, mainvar, &sce->keyingsets); if(sce->nodetree) expand_nodetree(fd, mainvar, sce->nodetree); diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 9c94842ac08..623d1eebe31 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -855,6 +855,26 @@ static void write_actions(WriteData *wd, ListBase *idbase) mywrite(wd, MYWRITE_FLUSH, 0); } +static void write_keyingsets(WriteData *wd, ListBase *list) +{ + KeyingSet *ks; + KS_Path *ksp; + + for (ks= list->first; ks; ks= ks->next) { + /* KeyingSet */ + writestruct(wd, DATA, "KeyingSet", 1, ks); + + /* Paths */ + for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + /* Path */ + writestruct(wd, DATA, "KS_Path", 1, ksp); + + if (ksp->rna_path) + writedata(wd, DATA, strlen(ksp->rna_path)+1, ksp->rna_path); + } + } +} + static void write_animdata(WriteData *wd, AnimData *adt) { AnimOverride *aor; @@ -1533,6 +1553,7 @@ static void write_scenes(WriteData *wd, ListBase *scebase) if (sce->id.properties) IDP_WriteProperty(sce->id.properties, wd); if (sce->adt) write_animdata(wd, sce->adt); + write_keyingsets(wd, &sce->keyingsets); /* direct data */ base= sce->base.first; @@ -1616,9 +1637,9 @@ static void write_scenes(WriteData *wd, ListBase *scebase) writestruct(wd, DATA, "MetaStack", 1, ms); } } - + write_scriptlink(wd, &sce->scriptlink); - + if (sce->r.avicodecdata) { writestruct(wd, DATA, "AviCodecData", 1, sce->r.avicodecdata); if (sce->r.avicodecdata->lpFormat) writedata(wd, DATA, sce->r.avicodecdata->cbFormat, sce->r.avicodecdata->lpFormat); diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index df3a7b85a45..42ed4fddc99 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -30,6 +30,7 @@ #include "BKE_fcurve.h" #include "BKE_utildefines.h" #include "BKE_context.h" +#include "BKE_report.h" #include "BKE_key.h" #include "BKE_material.h" @@ -39,6 +40,8 @@ #include "ED_screen.h" #include "ED_util.h" +#include "UI_interface.h" + #include "WM_api.h" #include "WM_types.h" @@ -63,35 +66,6 @@ typedef struct bCommonKeySrc { bPoseChannel *pchan; /* only needed when doing recalcs... */ } bCommonKeySrc; -/* -------------- Keying Sets ------------------- */ - -#if 0 // XXX I'm not sure how these will work for now... - -/* keying set - a set of channels that will be keyframed together */ -// TODO: move this to a header to allow custom sets someday? -typedef struct bKeyingSet { - /* callback func to consider if keyingset should be included - * (by default, if this is undefined, item will be shown) - */ - short (*include_cb)(struct bKeyingSet *, const char *); - - char name[48]; /* name of keyingset */ - int blocktype; /* nearest ID-blocktype to where data can be found */ - short flag; /* flags to use when setting keyframes */ - - short chan_num; /* number of channels to insert keyframe in */ - char (*paths)[256]; /* adrcodes for channels to insert keys for (ideally would be variable-len, but limit of 32 will suffice) */ -} bKeyingSet; - -/* keying set context - an array of keying sets and the number of them */ -typedef struct bKeyingContext { - bKeyingSet *keyingsets; /* array containing the keyingsets of interest */ - bKeyingSet *lastused; /* item that was chosen last time*/ - int tot; /* number of keyingsets in */ -} bKeyingContext; - -#endif - /* ******************************************* */ /* Animation Data Validation */ @@ -184,7 +158,7 @@ FCurve *verify_fcurve (ID *id, const char group[], const char rna_path[], const /* -------------- BezTriple Insertion -------------------- */ /* threshold for inserting keyframes - threshold here should be good enough for now, but should become userpref */ -#define BEZT_INSERT_THRESH 0.00001 +#define BEZT_INSERT_THRESH 0.00001f /* Binary search algorithm for finding where to insert BezTriple. (for use by insert_bezt_icu) * Returns the index to insert at (data already at that index will be offset if replace is 0) @@ -899,6 +873,37 @@ enum { COMMONKEY_MODE_DELETE, } eCommonModifyKey_Modes; + +/* Build menu-string of available keying-sets (allocates memory for string) + * NOTE: mode must not be longer than 64 chars + */ +char *ANIM_build_keyingsets_menu (ListBase *list) +{ + DynStr *pupds= BLI_dynstr_new(); + KeyingSet *ks; + char buf[64]; + char *str; + + /* add title first */ + BLI_dynstr_append(pupds, "Keying Sets%t|"); + + /* add dummy entry for none-active */ + BLI_dynstr_append(pupds, "%x0|"); + + /* loop through keyingsets, adding them */ + for (ks= list->first; ks; ks= ks->next) { + BLI_dynstr_append(pupds, ks->name); + BLI_snprintf( buf, 64, "%s", ((ks->next)?"|":"") ); + BLI_dynstr_append(pupds, buf); + } + + /* convert to normal MEM_malloc'd string */ + str= BLI_dynstr_get_cstring(pupds); + BLI_dynstr_free(pupds); + + return str; +} + #if 0 // XXX old keyingsets code based on adrcodes... to be restored in due course /* --------- KeyingSet Adrcode Getters ------------ */ @@ -1786,57 +1791,6 @@ static void commonkey_context_refresh (bContext *C) /* --- */ -/* Build menu-string of available keying-sets (allocates memory for string) - * NOTE: mode must not be longer than 64 chars - */ -static char *build_keyingsets_menu (bKeyingContext *ksc, const char mode[48]) -{ - DynStr *pupds= BLI_dynstr_new(); - bKeyingSet *ks; - char buf[64]; - char *str; - int i, n; - - /* add title first */ - BLI_snprintf(buf, 64, "%s Key %%t|", mode); - BLI_dynstr_append(pupds, buf); - - /* loop through keyingsets, adding them */ - for (ks=ksc->keyingsets, i=0, n=1; i < ksc->tot; ks++, i++, n++) { - /* check if keyingset can be used */ - if (ks->flag == -1) { - /* optional separator? */ - if (ks->include_cb) { - if (ks->include_cb(ks, mode)) { - BLI_snprintf( buf, 64, "%s%s", ks->name, ((n < ksc->tot)?"|":"") ); - BLI_dynstr_append(pupds, buf); - } - } - else { - BLI_snprintf( buf, 64, "%%l%s", ((n < ksc->tot)?"|":"") ); - BLI_dynstr_append(pupds, buf); - } - } - else if ( (ks->include_cb==NULL) || (ks->include_cb(ks, mode)) ) { - /* entry can be included */ - BLI_dynstr_append(pupds, ks->name); - - /* check if special "shapekey" entry */ - if (ks->flag == -3) - BLI_snprintf( buf, 64, "%%x0%s", ((n < ksc->tot)?"|":"") ); - else - BLI_snprintf( buf, 64, "%%x%d%s", n, ((n < ksc->tot)?"|":"") ); - BLI_dynstr_append(pupds, buf); - } - } - - /* convert to normal MEM_malloc'd string */ - str= BLI_dynstr_get_cstring(pupds); - BLI_dynstr_free(pupds); - - return str; -} - /* Get the keying set that was chosen by the user from the menu */ static bKeyingSet *get_keyingset_fromcontext (bKeyingContext *ksc, short index) { @@ -2033,6 +1987,68 @@ void common_modifykey (bContext *C, short mode) #endif // XXX old keyingsets code based on adrcodes... to be restored in due course +/* Given a KeyingSet and context info (if required), modify keyframes for the channels specified + * by the KeyingSet. This takes into account many of the different combinations of using KeyingSets. + * Returns the number of channels that keyframes were added to + */ +static int commonkey_modifykey (ListBase *dsources, KeyingSet *ks, short mode, float cfra) +{ + KS_Path *ksp; + int kflag, success= 0; + char *groupname= NULL; + + /* get flags to use */ + if (mode == COMMONKEY_MODE_INSERT) { + /* use KeyingSet's flags as base */ + kflag= ks->keyingflag; + + /* suppliment with info from the context */ + if (IS_AUTOKEY_FLAG(AUTOMATKEY)) kflag |= INSERTKEY_MATRIX; + if (IS_AUTOKEY_FLAG(INSERTNEEDED)) kflag |= INSERTKEY_NEEDED; + // if (IS_AUTOKEY_MODE(EDITKEYS)) flag |= INSERTKEY_REPLACE; + } + else if (mode == COMMONKEY_MODE_DELETE) + kflag= 0; + + + /* check if the KeyingSet is absolute or not (i.e. does it requires sources info) */ + if (ks->flag & KEYINGSET_ABSOLUTE) { + /* Absolute KeyingSets are simpler to use, as all the destination info has already been + * provided by the user, and is stored, ready to use, in the KeyingSet paths. + */ + for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + /* get pointer to name of group to add channels to */ + if (ksp->flag & KSP_FLAG_GROUP_NONE) + groupname= NULL; + else if (ksp->flag & KSP_FLAG_GROUP_KSNAME) + groupname= ks->name; + else + groupname= ksp->group; + + /* action to take depends on mode */ + if (mode == COMMONKEY_MODE_INSERT) + success+= insertkey(ksp->id, groupname, ksp->rna_path, ksp->array_index, cfra, kflag); + else if (mode == COMMONKEY_MODE_DELETE) + success+= deletekey(ksp->id, groupname, ksp->rna_path, ksp->array_index, cfra, kflag); + } + } +#if 0 // XXX still need to figure out how to get such keyingsets working + else if (dsources) { + /* for each one of the 'sources', resolve the template markers and expand arrays, then insert keyframes */ + bCommonKeySrc *cks; + char *path = NULL; + int index=0, tot=0; + + /* for each 'source' for keyframe data, resolve each of the paths from the KeyingSet */ + for (cks= dsources->first; cks; cks= cks->next) { + + } + } +#endif // XXX still need to figure out how to get such + + return success; +} + /* Insert Key Operator ------------------------ */ /* XXX WARNING: @@ -2046,15 +2062,49 @@ void common_modifykey (bContext *C, short mode) /* defines for basic insert-key testing operator */ // XXX this will definitely be replaced EnumPropertyItem prop_insertkey_types[] = { - {0, "OBLOC", "Object Location", ""}, - {1, "OBROT", "Object Rotation", ""}, - {2, "OBSCALE", "Object Scale", ""}, - {3, "MAT_COL", "Active Material - Color", ""}, - {4, "PCHANLOC", "Pose-Channel Location", ""}, - {5, "PCHANROT", "Pose-Channel Rotation", ""}, - {6, "PCHANSCALE", "Pose-Channel Scale", ""}, + {0, "KEYINGSET", "Active KeyingSet", ""}, + {1, "OBLOC", "Object Location", ""}, + {2, "OBROT", "Object Rotation", ""}, + {3, "OBSCALE", "Object Scale", ""}, + {4, "MAT_COL", "Active Material - Color", ""}, + {5, "PCHANLOC", "Pose-Channel Location", ""}, + {6, "PCHANROT", "Pose-Channel Rotation", ""}, + {7, "PCHANSCALE", "Pose-Channel Scale", ""}, {0, NULL, NULL, NULL} }; + +static int insert_key_invoke (bContext *C, wmOperator *op, wmEvent *event) +{ + Object *ob= CTX_data_active_object(C); + uiMenuItem *head; + + if (ob == NULL) + return OPERATOR_CANCELLED; + + head= uiPupMenuBegin("Insert Keyframe", 0); + + /* active keyingset */ + uiMenuItemEnumO(head, "", 0, "ANIM_OT_insert_keyframe", "type", 0); + + /* selective inclusion */ + if ((ob->pose) && (ob->flag & OB_POSEMODE)) { + /* bone types */ + uiMenuItemEnumO(head, "", 0, "ANIM_OT_insert_keyframe", "type", 5); + uiMenuItemEnumO(head, "", 0, "ANIM_OT_insert_keyframe", "type", 6); + uiMenuItemEnumO(head, "", 0, "ANIM_OT_insert_keyframe", "type", 7); + } + else { + /* object types */ + uiMenuItemEnumO(head, "", 0, "ANIM_OT_insert_keyframe", "type", 1); + uiMenuItemEnumO(head, "", 0, "ANIM_OT_insert_keyframe", "type", 2); + uiMenuItemEnumO(head, "", 0, "ANIM_OT_insert_keyframe", "type", 3); + uiMenuItemEnumO(head, "", 0, "ANIM_OT_insert_keyframe", "type", 4); + } + + uiPupMenuEnd(C, head); + + return OPERATOR_CANCELLED; +} static int insert_key_exec (bContext *C, wmOperator *op) { @@ -2062,6 +2112,34 @@ static int insert_key_exec (bContext *C, wmOperator *op) short mode= RNA_enum_get(op->ptr, "type"); float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap + /* for now, handle 'active keyingset' one separately */ + if (mode == 0) { + ListBase dsources = {NULL, NULL}; + KeyingSet *ks= NULL; + short success; + + /* try to get KeyingSet */ + if (scene->active_keyingset > 0) + ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); + /* report failure */ + if (ks == NULL) { + BKE_report(op->reports, RPT_ERROR, "No active Keying Set"); + return OPERATOR_CANCELLED; + } + + /* try to insert keyframes for the channels specified by KeyingSet */ + success= commonkey_modifykey(&dsources, ks, COMMONKEY_MODE_INSERT, cfra); + printf("KeyingSet '%s' - Successfully added %d Keyframes \n", ks->name, success); + + /* report failure */ + if (success == 0) { + BKE_report(op->reports, RPT_WARNING, "Keying Set failed to insert any keyframes"); + return OPERATOR_CANCELLED; // XXX? + } + else + return OPERATOR_FINISHED; + } + // XXX more comprehensive tests will be needed CTX_DATA_BEGIN(C, Base*, base, selected_bases) { @@ -2073,24 +2151,24 @@ static int insert_key_exec (bContext *C, wmOperator *op) if (mode < 4) { /* object-based keyframes */ switch (mode) { - case 3: /* color of active material (only for geometry...) */ + case 4: /* color of active material (only for geometry...) */ // NOTE: this is just a demo... but ideally we'd go through materials instead of active one only so reference stays same // XXX no group for now success+= insertkey(id, NULL, "active_material.diffuse_color", 0, cfra, 0); success+= insertkey(id, NULL, "active_material.diffuse_color", 1, cfra, 0); success+= insertkey(id, NULL, "active_material.diffuse_color", 2, cfra, 0); break; - case 2: /* object scale */ + case 3: /* object scale */ success+= insertkey(id, "Object Transforms", "scale", 0, cfra, 0); success+= insertkey(id, "Object Transforms", "scale", 1, cfra, 0); success+= insertkey(id, "Object Transforms", "scale", 2, cfra, 0); break; - case 1: /* object rotation */ + case 2: /* object rotation */ success+= insertkey(id, "Object Transforms", "rotation", 0, cfra, 0); success+= insertkey(id, "Object Transforms", "rotation", 1, cfra, 0); success+= insertkey(id, "Object Transforms", "rotation", 2, cfra, 0); break; - default: /* object location */ + case 1: /* object location */ success+= insertkey(id, "Object Transforms", "location", 0, cfra, 0); success+= insertkey(id, "Object Transforms", "location", 1, cfra, 0); success+= insertkey(id, "Object Transforms", "location", 2, cfra, 0); @@ -2167,7 +2245,7 @@ void ANIM_OT_insert_keyframe (wmOperatorType *ot) ot->idname= "ANIM_OT_insert_keyframe"; /* callbacks */ - ot->invoke= WM_menu_invoke; // XXX we will need our own one eventually, to cope with the dynamic menus... + ot->invoke= insert_key_invoke; ot->exec= insert_key_exec; ot->poll= ED_operator_areaactive; diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index 91dbbec873f..e7441188fc3 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -31,6 +31,8 @@ struct ListBase; struct ID; +struct KeyingSet; + struct FCurve; struct BezTriple; @@ -81,6 +83,9 @@ short insertkey(struct ID *id, const char group[], const char rna_path[], int ar short deletekey(struct ID *id, const char group[], const char rna_path[], int array_index, float cfra, short flag); +/* Generate menu of KeyingSets */ +char *ANIM_build_keyingsets_menu(struct ListBase *list); + /* Main Keyframe Management operators: * These handle keyframes management from various spaces. They will handle the menus * required for each space. diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 9b3852e63bf..ccee97ad605 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -867,7 +867,7 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) offset += 17; } else { - /* for ipo/constraint channels */ + /* for normal channels */ UI_icon_draw(x+offset, yminc, special); offset += 17; } diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 7adb90e7464..8df483b9048 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -689,7 +689,6 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) int items, i; /* build list of curves to draw */ - // XXX enable ANIMFILTER_CURVEVISIBLE when we have a method to set them filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CURVESONLY|ANIMFILTER_CURVEVISIBLE); items= ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); @@ -1135,7 +1134,7 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) offset += 17; } else { - /* for ipo/constraint channels */ + /* for normal channels */ UI_icon_draw(x+offset, yminc, special); offset += 17; } diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index fbc475d3bdd..11d8cf50d4b 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -64,6 +64,7 @@ #include "IMB_imbuf_types.h" +#include "BKE_animsys.h" #include "BKE_constraint.h" #include "BKE_context.h" #include "BKE_deform.h" @@ -3086,6 +3087,45 @@ void outliner_operation_menu(Scene *scene, ARegion *ar, SpaceOops *soops) } } +/* ***************** KEYINGSET OPERATIONS *************** */ + +/* These operators are only available in databrowser mode for now, as + * they depend on having RNA paths and/or hierarchies available. + */ + +/* find the 'active' KeyingSet, and add if not found (if adding is allowed) */ +// TODO: should this be an API func? +static KeyingSet *verify_active_keyingset(Scene *scene, short add) +{ + KeyingSet *ks= NULL; + + /* try to find one from scene */ + if (scene->active_keyingset > 0) + ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); + + /* add if none found */ + // XXX the default settings have yet to evolve + if ((add) && (ks==NULL)) + ks= BKE_keyingset_add(&scene->keyingsets, "KeyingSet", KEYINGSET_ABSOLUTE, 0); + + return ks; +} + +/* ---------------------------------- */ + + +void OUTLINER_OT_keyingset_add_selected(wmOperatorType *ot) +{ + +} + + +/* ---------------------------------- */ + +void OUTLINER_OT_keyingset_remove_selected(wmOperatorType *ot) +{ + +} /* ***************** DRAW *************** */ diff --git a/source/blender/editors/space_outliner/outliner_header.c b/source/blender/editors/space_outliner/outliner_header.c index 2c114f3099b..7add3f85ea0 100644 --- a/source/blender/editors/space_outliner/outliner_header.c +++ b/source/blender/editors/space_outliner/outliner_header.c @@ -44,6 +44,7 @@ #include "BKE_main.h" #include "BKE_screen.h" +#include "ED_keyframing.h" #include "ED_screen.h" #include "ED_util.h" #include "ED_types.h" diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index e7e75833d43..067c14dc257 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -119,6 +119,8 @@ void outliner_select(struct SpaceOops *soops, struct ListBase *lb, int *index, s void draw_outliner(const struct bContext *C); void OUTLINER_OT_activate_click(struct wmOperatorType *ot); +void OUTLINER_OT_keyingset_add_selected(struct wmOperatorType *ot); +void OUTLINER_OT_keyingset_remove_selected(struct wmOperatorType *ot); #if 0 extern void outliner_mouse_event(Scene *scene, ARegion *ar, SpaceOops *soops, short event); diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c index 7d1155cb5d7..295d7ade97c 100644 --- a/source/blender/editors/space_outliner/outliner_ops.c +++ b/source/blender/editors/space_outliner/outliner_ops.c @@ -44,6 +44,9 @@ void outliner_operatortypes(void) { WM_operatortype_append(OUTLINER_OT_activate_click); + + WM_operatortype_append(OUTLINER_OT_keyingset_add_selected); + WM_operatortype_append(OUTLINER_OT_keyingset_remove_selected); } void outliner_keymap(wmWindowManager *wm) @@ -51,6 +54,10 @@ void outliner_keymap(wmWindowManager *wm) ListBase *keymap= WM_keymap_listbase(wm, "Outliner", SPACE_OOPS, 0); WM_keymap_verify_item(keymap, "OUTLINER_OT_activate_click", LEFTMOUSE, KM_PRESS, 0, 0); + + /* keying sets - only for databrowse */ + WM_keymap_verify_item(keymap, "OUTLINER_OT_keyingset_add_selected", KKEY, KM_PRESS, 0, 0); + WM_keymap_verify_item(keymap, "OUTLINER_OT_keyingset_remove_selected", KKEY, KM_PRESS, KM_ALT, 0); } diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c index 65946a4288b..1f03530b680 100644 --- a/source/blender/editors/space_time/time_header.c +++ b/source/blender/editors/space_time/time_header.c @@ -43,6 +43,7 @@ #include "BKE_global.h" #include "BKE_screen.h" +#include "ED_keyframing.h" #include "ED_screen.h" #include "ED_types.h" #include "ED_util.h" @@ -429,6 +430,7 @@ void time_header_buttons(const bContext *C, ARegion *ar) Scene *scene= CTX_data_scene(C); uiBlock *block; int xco, yco= 3; + char *menustr= NULL; block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS, UI_HELV); uiBlockSetHandleFunc(block, do_time_buttons, NULL); @@ -539,12 +541,21 @@ void time_header_buttons(const bContext *C, ARegion *ar) xco+= 16; - uiDefIconBut(block, BUT, B_TL_INSERTKEY, ICON_KEY_HLT, - xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Insert Keyframe for the context of the largest area (IKEY)"); - xco+= XIC+4; + + menustr= ANIM_build_keyingsets_menu(&scene->keyingsets); + uiDefButI(block, MENU, B_DIFF, + menustr, + xco, yco, (int)5.5*XIC, YIC, &(scene->active_keyingset), 0, 1, 0, 0, + "Active Keying Set (i.e. set of channels to Insert Keyframes for)"); + MEM_freeN(menustr); + xco+= (6*XIC); + uiDefIconBut(block, BUT, B_TL_DELETEKEY, ICON_KEY_DEHLT, xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Delete Keyframe for the context of the largest area (ALTKEY-IKEY)"); xco+= XIC+4; + uiDefIconBut(block, BUT, B_TL_INSERTKEY, ICON_KEY_HLT, + xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Insert Keyframe for the context of the largest area (IKEY)"); + xco+= XIC+4; xco+= 16; diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index 556d52e4aff..c1c5dec52a7 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -78,6 +78,7 @@ #include "ED_armature.h" #include "ED_curve.h" #include "ED_editparticle.h" +#include "ED_keyframing.h" #include "ED_mesh.h" #include "ED_object.h" #include "ED_screen.h" diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index 17a552ad7e0..68564b1ee73 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -421,6 +421,77 @@ enum { NLATRACK_TWEAK = (1<<5), } eNlaTrack_Flag; + +/* ************************************ */ +/* KeyingSet Datatypes */ + +/* Path for use in KeyingSet definitions (ksp) + * + * Paths may be either specific (specifying the exact sub-ID + * dynamic data-block - such as PoseChannels - to act upon, ala + * Maya's 'Character Sets' and XSI's 'Marking Sets'), or they may + * be generic (using various placeholder template tags that will be + * replaced with appropriate information from the context). + */ +// TODO: how should templates work exactly? For now, we only implement the specific KeyingSets... +typedef struct KS_Path { + struct KS_Path *next, *prev; + + /* absolute paths only */ + ID *id; /* ID block that keyframes are for */ + char group[64]; /* name of the group to add to */ + + /* all paths */ + char *rna_path; /* dynamically (or statically in the case of predefined sets) path */ + int array_index; /* index that path affects */ + + int flag; /* various settings, etc. */ +} KS_Path; + +/* KS_Path->flag */ +enum { + /* entire array (not just the specified index) gets keyframed */ + KSP_FLAG_WHOLE_ARRAY = (1<<0), + + /* path should not be grouped at all */ + KSP_FLAG_GROUP_NONE = (1<<10), + /* path should be grouped under an ActionGroup KeyingSet's name */ + KSP_FLAG_GROUP_KSNAME = (1<<11), +} eKSP_Settings; + +/* ---------------- */ + +/* KeyingSet definition (ks) + * + * A KeyingSet defines a group of properties that should + * be keyframed together, providing a convenient way for animators + * to insert keyframes without resorting to Auto-Keyframing. + * + * A few 'generic' (non-absolute and dependant on templates) KeyingSets + * are defined 'built-in' to facilitate easy animating for the casual + * animator without the need to add extra steps to the rigging process. + */ +typedef struct KeyingSet { + struct KeyingSet *next, *prev; + + ListBase paths; /* (KS_Path) paths to keyframe to */ + + char name[64]; /* user-viewable name for KeyingSet (for menus, etc.) */ + + int flag; /* settings for KeyingSet */ + int keyingflag; /* settings to supply insertkey() with */ +} KeyingSet; + +/* KeyingSet settings */ +enum { + /* keyingset cannot be removed (and doesn't need to be freed) */ + KEYINGSET_BUILTIN = (1<<0), + /* keyingset is the one currently in use */ + KEYINGSET_ACTIVE = (1<<1), + /* keyingset does not depend on context info (i.e. paths are absolute) */ + KEYINGSET_ABSOLUTE = (1<<2), +} eKS_Settings; + /* ************************************************ */ /* Animation Data */ diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index ac3f7e69399..7b618502089 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -537,7 +537,7 @@ typedef struct Scene { short proportional, prop_mode; short automerge, pad5, pad6; - short autokey_mode; /* mode for autokeying (defines in DNA_userdef_types.h */ + short autokey_mode; /* mode for autokeying (defines in DNA_userdef_types.h) */ short use_nodes; @@ -571,7 +571,10 @@ typedef struct Scene { /* frame step. */ int frame_step; - int pad; + + /* User-Defined KeyingSets */ + int active_keyingset; /* index of the active KeyingSet. first KeyingSet has index 1 */ + ListBase keyingsets; /* KeyingSets for the given frame */ } Scene; From 1a039aaf71da9daaa2c53fe23467532211f8d896 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 11 Feb 2009 14:56:35 +0000 Subject: [PATCH 45/63] 2.5: fix crash due to keyingset commit, ot->idname should always be set. --- source/blender/editors/space_outliner/outliner.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 11d8cf50d4b..7d06c98577d 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -3116,7 +3116,8 @@ static KeyingSet *verify_active_keyingset(Scene *scene, short add) void OUTLINER_OT_keyingset_add_selected(wmOperatorType *ot) { - + ot->idname= "OUTLINER_OT_keyingset_add_selected"; + ot->name= "Keyingset Add Selected"; } @@ -3124,7 +3125,8 @@ void OUTLINER_OT_keyingset_add_selected(wmOperatorType *ot) void OUTLINER_OT_keyingset_remove_selected(wmOperatorType *ot) { - + ot->idname= "OUTLINER_OT_keyingset_remove_selected"; + ot->name= "Keyingset Remove Selected"; } /* ***************** DRAW *************** */ From f3c67b070fc6baa18cd84aee26170d8ac6ee98ab Mon Sep 17 00:00:00 2001 From: Roland Hess Date: Wed, 11 Feb 2009 16:17:34 +0000 Subject: [PATCH 46/63] First operator done as a test and to get to know the ropes. "Select Parent" in pose mode. Had to move the command to Shift-P, as naked P is taken up by some crazy person's script command. --- .../editors/armature/armature_intern.h | 1 + .../blender/editors/armature/armature_ops.c | 4 ++ .../blender/editors/armature/editarmature.c | 37 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index 2e021c2f4ae..a6fa50cfc6a 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -49,6 +49,7 @@ void POSE_OT_rot_clear(struct wmOperatorType *ot); void POSE_OT_loc_clear(struct wmOperatorType *ot); void POSE_OT_scale_clear(struct wmOperatorType *ot); void POSE_OT_de_select_all(struct wmOperatorType *ot); +void POSE_OT_select_parent(struct wmOperatorType *ot); #endif /* ED_ARMATURE_INTERN_H */ diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index 65345094720..5f482e13183 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -129,6 +129,8 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_scale_clear); WM_operatortype_append(POSE_OT_de_select_all); + + WM_operatortype_append(POSE_OT_select_parent); WM_operatortype_append(ARMATURE_OT_test); // XXX temp test for context iterators... to be removed } @@ -172,5 +174,7 @@ void ED_keymap_armature(wmWindowManager *wm) WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_de_select_all", AKEY, KM_PRESS, 0, 0); + + WM_keymap_add_item(keymap, "POSE_OT_select_parent", PKEY, KM_PRESS, KM_SHIFT, 0); } diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index e18497c42c8..125f9bb889d 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -4420,6 +4420,43 @@ void POSE_OT_de_select_all(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int pose_select_parent_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + bArmature *arm= ob->data; + bPoseChannel *pchan,*parent; + + /* Determine if there is an active bone */ + pchan=CTX_data_active_pchan(C); + if (pchan) { + parent=pchan->parent; + if ((parent) && !(parent->bone->flag & BONE_HIDDEN_P)) { + parent->bone->flag |= BONE_SELECTED; + parent->bone->flag |= BONE_ACTIVE; + pchan->bone->flag &= ~BONE_ACTIVE; + } + } + + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL); + + return OPERATOR_FINISHED; +} + +void POSE_OT_select_parent(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "select parent bone"; + ot->idname= "POSE_OT_select_parent"; + + /* api callbacks */ + ot->exec= pose_select_parent_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + } /* ************* hide/unhide pose bones ******************* */ From 2e79e4e9751aa44da905fb0646d8b9b8b4f9d825 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 11 Feb 2009 16:54:55 +0000 Subject: [PATCH 47/63] 2.5 Smaller jobs, all in one commit! - Moved object_do_update out of view3d drawing, into the event system (currently after notifiers). Depsgraph calls for setting update flags will have to keep track of each Screen's needs, so a UI showing only a Sequencer doesn't do objects. - Added button in "Properties region" in 3D window to set or disable 4-split, including the 3 options it has. (lock, box, clip) - Restored legacy code for UI, to make things work like bone rename, autocomplete. - Node editor now shows Curves widgets again - Bugfix: composite job increased Viewer user id count - Bugfix: Node editor, not "Enable nodes" still called a Job, which didn't do anything - Various code cleaning, unused vars and prototypes. --- source/blender/blenkernel/intern/node.c | 3 +- .../blender/editors/armature/editarmature.c | 4 +- source/blender/editors/include/UI_interface.h | 22 + source/blender/editors/interface/interface.c | 9 +- .../editors/interface/interface_draw.c | 12 +- .../editors/interface/interface_intern.h | 7 +- .../editors/interface/interface_utils.c | 460 ++++++++++++++++++ source/blender/editors/object/object_edit.c | 2 - source/blender/editors/physics/ed_fluidsim.c | 2 +- .../editors/space_action/action_header.c | 2 +- source/blender/editors/space_node/drawnode.c | 12 +- .../blender/editors/space_node/space_node.c | 8 +- .../editors/space_view3d/view3d_buttons.c | 93 +++- .../editors/space_view3d/view3d_draw.c | 19 +- .../editors/space_view3d/view3d_edit.c | 22 +- .../editors/space_view3d/view3d_intern.h | 2 + source/blender/makesdna/DNA_view3d_types.h | 1 + .../windowmanager/intern/wm_event_system.c | 19 + 18 files changed, 636 insertions(+), 63 deletions(-) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 65a935c1349..89d00cc8f06 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1012,8 +1012,7 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal) oldsock->new_sock= sock; } - if(nnode->id) - nnode->id->us++; + /* don't increase node->id users, freenode doesn't decrement either */ if(node->typeinfo->copystoragefunc) node->typeinfo->copystoragefunc(node, nnode); diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 125f9bb889d..9dfd356ce43 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -4386,7 +4386,6 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op) Object *ob= CTX_data_active_object(C); bArmature *arm= ob->data; bPoseChannel *pchan; - EditBone *ebone; int sel=1; /* Determine if there are any selected bones @@ -4425,7 +4424,6 @@ void POSE_OT_de_select_all(wmOperatorType *ot) static int pose_select_parent_exec(bContext *C, wmOperator *op) { Object *ob= CTX_data_active_object(C); - bArmature *arm= ob->data; bPoseChannel *pchan,*parent; /* Determine if there is an active bone */ @@ -4439,7 +4437,7 @@ static int pose_select_parent_exec(bContext *C, wmOperator *op) } } - WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL); + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index ab35089549b..7826c0b86b2 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -513,6 +513,28 @@ void UI_add_region_handlers(struct ListBase *handlers); void UI_add_area_handlers(struct ListBase *handlers); void UI_add_popup_handlers(struct ListBase *handlers, uiPopupBlockHandle *menu); +/* Legacy code + * Callbacks and utils to get 2.48 work */ + +void test_idbutton_cb(struct bContext *C, void *namev, void *arg2); +void test_scriptpoin_but(struct bContext *C, char *name, ID **idpp); +void test_actionpoin_but(struct bContext *C, char *name, ID **idpp); +void test_obpoin_but(struct bContext *C, char *name, ID **idpp); +void test_meshobpoin_but(struct bContext *C, char *name, ID **idpp); +void test_meshpoin_but(struct bContext *C, char *name, ID **idpp); +void test_matpoin_but(struct bContext *C, char *name, ID **idpp); +void test_scenepoin_but(struct bContext *C, char *name, ID **idpp); +void test_grouppoin_but(struct bContext *C, char *name, ID **idpp); +void test_texpoin_but(struct bContext *C, char *name, ID **idpp); +void test_imapoin_but(struct bContext *C, char *name, ID **idpp); +void autocomplete_bone(struct bContext *C, char *str, void *arg_v); +void autocomplete_vgroup(struct bContext *C, char *str, void *arg_v); + +struct CurveMapping; +struct rctf; +void curvemap_buttons(uiBlock *block, struct CurveMapping *cumap, char labeltype, short event, short redraw, struct rctf *rect); + + /* Module * * init and exit should be called before using this module. init_userdef must diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index a2f272767cb..c2c15a4cd5c 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -624,6 +624,7 @@ void uiEndBlock(const bContext *C, uiBlock *block) void uiDrawBlock(const bContext *C, uiBlock *block) { + ARegion *ar= CTX_wm_region(C); uiBut *but; if(!block->endblock) @@ -640,7 +641,7 @@ void uiDrawBlock(const bContext *C, uiBlock *block) if(block->drawextra) block->drawextra(C, block); for (but= block->buttons.first; but; but= but->next) - ui_draw_but(but); + ui_draw_but(ar, but); ui_draw_links(block); } @@ -863,11 +864,11 @@ static int ui_do_but_LINK(uiBlock *block, uiBut *but) bt= ui_get_valid_link_button(block, but, mval); if(bt) { bt->flag |= UI_ACTIVE; - ui_draw_but(bt); + ui_draw_but(ar, bt); } if(bto && bto!=bt) { bto->flag &= ~UI_ACTIVE; - ui_draw_but(bto); + ui_draw_but(ar, bto); } bto= bt; @@ -965,7 +966,7 @@ static void edit_but(uiBlock *block, uiBut *but, uiEvent *uevent) but->x2 += dx; but->y2 += dy; - ui_draw_but(but); + ui_draw_but(ar, but); ui_block_flush_back(but->block); didit= 1; diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index 26a15bc05c9..5be578c4d50 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -2975,7 +2975,7 @@ static void ui_draw_but_curve_grid(uiBut *but, float zoomx, float zoomy, float o } -static void ui_draw_but_CURVE(uiBut *but) +static void ui_draw_but_CURVE(ARegion *ar, uiBut *but) { CurveMapping *cumap; CurveMap *cuma; @@ -2990,10 +2990,10 @@ static void ui_draw_but_CURVE(uiBut *but) /* need scissor test, curve can draw outside of boundary */ glGetIntegerv(GL_VIEWPORT, scissor); fx= but->x1; fy= but->y1; - /* XXX 2.50 need context: ui_graphics_to_window(but->win, &fx, &fy); */ + ui_block_to_window_fl(ar, but->block, &fx, &fy); dx= but->x2; dy= but->y2; - /* XXX 2.50 need context: ui_graphics_to_window(but->win, &dx, &dy); */ - //glScissor((int)floor(fx), (int)floor(fy), (int)ceil(dx-fx), (int)ceil(dy-fy)); + ui_block_to_window_fl(ar, but->block, &dx, &dy); + glScissor((int)floor(fx), (int)floor(fy), (int)ceil(dx-fx), (int)ceil(dy-fy)); /* calculate offset and zoom */ zoomx= (but->x2-but->x1-2.0*but->aspect)/(cumap->curr.xmax - cumap->curr.xmin); @@ -3254,7 +3254,7 @@ void ui_set_embossfunc(uiBut *but, int drawtype) // note: if you want aligning, adapt the call uiBlockEndAlign in interface.c } -void ui_draw_but(uiBut *but) +void ui_draw_but(ARegion *ar, uiBut *but) { double value; float x1, x2, y1, y2, fac; @@ -3322,7 +3322,7 @@ void ui_draw_but(uiBut *but) ui_draw_but_NORMAL(but); break; case BUT_CURVE: - ui_draw_but_CURVE(but); + ui_draw_but_CURVE(ar, but); break; default: diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 7f35189788f..8e1e8fad4ce 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -313,13 +313,18 @@ void ui_popup_block_free(struct bContext *C, uiPopupBlockHandle *handle); void ui_set_name_menu(uiBut *but, int value); +struct AutoComplete; +struct AutoComplete *autocomplete_begin(char *startname, int maxlen); +void autocomplete_do_name(struct AutoComplete *autocpl, const char *name); +void autocomplete_end(struct AutoComplete *autocpl, char *autoname); + /* interface_panel.c */ extern int ui_handler_panel_region(struct bContext *C, struct wmEvent *event); extern void ui_draw_panel(struct ARegion *ar, uiBlock *block); /* interface_draw.c */ extern void ui_set_embossfunc(uiBut *but, int drawtype); -extern void ui_draw_but(uiBut *but); +extern void ui_draw_but(ARegion *ar, uiBut *but); extern void ui_rasterpos_safe(float x, float y, float aspect); extern void ui_draw_tria_icon(float x, float y, float aspect, char dir); extern void ui_draw_anti_x(float x1, float y1, float x2, float y2); diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index e330d003683..9c18cd381f2 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -29,11 +29,15 @@ #include "MEM_guardedalloc.h" +#include "DNA_action_types.h" +#include "DNA_color_types.h" #include "DNA_listBase.h" #include "DNA_material_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" #include "DNA_windowmanager_types.h" +#include "BKE_colortools.h" #include "BKE_context.h" #include "BKE_idprop.h" #include "BKE_library.h" @@ -45,6 +49,7 @@ #include "UI_interface.h" #include "UI_resources.h" +#include "ED_screen.h" #include "ED_util.h" #include "WM_api.h" @@ -672,3 +677,458 @@ int uiDefIDPoinButs(uiBlock *block, Main *bmain, ID *parid, ID **id_p, int id_co return x; } +/* ****************************** default button callbacks ******************* */ +/* ************ LEGACY WARNING, only to get things work with 2.48 code! ****** */ + +void test_idbutton_cb(struct bContext *C, void *namev, void *arg2) +{ + char *name= namev; + + test_idbutton(name+2); +} + + +void test_scriptpoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + id= CTX_data_main(C)->text.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + return; + } + id= id->next; + } + *idpp= NULL; +} + +void test_actionpoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + id= CTX_data_main(C)->action.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + id_us_plus(id); + *idpp= id; + return; + } + id= id->next; + } + *idpp= NULL; +} + + +void test_obpoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + +// XXX if(idpp == (ID **)&(emptytex.object)) { +// error("You must add a texture first"); +// *idpp= 0; +// return; +// } + + id= CTX_data_main(C)->object.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + id_lib_extern(id); /* checks lib data, sets correct flag for saving then */ + return; + } + id= id->next; + } + *idpp= NULL; +} + +/* tests for an object of type OB_MESH */ +void test_meshobpoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + id = CTX_data_main(C)->object.first; + while(id) { + Object *ob = (Object *)id; + if(ob->type == OB_MESH && strcmp(name, id->name + 2) == 0) { + *idpp = id; + /* checks lib data, sets correct flag for saving then */ + id_lib_extern(id); + return; + } + id = id->next; + } + *idpp = NULL; +} + +void test_meshpoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + if( *idpp ) (*idpp)->us--; + + id= CTX_data_main(C)->mesh.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + id_us_plus(id); + return; + } + id= id->next; + } + *idpp= NULL; +} + +void test_matpoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + if( *idpp ) (*idpp)->us--; + + id= CTX_data_main(C)->mat.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + id_us_plus(id); + return; + } + id= id->next; + } + *idpp= NULL; +} + +void test_scenepoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + if( *idpp ) (*idpp)->us--; + + id= CTX_data_main(C)->scene.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + id_us_plus(id); + return; + } + id= id->next; + } + *idpp= NULL; +} + +void test_grouppoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + if( *idpp ) (*idpp)->us--; + + id= CTX_data_main(C)->group.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + id_us_plus(id); + return; + } + id= id->next; + } + *idpp= NULL; +} + +void test_texpoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + if( *idpp ) (*idpp)->us--; + + id= CTX_data_main(C)->tex.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + id_us_plus(id); + return; + } + id= id->next; + } + *idpp= NULL; +} + +void test_imapoin_but(struct bContext *C, char *name, ID **idpp) +{ + ID *id; + + if( *idpp ) (*idpp)->us--; + + id= CTX_data_main(C)->image.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + id_us_plus(id); + return; + } + id= id->next; + } + *idpp= NULL; +} + +/* autocomplete callback for buttons */ +void autocomplete_bone(struct bContext *C, char *str, void *arg_v) +{ + Object *ob= (Object *)arg_v; + + if(ob==NULL || ob->pose==NULL) return; + + /* search if str matches the beginning of name */ + if(str[0]) { + AutoComplete *autocpl= autocomplete_begin(str, 32); + bPoseChannel *pchan; + + for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) + autocomplete_do_name(autocpl, pchan->name); + + autocomplete_end(autocpl, str); + } +} + +/* autocomplete callback for buttons */ +void autocomplete_vgroup(struct bContext *C, char *str, void *arg_v) +{ + Object *ob= (Object *)arg_v; + + if(ob==NULL) return; + + /* search if str matches the beginning of a name */ + if(str[0]) { + AutoComplete *autocpl= autocomplete_begin(str, 32); + bDeformGroup *dg; + + for(dg= ob->defbase.first; dg; dg= dg->next) + if(dg->name!=str) + autocomplete_do_name(autocpl, dg->name); + + autocomplete_end(autocpl, str); + } +} + + +/* ----------- custom button group ---------------------- */ + +static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *unused) +{ + CurveMapping *cumap = cumap_v; + float d; + + /* we allow 20 times zoom */ + if( (cumap->curr.xmax - cumap->curr.xmin) > 0.04f*(cumap->clipr.xmax - cumap->clipr.xmin) ) { + d= 0.1154f*(cumap->curr.xmax - cumap->curr.xmin); + cumap->curr.xmin+= d; + cumap->curr.xmax-= d; + d= 0.1154f*(cumap->curr.ymax - cumap->curr.ymin); + cumap->curr.ymin+= d; + cumap->curr.ymax-= d; + } +} + +static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *unused) +{ + CurveMapping *cumap = cumap_v; + float d, d1; + + /* we allow 20 times zoom, but dont view outside clip */ + if( (cumap->curr.xmax - cumap->curr.xmin) < 20.0f*(cumap->clipr.xmax - cumap->clipr.xmin) ) { + d= d1= 0.15f*(cumap->curr.xmax - cumap->curr.xmin); + + if(cumap->flag & CUMA_DO_CLIP) + if(cumap->curr.xmin-d < cumap->clipr.xmin) + d1= cumap->curr.xmin - cumap->clipr.xmin; + cumap->curr.xmin-= d1; + + d1= d; + if(cumap->flag & CUMA_DO_CLIP) + if(cumap->curr.xmax+d > cumap->clipr.xmax) + d1= -cumap->curr.xmax + cumap->clipr.xmax; + cumap->curr.xmax+= d1; + + d= d1= 0.15f*(cumap->curr.ymax - cumap->curr.ymin); + + if(cumap->flag & CUMA_DO_CLIP) + if(cumap->curr.ymin-d < cumap->clipr.ymin) + d1= cumap->curr.ymin - cumap->clipr.ymin; + cumap->curr.ymin-= d1; + + d1= d; + if(cumap->flag & CUMA_DO_CLIP) + if(cumap->curr.ymax+d > cumap->clipr.ymax) + d1= -cumap->curr.ymax + cumap->clipr.ymax; + cumap->curr.ymax+= d1; + } +} + +static void curvemap_buttons_setclip(bContext *C, void *cumap_v, void *unused) +{ + CurveMapping *cumap = cumap_v; + + curvemapping_changed(cumap, 0); +} + +static void curvemap_buttons_delete(bContext *C, void *cumap_v, void *unused) +{ + CurveMapping *cumap = cumap_v; + + curvemap_remove(cumap->cm+cumap->cur, SELECT); + curvemapping_changed(cumap, 0); +} + +/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */ +static uiBlock *curvemap_clipping_func(struct bContext *C, struct ARegion *ar, void *cumap_v) +{ + CurveMapping *cumap = cumap_v; + uiBlock *block; + uiBut *bt; + + block= uiBeginBlock(C, ar, "curvemap_clipping_func", UI_EMBOSS, UI_HELV); + + /* use this for a fake extra empy space around the buttons */ + uiDefBut(block, LABEL, 0, "", -4, 16, 128, 106, NULL, 0, 0, 0, 0, ""); + + bt= uiDefButBitI(block, TOG, CUMA_DO_CLIP, 1, "Use Clipping", + 0,100,120,18, &cumap->flag, 0.0, 0.0, 10, 0, ""); + uiButSetFunc(bt, curvemap_buttons_setclip, cumap, NULL); + + uiBlockBeginAlign(block); + uiDefButF(block, NUM, 0, "Min X ", 0,74,120,18, &cumap->clipr.xmin, -100.0, cumap->clipr.xmax, 10, 0, ""); + uiDefButF(block, NUM, 0, "Min Y ", 0,56,120,18, &cumap->clipr.ymin, -100.0, cumap->clipr.ymax, 10, 0, ""); + uiDefButF(block, NUM, 0, "Max X ", 0,38,120,18, &cumap->clipr.xmax, cumap->clipr.xmin, 100.0, 10, 0, ""); + uiDefButF(block, NUM, 0, "Max Y ", 0,20,120,18, &cumap->clipr.ymax, cumap->clipr.ymin, 100.0, 10, 0, ""); + + uiBlockSetDirection(block, UI_RIGHT); + + uiEndBlock(C, block); + return block; +} + + +static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event) +{ + CurveMapping *cumap = cumap_v; + CurveMap *cuma= cumap->cm+cumap->cur; + + switch(event) { + case 0: + curvemap_reset(cuma, &cumap->clipr); + curvemapping_changed(cumap, 0); + break; + case 1: + cumap->curr= cumap->clipr; + break; + case 2: /* set vector */ + curvemap_sethandle(cuma, 1); + curvemapping_changed(cumap, 0); + break; + case 3: /* set auto */ + curvemap_sethandle(cuma, 0); + curvemapping_changed(cumap, 0); + break; + case 4: /* extend horiz */ + cuma->flag &= ~CUMA_EXTEND_EXTRAPOLATE; + curvemapping_changed(cumap, 0); + break; + case 5: /* extend extrapolate */ + cuma->flag |= CUMA_EXTEND_EXTRAPOLATE; + curvemapping_changed(cumap, 0); + break; + } + ED_region_tag_redraw(CTX_wm_region(C)); +} + +static uiBlock *curvemap_tools_func(struct bContext *C, struct ARegion *ar, void *cumap_v) +{ + uiBlock *block; + short yco= 0, menuwidth=120; + + block= uiBeginBlock(C, ar, "curvemap_tools_func", UI_EMBOSSP, UI_HELV); + uiBlockSetButmFunc(block, curvemap_tools_dofunc, cumap_v); + + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset View", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Auto Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Horizontal", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Extrapolated", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Curve", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, ""); + + uiBlockSetDirection(block, UI_RIGHT); + uiTextBoundsBlock(block, 50); + + uiEndBlock(C, block); + return block; +} + +/* still unsure how this call evolves... we use labeltype for defining what curve-channels to show */ +void curvemap_buttons(uiBlock *block, CurveMapping *cumap, char labeltype, short event, short redraw, rctf *rect) +{ + uiBut *bt; + float dx, fy= rect->ymax-18.0f; + int icon; + short xco, yco; + + yco= (short)(rect->ymax-18.0f); + + /* curve choice options + tools/settings, 8 icons + spacer */ + dx= (rect->xmax-rect->xmin)/(9.0f); + + uiBlockBeginAlign(block); + if(labeltype=='v') { /* vector */ + xco= (short)rect->xmin; + if(cumap->cm[0].curve) + uiDefButI(block, ROW, redraw, "X", xco, yco+2, dx, 16, &cumap->cur, 0.0, 0.0, 0.0, 0.0, ""); + xco= (short)(rect->xmin+1.0f*dx); + if(cumap->cm[1].curve) + uiDefButI(block, ROW, redraw, "Y", xco, yco+2, dx, 16, &cumap->cur, 0.0, 1.0, 0.0, 0.0, ""); + xco= (short)(rect->xmin+2.0f*dx); + if(cumap->cm[2].curve) + uiDefButI(block, ROW, redraw, "Z", xco, yco+2, dx, 16, &cumap->cur, 0.0, 2.0, 0.0, 0.0, ""); + } + else if(labeltype=='c') { /* color */ + xco= (short)rect->xmin; + if(cumap->cm[3].curve) + uiDefButI(block, ROW, redraw, "C", xco, yco+2, dx, 16, &cumap->cur, 0.0, 3.0, 0.0, 0.0, ""); + xco= (short)(rect->xmin+1.0f*dx); + if(cumap->cm[0].curve) + uiDefButI(block, ROW, redraw, "R", xco, yco+2, dx, 16, &cumap->cur, 0.0, 0.0, 0.0, 0.0, ""); + xco= (short)(rect->xmin+2.0f*dx); + if(cumap->cm[1].curve) + uiDefButI(block, ROW, redraw, "G", xco, yco+2, dx, 16, &cumap->cur, 0.0, 1.0, 0.0, 0.0, ""); + xco= (short)(rect->xmin+3.0f*dx); + if(cumap->cm[2].curve) + uiDefButI(block, ROW, redraw, "B", xco, yco+2, dx, 16, &cumap->cur, 0.0, 2.0, 0.0, 0.0, ""); + } + /* else no channels ! */ + uiBlockEndAlign(block); + + xco= (short)(rect->xmin+4.5f*dx); + uiBlockSetEmboss(block, UI_EMBOSSN); + bt= uiDefIconBut(block, BUT, redraw, ICON_ZOOMIN, xco, yco, dx, 14, NULL, 0.0, 0.0, 0.0, 0.0, "Zoom in"); + uiButSetFunc(bt, curvemap_buttons_zoom_in, cumap, NULL); + + xco= (short)(rect->xmin+5.25f*dx); + bt= uiDefIconBut(block, BUT, redraw, ICON_ZOOMOUT, xco, yco, dx, 14, NULL, 0.0, 0.0, 0.0, 0.0, "Zoom out"); + uiButSetFunc(bt, curvemap_buttons_zoom_out, cumap, NULL); + + xco= (short)(rect->xmin+6.0f*dx); + bt= uiDefIconBlockBut(block, curvemap_tools_func, cumap, event, ICON_MODIFIER, xco, yco, dx, 18, "Tools"); + + xco= (short)(rect->xmin+7.0f*dx); + if(cumap->flag & CUMA_DO_CLIP) icon= ICON_CLIPUV_HLT; else icon= ICON_CLIPUV_DEHLT; + bt= uiDefIconBlockBut(block, curvemap_clipping_func, cumap, event, icon, xco, yco, dx, 18, "Clipping Options"); + + xco= (short)(rect->xmin+8.0f*dx); + bt= uiDefIconBut(block, BUT, event, ICON_X, xco, yco, dx, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Delete points"); + uiButSetFunc(bt, curvemap_buttons_delete, cumap, NULL); + + uiBlockSetEmboss(block, UI_EMBOSS); + + uiDefBut(block, BUT_CURVE, event, "", + rect->xmin, rect->ymin, rect->xmax-rect->xmin, fy-rect->ymin, + cumap, 0.0f, 1.0f, 0, 0, ""); + +} + + diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 56281a288d0..59566fcfe7d 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -480,8 +480,6 @@ void OBJECT_OT_curve_add(wmOperatorType *ot) static int object_add_armature_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - bArmature *arm; - EditBone *ebone; int newob= 0; if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) { diff --git a/source/blender/editors/physics/ed_fluidsim.c b/source/blender/editors/physics/ed_fluidsim.c index 5f84989be54..215a72d6927 100644 --- a/source/blender/editors/physics/ed_fluidsim.c +++ b/source/blender/editors/physics/ed_fluidsim.c @@ -86,8 +86,8 @@ #include "BIF_gl.h" -#include "ED_anim_api.h" #include "ED_fluidsim.h" +#include "ED_screen.h" /* XXX */ /* from header info.c */ diff --git a/source/blender/editors/space_action/action_header.c b/source/blender/editors/space_action/action_header.c index 6965db52714..19e7543c328 100644 --- a/source/blender/editors/space_action/action_header.c +++ b/source/blender/editors/space_action/action_header.c @@ -1558,7 +1558,7 @@ static void saction_idpoin_handle(bContext *C, ID *id, int event) { SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C); Object *obact= CTX_data_active_object(C); - AnimData *adt= BKE_id_add_animdata((ID *)obact); + // AnimData *adt= BKE_id_add_animdata((ID *)obact); switch (event) { case UI_ID_BROWSE: diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index f748df2db97..cc6fe4e9ebd 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -272,12 +272,12 @@ static int node_buts_time(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *b short dx= (short)((butr->xmax-butr->xmin)/2); butr->ymin += 26; - // XXX curvemap_buttons(block, node->storage, 's', B_NODE_EXEC, B_REDR, butr); + curvemap_buttons(block, node->storage, 's', B_NODE_EXEC, B_REDR, butr); if(cumap) { - cumap->flag |= CUMA_DRAW_CFRA; - if(node->custom1custom2) - ;// XXX cumap->sample[0]= (float)(CFRA - node->custom1)/(float)(node->custom2-node->custom1); + //cumap->flag |= CUMA_DRAW_CFRA; + //if(node->custom1custom2) + // cumap->sample[0]= (float)(CFRA - node->custom1)/(float)(node->custom2-node->custom1); } uiBlockBeginAlign(block); @@ -305,7 +305,7 @@ static int node_buts_valtorgb(uiBlock *block, bNodeTree *ntree, bNode *node, rct static int node_buts_curvevec(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) { if(block) { - ; // XXX curvemap_buttons(block, node->storage, 'v', B_NODE_EXEC, B_REDR, butr); + curvemap_buttons(block, node->storage, 'v', B_NODE_EXEC, B_REDR, butr); } return (int)(node->width-NODE_DY); } @@ -327,7 +327,7 @@ static int node_buts_curvecol(uiBlock *block, bNodeTree *ntree, bNode *node, rct else cumap->flag &= ~CUMA_DRAW_SAMPLE; - // XXX curvemap_buttons(block, node->storage, 'c', B_NODE_EXEC, B_REDR, butr); + curvemap_buttons(block, node->storage, 'c', B_NODE_EXEC, B_REDR, butr); } return (int)(node->width-NODE_DY); } diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 7febc1cc8e2..1d2aa148e18 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -164,10 +164,14 @@ static void node_area_refresh(const struct bContext *C, struct ScrArea *sa) if(snode->nodetree) { if(snode->treetype==NTREE_SHADER) { - ED_preview_shader_job(C, sa, snode->id, 100, 100); + Material *ma= (Material *)snode->id; + if(ma->use_nodes) + ED_preview_shader_job(C, sa, snode->id, 100, 100); } else if(snode->treetype==NTREE_COMPOSIT) { - snode_composite_job(C, sa); + Scene *scene= (Scene *)snode->id; + if(scene->use_nodes) + snode_composite_job(C, sa); } } } diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index c1c5dec52a7..e5ab9ddc369 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -126,6 +126,10 @@ #define B_CLR_WPAINT 2850 +#define B_RV3D_LOCKED 2900 +#define B_RV3D_BOXVIEW 2901 +#define B_RV3D_BOXCLIP 2902 + #define B_IDNAME 3000 /* temporary struct for storing transform properties */ @@ -466,7 +470,7 @@ static void validate_bonebutton_cb(bContext *C, void *bonev, void *namev) /* restore */ BLI_strncpy(bone->name, oldname, 32); - armature_bone_rename(ob->data, oldname, newname); // editarmature.c + armature_bone_rename(ob, oldname, newname); // editarmature.c } } @@ -493,7 +497,8 @@ static void v3d_posearmature_buts(uiBlock *block, View3D *v3d, Object *ob, float else but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 140, 140, 19, bone->name, 1, 31, 0, 0, ""); uiButSetFunc(but, validate_bonebutton_cb, bone, NULL); - + uiButSetCompleteFunc(but, autocomplete_bone, (void *)ob); + QuatToEul(pchan->quat, tfp->ob_eul); tfp->ob_eul[0]*= 180.0/M_PI; tfp->ob_eul[1]*= 180.0/M_PI; @@ -525,6 +530,22 @@ static void v3d_posearmature_buts(uiBlock *block, View3D *v3d, Object *ob, float uiBlockEndAlign(block); } +/* assumes armature editmode */ +void validate_editbonebutton_cb(bContext *C, void *bonev, void *namev) +{ + EditBone *eBone= bonev; + char oldname[32], newname[32]; + + /* need to be on the stack */ + BLI_strncpy(newname, eBone->name, 32); + BLI_strncpy(oldname, (char *)namev, 32); + /* restore */ + BLI_strncpy(eBone->name, oldname, 32); + + armature_bone_rename(CTX_data_edit_object(C), oldname, newname); // editarmature.c + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, CTX_data_edit_object(C)); // XXX fix +} + static void v3d_editarmature_buts(uiBlock *block, View3D *v3d, Object *ob, float lim) { bArmature *arm= ob->data; @@ -546,7 +567,7 @@ static void v3d_editarmature_buts(uiBlock *block, View3D *v3d, Object *ob, float but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 130, 140, 19, ebone->name, 1, 31, 0, 0, ""); else but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 150, 140, 19, ebone->name, 1, 31, 0, 0, ""); -// XXX uiButSetFunc(but, validate_editbonebutton_cb, ebone, NULL); + uiButSetFunc(but, validate_editbonebutton_cb, ebone, NULL); uiBlockBeginAlign(block); uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadX:", 10, 70, 140, 19, ebone->head, -lim, lim, 10, 3, ""); @@ -858,7 +879,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event) break; case B_CLR_WPAINT: // if(!multires_level1_test()) { - { + { bDeformGroup *defGroup = BLI_findlink(&ob->defbase, ob->actdef-1); if(defGroup) { Mesh *me= ob->data; @@ -869,7 +890,37 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event) } } break; - + case B_RV3D_LOCKED: + case B_RV3D_BOXVIEW: + case B_RV3D_BOXCLIP: + { + ScrArea *sa= CTX_wm_area(C); + ARegion *ar= sa->regionbase.last; + RegionView3D *rv3d; + short viewlock; + + ar= ar->prev; + rv3d= ar->regiondata; + viewlock= rv3d->viewlock; + + if((viewlock & RV3D_LOCKED)==0) + viewlock= 0; + else if((viewlock & RV3D_BOXVIEW)==0) + viewlock &= ~RV3D_BOXCLIP; + + for(; ar; ar= ar->prev) { + if(ar->alignment==RGN_ALIGN_QSPLIT) { + rv3d= ar->regiondata; + rv3d->viewlock= viewlock; + } + } + + if(rv3d->viewlock & RV3D_BOXVIEW) + view3d_boxview_copy(sa, sa->regionbase.last); + + ED_area_tag_redraw(sa); + } + break; } /* default for now */ @@ -1115,14 +1166,14 @@ static void view3d_panel_object(const bContext *C, ARegion *ar, short cntrl) // } else { bt= uiDefBut(block, TEX, B_IDNAME, "OB: ", 10,180,140,20, ob->id.name+2, 0.0, 21.0, 0, 0, ""); -// XXX uiButSetFunc(bt, test_idbutton_cb, ob->id.name, NULL); + uiButSetFunc(bt, test_idbutton_cb, ob->id.name, NULL); if((G.f & G_PARTICLEEDIT)==0) { uiBlockBeginAlign(block); -// XXX uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_OBJECTPANELPARENT, "Par:", 160, 180, 140, 20, &ob->parent, "Parent Object"); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_OBJECTPANELPARENT, "Par:", 160, 180, 140, 20, &ob->parent, "Parent Object"); if((ob->parent) && (ob->partype == PARBONE)) { bt= uiDefBut(block, TEX, B_OBJECTPANELPARENT, "ParBone:", 160, 160, 140, 20, ob->parsubstr, 0, 30, 0, 0, ""); -// XXX uiButSetCompleteFunc(bt, autocomplete_bone, (void *)ob->parent); + uiButSetCompleteFunc(bt, autocomplete_bone, (void *)ob->parent); } else { strcpy(ob->parsubstr, ""); @@ -1285,8 +1336,11 @@ static void view3d_panel_background(const bContext *C, ARegion *ar, short cntrl) static void view3d_panel_properties(const bContext *C, ARegion *ar, short cntrl) // VIEW3D_HANDLER_SETTINGS { + ScrArea *sa= CTX_wm_area(C); + ARegion *arlast; Scene *scene= CTX_data_scene(C); View3D *v3d= CTX_wm_view3d(C); + RegionView3D *rv3d; uiBlock *block; float *curs; @@ -1337,9 +1391,28 @@ static void view3d_panel_properties(const bContext *C, ARegion *ar, short cntrl) uiDefBut(block, LABEL, 1, "View Locking:", 160, 60, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); uiBlockBeginAlign(block); -// XXX uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_REDR, "Object:", 160, 40, 140, 19, &v3d->ob_centre, "Lock view to center to this Object"); - uiDefBut(block, TEX, B_REDR, "Bone:", 160, 20, 140, 19, v3d->ob_centre_bone, 1, 31, 0, 0, "If view locked to Object, use this Bone to lock to view to"); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_REDR, "Object:", 160, 40, 150, 19, &v3d->ob_centre, "Lock view to center to this Object"); + uiDefBut(block, TEX, B_REDR, "Bone:", 160, 20, 150, 19, v3d->ob_centre_bone, 1, 31, 0, 0, "If view locked to Object, use this Bone to lock to view to"); + uiBlockEndAlign(block); + /* last region is always 3d... a bit weak */ + arlast= sa->regionbase.last; + uiBlockBeginAlign(block); + if(arlast->alignment==RGN_ALIGN_QSPLIT) { + arlast= arlast->prev; + rv3d= arlast->regiondata; + + uiDefButO(block, BUT, "SCREEN_OT_region_foursplit", WM_OP_EXEC_REGION_WIN, "End 4-Split View", 160, -10, 150, 19, "Join the 3D View"); + uiDefButBitS(block, TOG, RV3D_LOCKED, B_RV3D_LOCKED, "Lock", 160, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, ""); + uiDefButBitS(block, TOG, RV3D_BOXVIEW, B_RV3D_BOXVIEW, "Box", 210, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, ""); + uiDefButBitS(block, TOG, RV3D_BOXCLIP, B_RV3D_BOXCLIP, "Clip", 260, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, ""); + } + else + uiDefButO(block, BUT, "SCREEN_OT_region_foursplit", WM_OP_EXEC_REGION_WIN, "4-Split View", 160, -10, 150, 19, "Split 3D View in 4 parts"); + + uiBlockEndAlign(block); + + // XXX // uiDefBut(block, LABEL, 1, "Keyframe Display:", 160, -2, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); // uiBlockBeginAlign(block); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index a96cd5a817c..ba774677420 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1880,20 +1880,6 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) /* from now on all object derived meshes check this */ v3d->customdata_mask= get_viewedit_datamask(CTX_wm_screen(C)); - /* update all objects, ipos, matrices, displists, etc. Flags set by depgraph or manual, - no layer check here, gets correct flushed */ - /* sets first, we allow per definition current scene to have dependencies on sets */ - if(scene->set) { - for(SETLOOPER(scene->set, base)) - object_handle_update(scene, base->object); // bke_object.h - } - - v3d->lay_used = 0; - for(base= scene->base.first; base; base= base->next) { - object_handle_update(scene, base->object); // bke_object.h - v3d->lay_used |= base->lay; - } - /* shadow buffers, before we setup matrices */ if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype)) gpu_update_lamps_shadows(scene, v3d); @@ -1997,8 +1983,13 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) /* Transp and X-ray afterdraw stuff for sets is done later */ } + /* extra service in layerbuttons, showing used layers */ + v3d->lay_used = 0; + /* then draw not selected and the duplis, but skip editmode object */ for(base= scene->base.first; base; base= base->next) { + v3d->lay_used |= base->lay; + if(v3d->lay & base->lay) { /* dupli drawing */ diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 0dd83caa15a..0a247eceba1 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -100,7 +100,7 @@ static void view3d_boxview_clip(ScrArea *sa) if(ar->regiontype==RGN_TYPE_WINDOW) { RegionView3D *rv3d= ar->regiondata; - if(rv3d->viewlock) { + if(rv3d->viewlock & RV3D_BOXCLIP) { if(ELEM(rv3d->view, V3D_VIEW_TOP, V3D_VIEW_BOTTOM)) { if(ar->winx>ar->winy) x1= rv3d->dist; else x1= ar->winx*rv3d->dist/ar->winy; @@ -157,7 +157,7 @@ static void view3d_boxview_clip(ScrArea *sa) if(ar->regiontype==RGN_TYPE_WINDOW) { RegionView3D *rv3d= ar->regiondata; - if(rv3d->viewlock) { + if(rv3d->viewlock & RV3D_BOXCLIP) { rv3d->rflag |= RV3D_CLIPPING; memcpy(rv3d->clip, clip, sizeof(clip)); } @@ -166,7 +166,7 @@ static void view3d_boxview_clip(ScrArea *sa) MEM_freeN(bb); } -/* sync ortho view of region to others, for view transforms */ +/* sync center/zoom view of region to others, for view transforms */ static void view3d_boxview_sync(ScrArea *sa, ARegion *ar) { ARegion *artest; @@ -206,7 +206,7 @@ static void view3d_boxview_sync(ScrArea *sa, ARegion *ar) } /* for home, center etc */ -static void view3d_boxview_copy(ScrArea *sa, ARegion *ar) +void view3d_boxview_copy(ScrArea *sa, ARegion *ar) { ARegion *artest; RegionView3D *rv3d= ar->regiondata; @@ -579,7 +579,7 @@ static void viewmove_apply(ViewOpsData *vod, int x, int y) window_to_3d_delta(vod->ar, dvec, x-vod->oldx, y-vod->oldy); VecAddf(vod->rv3d->ofs, vod->rv3d->ofs, dvec); - if(vod->rv3d->viewlock) + if(vod->rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_sync(vod->sa, vod->ar); } @@ -742,7 +742,7 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y) // XXX if(vod->rv3d->persp==V3D_ORTHO || vod->rv3d->persp==V3D_CAMOB) preview3d_event= 0; - if(vod->rv3d->viewlock) + if(vod->rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_sync(vod->sa, vod->ar); ED_region_tag_redraw(vod->ar); @@ -795,7 +795,7 @@ static int viewzoom_exec(bContext *C, wmOperator *op) else if(rv3d->dist> 0.001*v3d->grid) rv3d->dist*=.83333f; } - if(rv3d->viewlock) + if(rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_sync(CTX_wm_area(C), CTX_wm_region(C)); request_depth_update(CTX_wm_region_view3d(C)); @@ -900,7 +900,7 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2. } // XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); - if(rv3d->viewlock) + if(rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_copy(CTX_wm_area(C), ar); return OPERATOR_FINISHED; @@ -1034,7 +1034,7 @@ static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview with } // XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); - if(rv3d->viewlock) + if(rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_copy(CTX_wm_area(C), ar); return OPERATOR_FINISHED; @@ -1265,7 +1265,7 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op) smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL); - if(rv3d->viewlock) + if(rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_sync(CTX_wm_area(C), ar); return OPERATOR_FINISHED; @@ -1559,7 +1559,7 @@ static int viewpan_exec(bContext *C, wmOperator *op) rv3d->ofs[1]+= vec[1]; rv3d->ofs[2]+= vec[2]; - if(rv3d->viewlock) + if(rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_sync(CTX_wm_area(C), ar); ED_region_tag_redraw(ar); diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index ca32b47e4f8..61762928996 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -77,6 +77,8 @@ void VIEW3D_OT_border_zoom(struct wmOperatorType *ot); void VIEW3D_OT_drawtype(struct wmOperatorType *ot); void VIEW3D_OT_editmesh_face_toolbox(struct wmOperatorType *ot); +void view3d_boxview_copy(ScrArea *sa, ARegion *ar); + /* drawobject.c */ void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, int flag); int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt); diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index 1125ffcaf7b..fe70f451eaf 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -205,6 +205,7 @@ typedef struct View3D { /* RegionView3d->viewlock */ #define RV3D_LOCKED 1 #define RV3D_BOXVIEW 2 +#define RV3D_BOXCLIP 4 /* View3d->flag2 (short) */ #define V3D_SOLID_TEX 8 diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 886456733f9..1f417860e0c 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -31,6 +31,7 @@ #include "DNA_listBase.h" #include "DNA_screen_types.h" +#include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" #include "DNA_userdef_types.h" @@ -44,7 +45,9 @@ #include "BKE_context.h" #include "BKE_idprop.h" #include "BKE_global.h" +#include "BKE_object.h" #include "BKE_report.h" +#include "BKE_scene.h" #include "BKE_utildefines.h" #include "ED_screen.h" @@ -194,7 +197,10 @@ void wm_event_do_notifiers(bContext *C) /* cached: editor refresh callbacks now, they get context */ for(win= wm->windows.first; win; win= win->next) { + Scene *sce, *scene= win->screen->scene; ScrArea *sa; + Base *base; + CTX_wm_window_set(C, win); for(sa= win->screen->areabase.first; sa; sa= sa->next) { if(sa->do_refresh) { @@ -202,6 +208,19 @@ void wm_event_do_notifiers(bContext *C) ED_area_do_refresh(C, sa); } } + + /* update all objects, ipos, matrices, displists, etc. Flags set by depgraph or manual, + no layer check here, gets correct flushed */ + /* sets first, we allow per definition current scene to have dependencies on sets */ + if(scene->set) { + for(SETLOOPER(scene->set, base)) + object_handle_update(scene, base->object); + } + + for(base= scene->base.first; base; base= base->next) { + object_handle_update(scene, base->object); + } + } CTX_wm_window_set(C, NULL); } From 294a3a2b6d3528b2dac7c64076e59a3bf82db1eb Mon Sep 17 00:00:00 2001 From: Roland Hess Date: Wed, 11 Feb 2009 17:46:10 +0000 Subject: [PATCH 48/63] One last bit of personal education -- added OPERATOR_CANCELLED on sanity check failures. --- source/blender/editors/armature/editarmature.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 9dfd356ce43..fdefd01a122 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -4435,6 +4435,12 @@ static int pose_select_parent_exec(bContext *C, wmOperator *op) parent->bone->flag |= BONE_ACTIVE; pchan->bone->flag &= ~BONE_ACTIVE; } + else { + return OPERATOR_CANCELLED; + } + } + else { + return OPERATOR_CANCELLED; } WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob); From 51fc28efc7de251e3d534ebdc15982ecde86167c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 11 Feb 2009 19:16:14 +0000 Subject: [PATCH 49/63] 2.5: Image window, some small changes: * Added notifier for edited images. * Fix main region emboss drawing when showing render. * Don't go fullscreen with fileselect for now to work around context getting lost, so open/replace works. * Save operators are more complete now, but still lack confirmation and choosing image type. * Pack operators work correctly now (but not unpack). * Setting white/black point for curves. * Time cursor for record composite. --- .../blender/editors/space_image/image_draw.c | 23 ++- .../editors/space_image/image_header.c | 39 +--- .../editors/space_image/image_intern.h | 2 + .../blender/editors/space_image/image_ops.c | 194 +++++++++++------- .../blender/editors/space_image/space_image.c | 19 +- source/blender/windowmanager/WM_types.h | 1 + 6 files changed, 156 insertions(+), 122 deletions(-) diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 7311821a5ef..1b7a96459ff 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -125,7 +125,7 @@ static void image_verify_buffer_float(SpaceImage *sima, ImBuf *ibuf) } } -static void sima_draw_render_info(SpaceImage *sima, ARegion *ar) +static void draw_render_info(SpaceImage *sima, ARegion *ar) { rcti rect; float colf[3]; @@ -136,23 +136,24 @@ static void sima_draw_render_info(SpaceImage *sima, ARegion *ar) return; rect= ar->winrct; - rect.ymin= rect.ymax - HEADER_HEIGHT; - - glaDefine2DArea(&rect); + rect.xmin= 0; + rect.ymin= ar->winrct.ymax - ar->winrct.ymin - HEADER_HEIGHT; + rect.xmax= ar->winrct.xmax - ar->winrct.xmin; + rect.ymax= ar->winrct.ymax - ar->winrct.ymin; /* clear header rect */ UI_GetThemeColor3fv(TH_BACK, colf); - glClearColor(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f, 1.0); - glClear(GL_COLOR_BUFFER_BIT); + glColor3f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f); + glRecti(rect.xmin, rect.ymin, rect.xmax, rect.ymax); UI_ThemeColor(TH_TEXT_HI); - glRasterPos2i(12, 5); - UI_RasterPos(12, 5); + glRasterPos2i(12, rect.ymin + 5); + UI_RasterPos(12, rect.ymin + 5); if(showspare) { UI_DrawString(G.fonts, "(Previous)", 0); - glRasterPos2i(72, 5); - UI_RasterPos(72, 5); + glRasterPos2i(72, rect.ymin + 5); + UI_RasterPos(72, rect.ymin + 5); } UI_DrawString(G.fonts, str, 0); @@ -668,7 +669,7 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene) /* render info */ if(ibuf && show_render) - sima_draw_render_info(sima, ar); + draw_render_info(sima, ar); /* XXX integrate this code */ #if 0 diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index 997ba867121..120d1debde2 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -186,37 +186,6 @@ static void do_image_imagemenu(void *arg, int event) #ifndef DISABLE_PYTHON if (event >= 20) BPY_menu_do_python(PYMENU_IMAGE, event - 20); #endif - switch(event) - { - case 0: - open_image_sima((G.qual==LR_CTRLKEY)); - break; - case 1: - replace_image_sima((G.qual==LR_CTRLKEY)); - break; - case 2: - pack_image_sima(); - break; - case 5: - save_as_image_sima(); - break; - case 6: - reload_image_sima(); - break; - case 7: - new_image_sima(); - break; - case 8: - save_image_sima(); - break; - case 9: - save_image_sequence_sima(); - break; - case 10: - BKE_image_memorypack(sima->image); - allqueue(REDRAWIMAGE, 0); - break; - } } #endif @@ -242,12 +211,14 @@ static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused) uiMenuItemO(head, 0, "IMAGE_OT_open"); // Open... if(ima) { - uiMenuItemO(head, 0, "IMAGE_OT_replace"); // Replace... - uiMenuItemO(head, 0, "IMAGE_OT_reload"); // Reload... + if(!show_render) { + uiMenuItemO(head, 0, "IMAGE_OT_replace"); // Replace... + uiMenuItemO(head, 0, "IMAGE_OT_reload"); // Reload... + } uiMenuItemO(head, 0, "IMAGE_OT_save"); // Save uiMenuItemO(head, 0, "IMAGE_OT_save_as"); // Save As... if(ima->source == IMA_SRC_SEQUENCE) - uiMenuItemO(head, 0, "IMAGE_OT_save_changed"); // Save Changed Images + uiMenuItemO(head, 0, "IMAGE_OT_save_sequence"); // Save Changed Sequence Images if(!show_render) { uiMenuSeparator(head); diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h index 384689bb000..c4363f3981a 100644 --- a/source/blender/editors/space_image/image_intern.h +++ b/source/blender/editors/space_image/image_intern.h @@ -68,7 +68,9 @@ void IMAGE_OT_save_as(struct wmOperatorType *ot); void IMAGE_OT_save_sequence(struct wmOperatorType *ot); void IMAGE_OT_pack(struct wmOperatorType *ot); void IMAGE_OT_unpack(struct wmOperatorType *ot); + void IMAGE_OT_sample(struct wmOperatorType *ot); +void IMAGE_OT_set_curves_point(struct wmOperatorType *ot); void IMAGE_OT_record_composite(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 6ad1207f7cd..e24e7254553 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -68,6 +68,8 @@ #include "ED_space_api.h" #include "ED_uvedit.h" +#include "UI_interface.h" +#include "UI_resources.h" #include "UI_view2d.h" #include "WM_api.h" @@ -591,13 +593,15 @@ static void image_filesel(bContext *C, wmOperator *op, const char *path) { SpaceFile *sfile; - ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_FILE); + // XXX context is not set back ok afterwards + // ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_FILE); + ED_area_newspace(C, CTX_wm_area(C), SPACE_FILE); /* settings for filebrowser */ sfile= (SpaceFile*)CTX_wm_space_data(C); sfile->op= op; - /* XXX right params for image filter browse, filters, .. */ + /* XXX right params for image save, with pupmenu and image type .. */ ED_fileselect_set_params(sfile, FILE_SPECIAL, op->type->name, path, 0, 0, 0); } @@ -618,8 +622,6 @@ static int open_exec(bContext *C, wmOperator *op) if(!ima) return OPERATOR_CANCELLED; - return OPERATOR_FINISHED; // XXX context not correct! - BKE_image_signal(ima, &sima->iuser, IMA_SIGNAL_RELOAD); ED_space_image_set(C, sima, scene, obedit, ima); @@ -664,8 +666,6 @@ static int replace_exec(bContext *C, wmOperator *op) SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); char *str; - return OPERATOR_CANCELLED; // XXX context not correct! - if(!sima->image) return OPERATOR_CANCELLED; @@ -674,6 +674,7 @@ static int replace_exec(bContext *C, wmOperator *op) MEM_freeN(str); BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); + WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image); return OPERATOR_FINISHED; } @@ -714,7 +715,7 @@ void IMAGE_OT_replace(wmOperatorType *ot) /******************** save image as operator ********************/ -static void save_image_doit(SpaceImage *sima, Scene *scene, char *name) +static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOperator *op, char *name) { Image *ima= ED_space_image(sima); ImBuf *ibuf= ED_space_image_buffer(sima); @@ -756,7 +757,8 @@ static void save_image_doit(SpaceImage *sima, Scene *scene, char *name) ibuf->userflags &= ~IB_BITMAPDIRTY; } - else; // XXX error("Did not write, no Multilayer Image"); + else + BKE_report(op->reports, RPT_ERROR, "Did not write, no Multilayer Image"); } else if (BKE_write_ibuf(scene, ibuf, str, sima->imtypenr, scene->r.subimtype, scene->r.quality)) { BLI_strncpy(ima->name, name, sizeof(ima->name)); @@ -777,12 +779,10 @@ static void save_image_doit(SpaceImage *sima, Scene *scene, char *name) while (len > 0 && str[len - 1] != '/' && str[len - 1] != '\\') len--; rename_id(&ima->id, str+len); } - else { - ; // XXX error("Couldn't write image: %s", str); - } + else + BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", str); - // XXX allqueue(REDRAWHEADERS, 0); - // XXX allqueue(REDRAWBUTSSHADING, 0); + WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image); WM_cursor_wait(0); } @@ -793,16 +793,14 @@ static int save_as_exec(bContext *C, wmOperator *op) { SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); Scene *scene= CTX_data_scene(C); - //Image *ima = ED_space_image(sima); + Image *ima = ED_space_image(sima); char *str; - return OPERATOR_CANCELLED; // XXX context not correct! - - /*if(!ima) - return OPERATOR_CANCELLED;*/ + if(!ima) + return OPERATOR_CANCELLED; str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0); - save_image_doit(sima, scene, str); + save_image_doit(C, sima, scene, op, str); MEM_freeN(str); return OPERATOR_FINISHED; @@ -887,7 +885,7 @@ static int save_exec(bContext *C, wmOperator *op) else sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); - save_image_doit(sima, scene, ibuf->name); + save_image_doit(C, sima, scene, op, ibuf->name); } else return save_as_exec(C, op); @@ -950,24 +948,22 @@ static int save_sequence_exec(bContext *C, wmOperator *op) BLI_strncpy(di, ibuf->name, FILE_MAX); BLI_splitdirstring(di, fi); - sprintf(fi, "%d Image(s) will be saved in %s", tot, di); + BKE_reportf(op->reports, RPT_INFO, "%d Image(s) will be saved in %s", tot, di); - if(1) { // XXX okee(fi)) { - - for(ibuf= sima->image->ibufs.first; ibuf; ibuf= ibuf->next) { - if(ibuf->userflags & IB_BITMAPDIRTY) { - char name[FILE_MAX]; - BLI_strncpy(name, ibuf->name, sizeof(name)); - - BLI_convertstringcode(name, G.sce); + for(ibuf= sima->image->ibufs.first; ibuf; ibuf= ibuf->next) { + if(ibuf->userflags & IB_BITMAPDIRTY) { + char name[FILE_MAX]; + BLI_strncpy(name, ibuf->name, sizeof(name)); + + BLI_convertstringcode(name, G.sce); - if(0 == IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat)) { - BKE_reportf(op->reports, RPT_ERROR, "Could not write image %s.", name); - break; - } - printf("Saved: %s\n", ibuf->name); - ibuf->userflags &= ~IB_BITMAPDIRTY; + if(0 == IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat)) { + BKE_reportf(op->reports, RPT_ERROR, "Could not write image %s.", name); + break; } + + printf("Saved: %s\n", ibuf->name); + ibuf->userflags &= ~IB_BITMAPDIRTY; } } @@ -1003,8 +999,8 @@ static int reload_exec(bContext *C, wmOperator *op) BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); /* ED_space_image_set(C, sima, scene, obedit, NULL); - do we really need this? */ - // XXX notifier // XXX BIF_preview_changed(ID_TE); + WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image); ED_area_tag_redraw(CTX_wm_area(C)); return OPERATOR_FINISHED; @@ -1081,33 +1077,66 @@ void IMAGE_OT_new(wmOperatorType *ot) /********************* pack operator *********************/ -static int pack_exec(bContext *C, wmOperator *op) +static int pack_test(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); Image *ima= CTX_data_edit_image(C); - ImBuf *ibuf= ED_space_image_buffer(sima); int as_png= RNA_boolean_get(op->ptr, "as_png"); if(!ima) - return OPERATOR_CANCELLED; + return 0; if(!as_png && ima->packedfile) - return OPERATOR_CANCELLED; + return 0; if(ima->source==IMA_SRC_SEQUENCE || ima->source==IMA_SRC_MOVIE) { BKE_report(op->reports, RPT_ERROR, "Can't pack movie or image sequence."); + return 0; + } + + return 1; +} + +static int pack_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + Image *ima= ED_space_image(sima); + ImBuf *ibuf= ED_space_image_buffer(sima); + int as_png= RNA_boolean_get(op->ptr, "as_png"); + + if(!pack_test(C, op)) + return OPERATOR_CANCELLED; + + if(!as_png && (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) { + BKE_report(op->reports, RPT_ERROR, "Can't pack edited image from disk, only as internal PNG."); return OPERATOR_CANCELLED; } - if(as_png || (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) { - if(1) // XXX okee("Can't pack painted image. Use Repack as PNG?")) - BKE_image_memorypack(ima); - } - else { - ima->packedfile = newPackedFile(ima->name); - // XXX BIF_undo_push("Pack image"); + if(as_png) + BKE_image_memorypack(ima); + else + ima->packedfile= newPackedFile(ima->name); + + return OPERATOR_FINISHED; +} + +static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + ImBuf *ibuf= ED_space_image_buffer(sima); + uiMenuItem *head; + int as_png= RNA_boolean_get(op->ptr, "as_png"); + + if(!pack_test(C, op)) + return OPERATOR_CANCELLED; + + if(!as_png && (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) { + head= uiPupMenuBegin("OK", ICON_HELP); + uiMenuItemBooleanO(head, "Can't pack edited image from disk. Pack as internal PNG?", 0, op->idname, "as_png", 1); + uiPupMenuEnd(C, head); + + return OPERATOR_CANCELLED; } - return OPERATOR_CANCELLED; + return pack_exec(C, op); } void IMAGE_OT_pack(wmOperatorType *ot) @@ -1118,6 +1147,7 @@ void IMAGE_OT_pack(wmOperatorType *ot) /* api callbacks */ ot->exec= pack_exec; + ot->invoke= pack_invoke; ot->poll= space_image_poll; /* flags */ @@ -1144,15 +1174,11 @@ static int unpack_exec(bContext *C, wmOperator *op) } if(G.fileflags & G_AUTOPACK) - if(1) // XXX okee("Disable AutoPack?")) - G.fileflags &= ~G_AUTOPACK; + BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save."); - if((G.fileflags & G_AUTOPACK) == 0) { - unpackImage(ima, PF_ASK); - // XXX BIF_undo_push("Ununpack image"); - } + unpackImage(ima, PF_ASK); - return OPERATOR_CANCELLED; + return OPERATOR_FINISHED; } void IMAGE_OT_unpack(wmOperatorType *ot) @@ -1266,15 +1292,17 @@ static void sample_apply(bContext *C, wmOperator *op, wmEvent *event) info->zfp= &info->zf; } - // XXX set white/black point - if(sima->cumap) { - if(ibuf->channels==4) { - if(0) { // XXX G.qual & LR_CTRLKEY) { - curvemapping_set_black_white(sima->cumap, NULL, fp); + if(sima->cumap && ibuf->channels==4) { + /* we reuse this callback for set curves point operators */ + if(RNA_struct_find_property(op->ptr, "point")) { + int point= RNA_enum_get(op->ptr, "point"); + + if(point == 1) { + curvemapping_set_black_white(sima->cumap, NULL, info->colfp); curvemapping_do_ibuf(sima->cumap, ibuf); } - else if(0) { // XXX G.qual & LR_SHIFTKEY) { - curvemapping_set_black_white(sima->cumap, fp, NULL); + else if(point == 0) { + curvemapping_set_black_white(sima->cumap, info->colfp, NULL); curvemapping_do_ibuf(sima->cumap, ibuf); } } @@ -1368,6 +1396,32 @@ void IMAGE_OT_sample(wmOperatorType *ot) ot->poll= space_image_main_area_poll; } +/******************** set curve point operator ********************/ + +void IMAGE_OT_set_curves_point(wmOperatorType *ot) +{ + static EnumPropertyItem point_items[]= { + {0, "BLACK_POINT", "Black Point", ""}, + {1, "WHITE_POINT", "White Point", ""}, + {0, NULL, NULL, NULL}}; + + /* identifiers */ + ot->name= "Set Curves Point"; + ot->idname= "IMAGE_OT_set_curves_point"; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* api callbacks */ + ot->invoke= sample_invoke; + ot->modal= sample_modal; + ot->cancel= sample_cancel; + ot->poll= space_image_main_area_poll; + + /* properties */ + RNA_def_enum(ot->srna, "point", point_items, 0, "Point", "Set black point or white point for curves."); +} + /******************** record composite operator *********************/ typedef struct RecordCompositeData { @@ -1383,11 +1437,12 @@ int record_composite_apply(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); ImBuf *ibuf; + WM_timecursor(CTX_wm_window(C), scene->r.cfra); + // XXX scene->nodetree->test_break= blender_test_break; // XXX scene->nodetree->test_break= NULL; - // XXX set_timecursor(CFRA); - BKE_image_all_free_anim_ibufs(CFRA); + BKE_image_all_free_anim_ibufs(scene->r.cfra); ntreeCompositTagAnimated(scene->nodetree); ntreeCompositExecTree(scene->nodetree, &scene->r, scene->r.cfra != rcd->old_cfra); /* 1 is no previews */ @@ -1421,27 +1476,26 @@ static int record_composite_init(bContext *C, wmOperator *op) rcd->efra= sima->iuser.sfra + sima->iuser.frames-1; scene->r.cfra= rcd->sfra; - WM_cursor_wait(1); - return 1; } static void record_composite_exit(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); + SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); RecordCompositeData *rcd= op->customdata; scene->r.cfra= rcd->old_cfra; - WM_cursor_wait(0); + WM_cursor_restore(CTX_wm_window(C)); if(rcd->timer) WM_event_remove_window_timer(CTX_wm_window(C), rcd->timer); + WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image); + // XXX play_anim(0); - // XXX allqueue(REDRAWNODE, 1); - // XXX allqueue(REDRAWIMAGE, 1); MEM_freeN(rcd); } diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index a3208331a3f..f3b414262a8 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -101,9 +101,6 @@ static SpaceLink *image_new(const bContext *C) BLI_addtail(&simage->regionbase, ar); ar->regiontype= RGN_TYPE_WINDOW; - /* channel list region XXX */ - - return (SpaceLink *)simage; } @@ -156,7 +153,9 @@ void image_operatortypes(void) WM_operatortype_append(IMAGE_OT_save_sequence); WM_operatortype_append(IMAGE_OT_pack); WM_operatortype_append(IMAGE_OT_unpack); + WM_operatortype_append(IMAGE_OT_sample); + WM_operatortype_append(IMAGE_OT_set_curves_point); WM_operatortype_append(IMAGE_OT_record_composite); @@ -189,7 +188,10 @@ void image_keymap(struct wmWindowManager *wm) WM_keymap_add_item(keymap, "IMAGE_OT_open", OKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "IMAGE_OT_reload", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "IMAGE_OT_save", SKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "IMAGE_OT_sample", ACTIONMOUSE, KM_PRESS, 0, 0); + RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_set_curves_point", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "point", 0); + RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_set_curves_point", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "point", 1); WM_keymap_add_item(keymap, "IMAGE_OT_toolbox", SPACEKEY, KM_PRESS, 0, 0); } @@ -234,6 +236,8 @@ static void image_refresh(const bContext *C, ScrArea *sa) static void image_listener(ScrArea *sa, wmNotifier *wmn) { + SpaceImage *sima= sa->spacedata.first; + /* context changes */ switch(wmn->category) { case NC_SCENE: @@ -246,6 +250,10 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn) break; } break; + case NC_IMAGE: + if(!wmn->reference || wmn->reference == sima->image) + ED_area_tag_redraw(sa); + break; } } @@ -277,7 +285,7 @@ static void image_main_area_set_view2d(SpaceImage *sima, ARegion *ar) #if 0 if(image_preview_active(curarea, &xim, &yim)); else if(sima->image) { - ImBuf *ibuf= imagewindow_get_ibuf(sima); + ImBuf *ibuf= ED_space_image_buffer(sima); float xuser_asp, yuser_asp; ED_image_aspect(sima->image, &xuser_asp, &yuser_asp); @@ -507,9 +515,6 @@ void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obe * to check if the face is displayed in UV-localview */ sima->image= ima; - if(ima) - printf("assign %s\n", ima->id.name); - if(ima == NULL || ima->type==IMA_TYPE_R_RESULT || ima->type==IMA_TYPE_COMPOSITE) sima->flag &= ~SI_DRAWTOOL; diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 9382e170a21..a8fb42c4ed0 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -153,6 +153,7 @@ typedef struct wmNotifier { #define NC_TEXTURE (7<<24) #define NC_LAMP (8<<24) #define NC_GROUP (9<<24) +#define NC_IMAGE (10<<24) /* data type, 256 entries is enough, it can overlap */ #define NOTE_DATA 0x00FF0000 From b8e6e01cfd4caf96e8b5339b272aa6be4f22f7e7 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 11 Feb 2009 23:02:21 +0000 Subject: [PATCH 50/63] 2.5: Curve edit mode. Transform works again, and editcurve.c is partly operatorized though nothing hooked up yet. --- source/blender/editors/curve/curve_intern.h | 33 + source/blender/editors/curve/curve_ops.c | 33 +- source/blender/editors/curve/editcurve.c | 1491 ++++++++++++----- source/blender/editors/mesh/editmesh_mods.c | 12 +- source/blender/editors/mesh/editmesh_tools.c | 6 +- source/blender/editors/screen/screen_ops.c | 3 + .../editors/transform/transform_conversions.c | 3 - .../editors/transform/transform_generics.c | 71 +- 8 files changed, 1150 insertions(+), 502 deletions(-) diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h index a77300f29f5..ba01c1207e7 100644 --- a/source/blender/editors/curve/curve_intern.h +++ b/source/blender/editors/curve/curve_intern.h @@ -38,5 +38,38 @@ char *ED_lorem; /* editfont.c */ void FONT_OT_textedit(struct wmOperatorType *ot); +/* editcurve.c */ +void CURVE_OT_separate(struct wmOperatorType *ot); +void CURVE_OT_switch_direction(struct wmOperatorType *ot); +void CURVE_OT_set_weight(struct wmOperatorType *ot); +void CURVE_OT_set_radius(struct wmOperatorType *ot); +void CURVE_OT_smooth(struct wmOperatorType *ot); +void CURVE_OT_smooth_curve_radius(struct wmOperatorType *ot); +void CURVE_OT_de_select_first(struct wmOperatorType *ot); +void CURVE_OT_de_select_last(struct wmOperatorType *ot); +void CURVE_OT_de_select_all(struct wmOperatorType *ot); +void CURVE_OT_hide(struct wmOperatorType *ot); +void CURVE_OT_reveal(struct wmOperatorType *ot); +void CURVE_OT_select_invert(struct wmOperatorType *ot); +void CURVE_OT_subdivide(struct wmOperatorType *ot); +void CURVE_OT_set_spline_type(struct wmOperatorType *ot); +void CURVE_OT_make_segment(struct wmOperatorType *ot); +void CURVE_OT_spin(struct wmOperatorType *ot); +void CURVE_OT_add_vertex(struct wmOperatorType *ot); +void CURVE_OT_extrude(struct wmOperatorType *ot); +void CURVE_OT_make_cyclic(struct wmOperatorType *ot); +void CURVE_OT_select_linked(struct wmOperatorType *ot); +void CURVE_OT_select_row(struct wmOperatorType *ot); +void CURVE_OT_select_next(struct wmOperatorType *ot); +void CURVE_OT_select_previous(struct wmOperatorType *ot); +void CURVE_OT_select_more(struct wmOperatorType *ot); +void CURVE_OT_select_less(struct wmOperatorType *ot); +void CURVE_OT_select_random(struct wmOperatorType *ot); +void CURVE_OT_select_every_nth(struct wmOperatorType *ot); +void CURVE_OT_add_duplicate(struct wmOperatorType *ot); +void CURVE_OT_delete(struct wmOperatorType *ot); +void CURVE_OT_set_smooth(struct wmOperatorType *ot); +void CURVE_OT_clear_tilt(struct wmOperatorType *ot); + #endif /* ED_UTIL_INTERN_H */ diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c index 4d60c2716ba..4455144c859 100644 --- a/source/blender/editors/curve/curve_ops.c +++ b/source/blender/editors/curve/curve_ops.c @@ -64,6 +64,38 @@ void ED_operatortypes_curve(void) { WM_operatortype_append(FONT_OT_textedit); + + WM_operatortype_append(CURVE_OT_separate); + WM_operatortype_append(CURVE_OT_switch_direction); + WM_operatortype_append(CURVE_OT_set_weight); + WM_operatortype_append(CURVE_OT_set_radius); + WM_operatortype_append(CURVE_OT_smooth); + WM_operatortype_append(CURVE_OT_smooth_curve_radius); + WM_operatortype_append(CURVE_OT_de_select_first); + WM_operatortype_append(CURVE_OT_de_select_last); + WM_operatortype_append(CURVE_OT_de_select_all); + WM_operatortype_append(CURVE_OT_hide); + WM_operatortype_append(CURVE_OT_reveal); + WM_operatortype_append(CURVE_OT_select_invert); + WM_operatortype_append(CURVE_OT_subdivide); + WM_operatortype_append(CURVE_OT_set_spline_type); + WM_operatortype_append(CURVE_OT_make_segment); + WM_operatortype_append(CURVE_OT_spin); + WM_operatortype_append(CURVE_OT_add_vertex); + WM_operatortype_append(CURVE_OT_extrude); + WM_operatortype_append(CURVE_OT_make_cyclic); + WM_operatortype_append(CURVE_OT_select_linked); + WM_operatortype_append(CURVE_OT_select_row); + WM_operatortype_append(CURVE_OT_select_next); + WM_operatortype_append(CURVE_OT_select_previous); + WM_operatortype_append(CURVE_OT_select_more); + WM_operatortype_append(CURVE_OT_select_less); + WM_operatortype_append(CURVE_OT_select_random); + WM_operatortype_append(CURVE_OT_select_every_nth); + WM_operatortype_append(CURVE_OT_add_duplicate); + WM_operatortype_append(CURVE_OT_delete); + WM_operatortype_append(CURVE_OT_set_smooth); + WM_operatortype_append(CURVE_OT_clear_tilt); } void ED_keymap_curve(wmWindowManager *wm) @@ -77,6 +109,5 @@ void ED_keymap_curve(wmWindowManager *wm) keymap= WM_keymap_listbase(wm, "Curve", 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0); - } diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 4962a238f2e..281d9f407dc 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -59,11 +59,12 @@ #include "BKE_curve.h" #include "BKE_depsgraph.h" #include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_key.h" #include "BKE_library.h" -#include "BKE_global.h" #include "BKE_main.h" #include "BKE_object.h" +#include "BKE_report.h" #include "BKE_utildefines.h" #include "WM_api.h" @@ -72,10 +73,16 @@ #include "ED_anim_api.h" #include "ED_keyframes_edit.h" #include "ED_object.h" +#include "ED_screen.h" #include "ED_types.h" #include "ED_util.h" #include "ED_view3d.h" +#include "UI_interface.h" + +#include "RNA_access.h" +#include "RNA_define.h" + /* still need to eradicate a few :( */ #define callocstructN(x,y,name) (x*)MEM_callocN((y)* sizeof(x),name) @@ -84,12 +91,8 @@ /* XXX */ static void BIF_undo_push() {} -static void waitcursor() {} -static void error() {} static int okee() {return 0;} static int pupmenu() {return 0;} -static int button() {return 0;} -static float fbutton() {return 0;} static void adduplicate() {} static void error_libdata() {} /* XXX */ @@ -373,9 +376,12 @@ void free_editNurb(Object *obedit) } } -void separate_nurb(Scene *scene) +/******************** XXX separate operator ***********************/ + +static int separate_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX use context + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); View3D *v3d= NULL; // XXX Nurb *nu, *nu1; @@ -384,17 +390,13 @@ void separate_nurb(Scene *scene) Curve *cu; ListBase editnurbo; - if( v3d==0 || (v3d->lay & obedit->lay)==0 ) return; - - if(okee("Separate")==0) return; - - waitcursor(1); - cu= obedit->data; if(cu->key) { - error("Can't separate a curve with vertex keys"); - return; + BKE_report(op->reports, RPT_ERROR, "Can't separate a curve with vertex keys"); + return OPERATOR_CANCELLED; } + + WM_cursor_wait(1); /* we are going to trick everything as follows: * 1. duplicate base: this is the new one, remember old pointer @@ -445,22 +447,39 @@ void separate_nurb(Scene *scene) *editnurb= editnurbo; obedit= 0; /* displists behave different in edit mode */ - DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA); /* this is the separated one */ + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); /* this is the separated one */ DAG_object_flush_update(scene, oldob, OB_RECALC_DATA); /* this is the original one */ obedit= oldob; BASACT= oldbase; BASACT->flag |= SELECT; - waitcursor(0); - set_actNurb(obedit, NULL); + + WM_cursor_wait(0); + + // XXX notifier + + return OPERATOR_FINISHED; +} + +void CURVE_OT_separate(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Separate"; + ot->idname= "CURVE_OT_separate"; + + /* api callbacks */ + ot->exec= separate_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } /* ******************* FLAGS ********************* */ - -short isNurbselUV(Nurb *nu, int *u, int *v, int flag) +static short isNurbselUV(Nurb *nu, int *u, int *v, int flag) { /* return u!=-1: 1 row in u-direction selected. U has value between 0-pntsv * return v!=-1: 1 collumn in v-direction selected. V has value between 0-pntsu @@ -501,7 +520,7 @@ short isNurbselUV(Nurb *nu, int *u, int *v, int flag) return 0; } -void setflagsNurb(ListBase *editnurb, short flag) +static void setflagsNurb(ListBase *editnurb, short flag) { Nurb *nu; BezTriple *bezt; @@ -528,7 +547,7 @@ void setflagsNurb(ListBase *editnurb, short flag) } } -void rotateflagNurb(ListBase *editnurb, short flag, float *cent, float rotmat[][3]) +static void rotateflagNurb(ListBase *editnurb, short flag, float *cent, float rotmat[][3]) { /* all verts with (flag & 'flag') rotate */ Nurb *nu; @@ -556,8 +575,7 @@ void rotateflagNurb(ListBase *editnurb, short flag, float *cent, float rotmat[][ } } - -void translateflagNurb(ListBase *editnurb, short flag, float *vec) +static void translateflagNurb(ListBase *editnurb, short flag, float *vec) { /* all verts with ('flag' & flag) translate */ Nurb *nu; @@ -589,7 +607,7 @@ void translateflagNurb(ListBase *editnurb, short flag, float *vec) } } -void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /* mode==0: replace, mode==1: multiply */ +static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /* mode==0: replace, mode==1: multiply */ { Nurb *nu; BPoint *bp; @@ -610,9 +628,9 @@ void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /* mode== } } -void deleteflagNurb(Scene *scene, short flag) +static int deleteflagNurb(bContext *C, wmOperator *op, int flag) { - Object *obedit= scene->obedit; // XXX use context + Object *obedit= CTX_data_edit_object(C); Curve *cu= obedit->data; ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu, *next; @@ -620,7 +638,7 @@ void deleteflagNurb(Scene *scene, short flag) int a, b, newu, newv, sel; if(obedit && obedit->type==OB_SURF); - else return; + else return OPERATOR_CANCELLED; cu->lastselbp= NULL; @@ -727,10 +745,12 @@ void deleteflagNurb(Scene *scene, short flag) } nu= next; } + + return OPERATOR_FINISHED; } /* only for OB_SURF */ -short extrudeflagNurb(ListBase *editnurb, int flag) +static short extrudeflagNurb(ListBase *editnurb, int flag) { Nurb *nu; BPoint *bp, *bpn, *newbp; @@ -847,9 +867,8 @@ short extrudeflagNurb(ListBase *editnurb, int flag) return ok; } -void adduplicateflagNurb(Scene *scene, short flag) +static void adduplicateflagNurb(Object *obedit, short flag) { - Object *obedit= scene->obedit; // XXX context ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu, *newnu; BezTriple *bezt, *bezt1; @@ -1018,138 +1037,152 @@ void adduplicateflagNurb(Scene *scene, short flag) /* actnu changed */ } +/**************** switch direction operator ***************/ -void switchdirectionNurb2(Scene *scene) +static int switch_direction_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX use context + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); - View3D *v3d= NULL; // XXX Nurb *nu; - if(v3d==0 || !(obedit->lay & v3d->lay)) - return; + for(nu= editnurb->first; nu; nu= nu->next) + if(isNurbsel(nu)) + switchdirectionNurb(nu); - for(nu= editnurb->first; nu; nu= nu->next) { - if( isNurbsel(nu) ) switchdirectionNurb(nu); - } - - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + // XXX notifier - BIF_undo_push("Switch direction"); + return OPERATOR_FINISHED; } -void switchdirection_knots(float *base, int tot) +void CURVE_OT_switch_direction(wmOperatorType *ot) { - float *fp1, *fp2, *tempf; - int a; + /* identifiers */ + ot->name= "Switch Direction"; + ot->idname= "CURVE_OT_switch_direction"; - if(base==NULL || tot==0) return; - - /* reverse knots */ - a= tot; - fp1= base; - fp2= fp1+(a-1); - a/= 2; - while(fp1!=fp2 && a>0) { - SWAP(float, *fp1, *fp2); - a--; - fp1++; - fp2--; - } - /* and make in increasing order again */ - a= tot; - fp1= base; - fp2=tempf= MEM_mallocN(sizeof(float)*a, "switchdirect"); - while(a--) { - fp2[0]= fabs(fp1[1]-fp1[0]); - fp1++; - fp2++; - } + /* api callbacks */ + ot->exec= switch_direction_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() - a= tot-1; - fp1= base; - fp2= tempf; - fp1[0]= 0.0; - fp1++; - while(a--) { - fp1[0]= fp1[-1]+fp2[0]; - fp1++; - fp2++; - } - MEM_freeN(tempf); + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -void setweightNurb(Scene *scene) +/****************** set weight operator *******************/ + +static int set_weight_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX context + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); - static float weight= 1.0f; Nurb *nu; BezTriple *bezt; BPoint *bp; + float weight= RNA_float_get(op->ptr, "weight"); int a; - if(fbutton(&weight, 0.0f, 1.0f, 10, 10, "Set Weight")) { - for(nu= editnurb->first; nu; nu= nu->next) { - if(nu->bezt) { - for(bezt=nu->bezt, a=0; apntsu; a++, bezt++) { - if(bezt->f2 & SELECT) - bezt->weight= weight; - } + for(nu= editnurb->first; nu; nu= nu->next) { + if(nu->bezt) { + for(bezt=nu->bezt, a=0; apntsu; a++, bezt++) { + if(bezt->f2 & SELECT) + bezt->weight= weight; } - else if(nu->bp) { - for(bp=nu->bp, a=0; apntsu*nu->pntsv; a++, bp++) { - if(bp->f1 & SELECT) - bp->weight= weight; - } + } + else if(nu->bp) { + for(bp=nu->bp, a=0; apntsu*nu->pntsv; a++, bp++) { + if(bp->f1 & SELECT) + bp->weight= weight; } - } - } - BIF_undo_push("Set Curve Weight"); - DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA); + } + } + + // XXX notifier + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + + return OPERATOR_FINISHED; } -void setradiusNurb(Scene *scene) +void CURVE_OT_set_weight(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Set Curve Weight"; + ot->idname= "CURVE_OT_set_weight"; + + /* api callbacks */ + ot->exec= set_weight_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() + + // XXX invoke popup? + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_float(ot->srna, "weight", 1.0f, 0.0f, 1.0f, "Weight", "", 0.0f, 1.0f); +} + +/******************* set radius operator ******************/ + +static int set_radius_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); - static float radius= 1.0f; Nurb *nu; BezTriple *bezt; BPoint *bp; + float radius= RNA_float_get(op->ptr, "radius"); int a; - if(fbutton(&radius, 0.0001f, 10.0f, 10, 10, "Set Radius")) { - for(nu= editnurb->first; nu; nu= nu->next) { - if(nu->bezt) { - for(bezt=nu->bezt, a=0; apntsu; a++, bezt++) { - if(bezt->f2 & SELECT) - bezt->radius= radius; - } + for(nu= editnurb->first; nu; nu= nu->next) { + if(nu->bezt) { + for(bezt=nu->bezt, a=0; apntsu; a++, bezt++) { + if(bezt->f2 & SELECT) + bezt->radius= radius; } - else if(nu->bp) { - for(bp=nu->bp, a=0; apntsu*nu->pntsv; a++, bp++) { - if(bp->f1 & SELECT) - bp->radius= radius; - } + } + else if(nu->bp) { + for(bp=nu->bp, a=0; apntsu*nu->pntsv; a++, bp++) { + if(bp->f1 & SELECT) + bp->radius= radius; } - } - } - BIF_undo_push("Set Curve Radius"); - DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA); + } + } + + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + + return OPERATOR_FINISHED; } -void smoothNurb(Scene *scene) +void CURVE_OT_set_radius(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Set Curve Radius"; + ot->idname= "CURVE_OT_set_radius"; + + /* api callbacks */ + ot->exec= set_radius_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() + + // XXX invoke popup? + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_float(ot->srna, "radius", 1.0f, 0.0f, FLT_MAX, "Radius", "", 0.0001f, 10.0f); +} + +/********************* smooth operator ********************/ + +static int smooth_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BezTriple *bezt, *beztOrig; BPoint *bp, *bpOrig; - int a, i, change = 0; - - /* floats for smoothing */ float val, newval, offset; + int a, i, change = 0; for(nu= editnurb->first; nu; nu= nu->next) { if(nu->bezt) { @@ -1189,14 +1222,33 @@ void smoothNurb(Scene *scene) MEM_freeN(bpOrig); } } - BIF_undo_push("Smooth Curve"); - DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA); + + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + // XXX notifier + + return OPERATOR_FINISHED; } -/* TODO, make smoothing distance based */ -void smoothradiusNurb(Scene *scene) +void CURVE_OT_smooth(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Smooth"; + ot->idname= "CURVE_OT_smooth"; + + /* api callbacks */ + ot->exec= smooth_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/**************** smooth curve radius operator *************/ + +/* TODO, make smoothing distance based */ +static int smooth_curve_radius_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BezTriple *bezt; @@ -1335,13 +1387,28 @@ void smoothradiusNurb(Scene *scene) } } } - BIF_undo_push("Smooth Curve Radius"); - DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA); + + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + // XXX notifier + + return OPERATOR_FINISHED; } +void CURVE_OT_smooth_curve_radius(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Smooth Curve Radius"; + ot->idname= "CURVE_OT_smooth_curve_radius"; + + /* api clastbacks */ + ot->exec= smooth_curve_radius_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} - -/* **************** EDIT ************************ */ +/***************** selection utility *************************/ /* next == 1 -> select next */ /* next == -1 -> select previous */ @@ -1406,47 +1473,14 @@ static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short } } -static short nurb_has_selected_cps(ListBase *editnurb) -{ - Nurb *nu; - BezTriple *bezt; - BPoint *bp; - int a; - - for(nu= editnurb->first; nu; nu= nu->next) { - if((nu->type & 7)==CU_BEZIER) { - a= nu->pntsu; - bezt= nu->bezt; - while(a--) { - if(bezt->hide==0) { - if((bezt->f1 & SELECT) - || (bezt->f2 & SELECT) - || (bezt->f3 & SELECT)) return 1; - } - bezt++; - } - } - else { - a= nu->pntsu*nu->pntsv; - bp= nu->bp; - while(a--) { - if((bp->hide==0) && (bp->f1 & SELECT)) return 1; - bp++; - } - } - } - - return 0; -} - +/**************** select start/end operators **************/ /* (de)selects first or last of visible part of each Nurb depending on selFirst */ /* selFirst: defines the end of which to select */ /* doswap: defines if selection state of each first/last control point is swapped */ /* selstatus: selection status in case doswap is false */ -void selectend_nurb(Scene *scene, short selfirst, short doswap, short selstatus) +void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatus) { - Object *obedit= scene->obedit; // XXX use context ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BPoint *bp; @@ -1497,43 +1531,134 @@ void selectend_nurb(Scene *scene, short selfirst, short doswap, short selstatus) } } } - - BIF_undo_push("Select/Deselect End"); } -void deselectall_nurb(Scene *scene) +static int de_select_first_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX use context - ListBase *editnurb= curve_get_editcurve(obedit); - View3D *v3d= NULL; // XXX - - if(!v3d || !(obedit->lay & v3d->lay)) - return; + Object *obedit= CTX_data_edit_object(C); + selectend_nurb(obedit, FIRST, 1, DESELECT); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void CURVE_OT_de_select_first(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select or Deselect First"; + ot->idname= "CURVE_OT_de_select_first"; + + /* api cfirstbacks */ + ot->exec= de_select_first_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int de_select_last_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + + selectend_nurb(obedit, LAST, 1, DESELECT); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void CURVE_OT_de_select_last(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select or Deselect Last"; + ot->idname= "CURVE_OT_de_select_last"; + + /* api clastbacks */ + ot->exec= de_select_last_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/******************* de select all operator ***************/ + +static short nurb_has_selected_cps(ListBase *editnurb) +{ + Nurb *nu; + BezTriple *bezt; + BPoint *bp; + int a; + + for(nu= editnurb->first; nu; nu= nu->next) { + if((nu->type & 7)==CU_BEZIER) { + a= nu->pntsu; + bezt= nu->bezt; + while(a--) { + if(bezt->hide==0) { + if((bezt->f1 & SELECT) + || (bezt->f2 & SELECT) + || (bezt->f3 & SELECT)) return 1; + } + bezt++; + } + } + else { + a= nu->pntsu*nu->pntsv; + bp= nu->bp; + while(a--) { + if((bp->hide==0) && (bp->f1 & SELECT)) return 1; + bp++; + } + } + } + + return 0; +} + +static int de_select_all_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + ListBase *editnurb= curve_get_editcurve(obedit); + if(nurb_has_selected_cps(editnurb)) { /* deselect all */ - selectend_nurb(scene, FIRST, 0, DESELECT); /* set first control points as unselected */ + selectend_nurb(obedit, FIRST, 0, DESELECT); /* set first control points as unselected */ select_adjacent_cp(editnurb, 1, 1, DESELECT); /* cascade selection */ } else { /* select all */ - selectend_nurb(scene, FIRST, 0, SELECT); /* set first control points as selected */ + selectend_nurb(obedit, FIRST, 0, SELECT); /* set first control points as selected */ select_adjacent_cp(editnurb, 1, 1, SELECT); /* cascade selection */ } - BIF_undo_push("Deselect all"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; } -void hideNurb(Scene *scene, int swap) +void CURVE_OT_de_select_all(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Select or Deselect All"; + ot->idname= "CURVE_OT_de_select_all"; + + /* api callbacks */ + ot->exec= de_select_all_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/********************** hide operator *********************/ + +static int hide_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BPoint *bp; BezTriple *bezt; - int a, sel; - - if(obedit==0) return; - - BIF_undo_push("Hide"); + int a, sel, invert= RNA_boolean_get(op->ptr, "invert"); for(nu= editnurb->first; nu; nu= nu->next) { if((nu->type & 7)==CU_BEZIER) { @@ -1555,11 +1680,11 @@ void hideNurb(Scene *scene, int swap) a= nu->pntsu*nu->pntsv; sel= 0; while(a--) { - if(swap==0 && (bp->f1 & SELECT)) { + if(invert==0 && (bp->f1 & SELECT)) { select_bpoint(bp, DESELECT, 1, HIDDEN); bp->hide= 1; } - else if(swap && (bp->f1 & SELECT)==0) { + else if(invert && (bp->f1 & SELECT)==0) { select_bpoint(bp, DESELECT, 1, HIDDEN); bp->hide= 1; } @@ -1570,20 +1695,40 @@ void hideNurb(Scene *scene, int swap) } } - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; } -void revealNurb(Scene *scene) +void CURVE_OT_hide(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Hide Selection"; + ot->idname= "CURVE_OT_hide"; + + /* api callbacks */ + ot->exec= hide_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_boolean(ot->srna, "invert", 0, "Invert", "Hide unselected rather than selected."); +} + +/********************** reveal operator *********************/ + +static int reveal_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BPoint *bp; BezTriple *bezt; int a; - if(obedit==0) return; - for(nu= editnurb->first; nu; nu= nu->next) { nu->hide= 0; if((nu->type & 7)==CU_BEZIER) { @@ -1610,22 +1755,37 @@ void revealNurb(Scene *scene) } } - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - BIF_undo_push("Reveal"); + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } -void selectswapNurb(Scene *scene) +void CURVE_OT_reveal(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Reveal Hidden"; + ot->idname= "CURVE_OT_reveal"; + + /* api callbacks */ + ot->exec= reveal_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/********************** select invert operator *********************/ + +static int select_invert_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BPoint *bp; BezTriple *bezt; int a; - if(obedit==0) return; - for(nu= editnurb->first; nu; nu= nu->next) { if((nu->type & 7)==CU_BEZIER) { bezt= nu->bezt; @@ -1651,10 +1811,27 @@ void selectswapNurb(Scene *scene) } } - BIF_undo_push("Select swap"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } +void CURVE_OT_select_invert(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Invert"; + ot->idname= "CURVE_OT_select_invert"; + + /* api callbacks */ + ot->exec= select_invert_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/********************** subdivide operator *********************/ + /** Divide the line segments associated with the currently selected * curve nodes (Bezier or NURB). If there are no valid segment * selections within the current selection, nothing happens. @@ -1663,9 +1840,10 @@ void selectswapNurb(Scene *scene) * @return Nothing * @param None */ -void subdivideNurb(Scene *scene) + +static int subdivide_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BezTriple *prevbezt, *bezt, *beztnew, *beztn; @@ -2030,12 +2208,28 @@ void subdivideNurb(Scene *scene) } - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - - BIF_undo_push("Subdivide"); + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + // XXX notifier WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } +void CURVE_OT_subdivide(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Subdivide"; + ot->idname= "CURVE_OT_subdivide"; + + /* api callbacks */ + ot->exec= subdivide_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/******************** find nearest ************************/ + static void findnearestNurbvert__doClosest(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y) { struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; short dist, hpoint, select, mval[2]; } *data = userData; @@ -2091,7 +2285,6 @@ static short findnearestNurbvert(ViewContext *vc, short sel, short mval[2], Nurb return data.hpoint; } - static void findselectedNurbvert(ListBase *editnurb, Nurb **nu, BezTriple **bezt, BPoint **bp) { /* in nu and (bezt or bp) selected are written if there's 1 sel. */ @@ -2154,7 +2347,9 @@ static void findselectedNurbvert(ListBase *editnurb, Nurb **nu, BezTriple **bezt } } -int convertspline(short type, Nurb *nu) +/***************** set spline type operator *******************/ + +static int convertspline(short type, Nurb *nu) { BezTriple *bezt; BPoint *bp; @@ -2248,7 +2443,7 @@ int convertspline(short type, Nurb *nu) } } } - else if( (nu->type & 7)==CU_NURBS) { + else if((nu->type & 7)==CU_NURBS) { if(type==0) { /* to Poly */ nu->type &= ~7; if(nu->knotsu) MEM_freeN(nu->knotsu); /* python created nurbs have a knotsu of zero */ @@ -2290,33 +2485,105 @@ int convertspline(short type, Nurb *nu) } } } + return 0; } -void setsplinetype(Scene *scene, short type) +static int set_spline_type_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; + int changed=0, type= RNA_enum_get(op->ptr, "type"); if(type==CU_CARDINAL || type==CU_BSPLINE) { - error("Not implemented yet"); - return; + BKE_report(op->reports, RPT_ERROR, "Not implemented yet"); + return OPERATOR_CANCELLED; } for(nu= editnurb->first; nu; nu= nu->next) { if(isNurbsel(nu)) { - if (convertspline(type, nu)) - error("no conversion possible"); + if(convertspline(type, nu)) + BKE_report(op->reports, RPT_ERROR, "No conversion possible"); + else + changed= 1; } } - BIF_undo_push("Set spline type"); - + + return (changed)? OPERATOR_FINISHED: OPERATOR_CANCELLED; } +void CURVE_OT_set_spline_type(wmOperatorType *ot) +{ + static EnumPropertyItem type_items[]= { + {CU_POLY, "POLY", "Poly", ""}, + {CU_BEZIER, "BEZIER", "Bezier", ""}, + {CU_CARDINAL, "CARDINAL", "Cardinal", ""}, + {CU_BSPLINE, "B_SPLINE", "B-Spline", ""}, + {CU_NURBS, "NURBS", "NURBS", ""}, + {0, NULL, NULL, NULL}}; + + /* identifiers */ + ot->name= "Set Spline Type"; + ot->idname= "CURVE_OT_set_spline_type"; + + /* api callbacks */ + ot->exec= set_spline_type_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", type_items, CU_POLY, "Type", "Spline type"); +} + +/***************** XXX make segment operator **********************/ + /* ******************** SKINNING LOFTING!!! ******************** */ -void rotate_direction_nurb(Nurb *nu) +static void switchdirection_knots(float *base, int tot) +{ + float *fp1, *fp2, *tempf; + int a; + + if(base==NULL || tot==0) return; + + /* reverse knots */ + a= tot; + fp1= base; + fp2= fp1+(a-1); + a/= 2; + while(fp1!=fp2 && a>0) { + SWAP(float, *fp1, *fp2); + a--; + fp1++; + fp2--; + } + /* and make in increasing order again */ + a= tot; + fp1= base; + fp2=tempf= MEM_mallocN(sizeof(float)*a, "switchdirect"); + while(a--) { + fp2[0]= fabs(fp1[1]-fp1[0]); + fp1++; + fp2++; + } + + a= tot-1; + fp1= base; + fp2= tempf; + fp1[0]= 0.0; + fp1++; + while(a--) { + fp1[0]= fp1[-1]+fp2[0]; + fp1++; + fp2++; + } + MEM_freeN(tempf); +} + +static void rotate_direction_nurb(Nurb *nu) { BPoint *bp1, *bp2, *temp; int u, v; @@ -2341,7 +2608,7 @@ void rotate_direction_nurb(Nurb *nu) MEM_freeN(temp); } -int is_u_selected(Nurb *nu, int u) +static int is_u_selected(Nurb *nu, int u) { BPoint *bp; int v; @@ -2355,8 +2622,6 @@ int is_u_selected(Nurb *nu, int u) return 0; } -/* ******************************** */ - typedef struct NurbSort { struct NurbSort *next, *prev; Nurb *nu; @@ -2366,7 +2631,7 @@ typedef struct NurbSort { static ListBase nsortbase= {0, 0}; /* static NurbSort *nusmain; */ /* this var seems to go unused... at least in this file */ -void make_selection_list_nurb(ListBase *editnurb) +static void make_selection_list_nurb(ListBase *editnurb) { ListBase nbase= {0, 0}; NurbSort *nus, *nustest, *headdo, *taildo; @@ -2433,7 +2698,7 @@ void make_selection_list_nurb(ListBase *editnurb) } } -void merge_2_nurb(ListBase *editnurb, Nurb *nu1, Nurb *nu2) +static void merge_2_nurb(wmOperator *op, ListBase *editnurb, Nurb *nu1, Nurb *nu2) { BPoint *bp, *bp1, *bp2, *temp; float len1, len2; @@ -2485,7 +2750,7 @@ void merge_2_nurb(ListBase *editnurb, Nurb *nu1, Nurb *nu2) } if( nu1->pntsv != nu2->pntsv ) { - error("Resolution doesn't match"); + BKE_report(op->reports, RPT_ERROR, "Resolution doesn't match"); return; } @@ -2549,9 +2814,9 @@ void merge_2_nurb(ListBase *editnurb, Nurb *nu1, Nurb *nu2) freeNurb(nu2); } -void merge_nurb(Scene *scene) +static int merge_nurb(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX use context + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); NurbSort *nus1, *nus2; int ok= 1; @@ -2560,8 +2825,8 @@ void merge_nurb(Scene *scene) if(nsortbase.first == nsortbase.last) { BLI_freelistN(&nsortbase); - error("Too few selections to merge"); - return; + BKE_report(op->reports, RPT_ERROR, "Too few selections to merge."); + return OPERATOR_CANCELLED; } nus1= nsortbase.first; @@ -2583,13 +2848,13 @@ void merge_nurb(Scene *scene) } if(ok==0) { - error("Resolution doesn't match"); + BKE_report(op->reports, RPT_ERROR, "Resolution doesn't match"); BLI_freelistN(&nsortbase); - return; + return OPERATOR_CANCELLED; } while(nus2) { - merge_2_nurb(editnurb, nus1->nu, nus2->nu); + merge_2_nurb(op, editnurb, nus1->nu, nus2->nu); nus2= nus2->next; } @@ -2597,17 +2862,19 @@ void merge_nurb(Scene *scene) set_actNurb(obedit, NULL); - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + // XXX notifier - BIF_undo_push("Merge"); + // XXX BIF_undo_push("Merge"); + return OPERATOR_FINISHED; } - -void addsegment_nurb(Scene *scene) +static int make_segment_exec(bContext *C, wmOperator *op) { /* joins 2 curves */ - Object *obedit= scene->obedit; // XXX + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu, *nu1=0, *nu2=0; BezTriple *bezt; @@ -2634,10 +2901,9 @@ void addsegment_nurb(Scene *scene) } nu= nu->next; } - if(nu) { - merge_nurb(scene); - return; - } + + if(nu) + return merge_nurb(C, op); /* find both nurbs and points, nu1 will be put behind nu2 */ for(nu= editnurb->first; nu; nu= nu->next) { @@ -2753,13 +3019,32 @@ void addsegment_nurb(Scene *scene) set_actNurb(obedit, NULL); /* for selected */ DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + // XXX notifier - BIF_undo_push("Add segment"); - + return OPERATOR_FINISHED; + } + else { + BKE_report(op->reports, RPT_ERROR, "Can't make segment"); + return OPERATOR_CANCELLED; } - else error("Can't make segment"); } +void CURVE_OT_make_segment(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Make Segment"; + ot->idname= "CURVE_OT_make_segment"; + + /* api callbacks */ + ot->exec= make_segment_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************** XXX pick select operator **********************/ + void mouse_nurb(bContext *C, short mval[2], int extend) { Object *obedit= CTX_data_edit_object(C); @@ -2823,11 +3108,13 @@ void mouse_nurb(bContext *C, short mval[2], int extend) } +/***************** XXX spin operator **********************/ + /* from what I can gather, the mode==0 magic number spins and bridges the nurbs based on the * orientation of the global 3d view (yuck yuck!) mode==1 does the same, but doesn't bridge up * up the new geometry, mode==2 now does the same as 0, but aligned to world axes, not the view. */ -static void spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode) +static int spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode) { ListBase *editnurb= curve_get_editcurve(obedit); RegionView3D *rv3d= NULL; // XXX @@ -2836,10 +3123,10 @@ static void spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode) float *curs, si,phi,n[3],q[4],cmat[3][3],tmat[3][3],imat[3][3]; float cent[3],bmat[3][3], rotmat[3][3], scalemat1[3][3], scalemat2[3][3]; float persmat[3][3], persinv[3][3]; - short a,ok; + short a,ok, changed= 0; - if(v3d==0 || obedit==0 || obedit->type!=OB_SURF) return; - if( (v3d->lay & obedit->lay)==0 ) return; + if(obedit->type!=OB_SURF) + return changed; // XXX poll if (mode != 2) Mat3CpyMat4(persmat, rv3d->viewmat); else Mat3One(persmat); @@ -2896,11 +3183,13 @@ static void spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode) for(a=0;a<7;a++) { if(mode==0 || mode==2) ok= extrudeflagNurb(editnurb, 1); - else adduplicateflagNurb(scene, 1); - if(ok==0) { - error("Can't spin"); - break; - } + else adduplicateflagNurb(obedit, 1); + + if(ok==0) + return changed; + + changed= 1; + rotateflagNurb(editnurb, 1,cent,rotmat); if(mode==0 || mode==2) { @@ -2928,21 +3217,44 @@ static void spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode) } } } + + return changed; +} + +static int spin_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + + if(!spin_nurb(scene, obedit, 0, 0)) { + BKE_report(op->reports, RPT_ERROR, "Can't spin"); + return OPERATOR_CANCELLED; + } + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + // XXX notifier + + return OPERATOR_FINISHED; +} + +void CURVE_OT_spin(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Spin"; + ot->idname= "CURVE_OT_spin"; + /* api callbacks */ + ot->exec= spin_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -/* external one, for undo */ -void spinNurb(Scene *scene, float *dvec, short mode) -{ - Object *obedit= scene->obedit; // XXX use context +/***************** XXX add vertex operator **********************/ - spin_nurb(scene, obedit, dvec, mode); - BIF_undo_push("Spin"); -} - -void addvert_Nurb(Scene *scene, int mode) +static int addvert_Nurb(Scene *scene, Object *obedit, short mode) { - Object *obedit= scene->obedit; // XXX use context ListBase *editnurb= curve_get_editcurve(obedit); View3D *v3d= NULL; // XXX Nurb *nu; @@ -2950,14 +3262,14 @@ void addvert_Nurb(Scene *scene, int mode) BPoint *bp, *newbp = NULL; float *curs, mat[3][3],imat[3][3], temp[3]; - if(obedit==0 || v3d == 0) return; - if( (v3d->lay & obedit->lay)==0 ) return; + if(obedit==0 || v3d == 0) return OPERATOR_CANCELLED; + if( (v3d->lay & obedit->lay)==0 ) return OPERATOR_CANCELLED; Mat3CpyMat4(mat, obedit->obmat); Mat3Inv(imat,mat); findselectedNurbvert(editnurb, &nu, &bezt, &bp); - if(bezt==0 && bp==0) return; + if(bezt==0 && bp==0) return OPERATOR_CANCELLED; if((nu->type & 7)==CU_BEZIER) { /* which bezpoint? */ @@ -3074,41 +3386,87 @@ void addvert_Nurb(Scene *scene, int mode) BIF_undo_push("Add vertex"); } + + return OPERATOR_FINISHED; } -void extrude_nurb(Scene *scene) +static int add_vertex_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + + // XXX + + return addvert_Nurb(scene, obedit, 0); +} + +void CURVE_OT_add_vertex(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Vertex"; + ot->idname= "CURVE_OT_add_vertex"; + + /* api callbacks */ + ot->exec= add_vertex_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************** XXX extrude operator **********************/ + +static int extrude_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; int ok= 0; - if(obedit && obedit->type==OB_SURF) { + if(obedit->type!=OB_SURF) + return OPERATOR_CANCELLED; - /* first test: curve? */ - for(nu= editnurb->first; nu; nu= nu->next) { - if(nu->pntsv==1 && isNurbsel_count(nu)==1 ) break; - } - if(nu) { - addvert_Nurb(scene, 'e'); - } else { - ok= extrudeflagNurb(editnurb, 1); /* '1'= flag */ - - if(ok) { - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); -// XXX BIF_TransformSetUndo("Extrude"); -// initTransform(TFM_TRANSLATION, CTX_NO_PET); -// Transform(); - } + /* first test: curve? */ + for(nu= editnurb->first; nu; nu= nu->next) { + if(nu->pntsv==1 && isNurbsel_count(nu)==1 ) break; + } + if(nu) { + addvert_Nurb(scene, obedit, 'e'); + } else { + ok= extrudeflagNurb(editnurb, 1); /* '1'= flag */ + + if(ok) { + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + // XXX notifier +// XXX BIF_TransformSetUndo("Extrude"); +// initTransform(TFM_TRANSLATION, CTX_NO_PET); +// Transform(); } } + + return OPERATOR_FINISHED; } - - -void makecyclicNurb(Scene *scene) +void CURVE_OT_extrude(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Extrude"; + ot->idname= "CURVE_OT_extrude"; + + /* api callbacks */ + ot->exec= extrude_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************** XXX make cyclic operator **********************/ + +static int make_cyclic_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BezTriple *bezt; @@ -3170,8 +3528,8 @@ void makecyclicNurb(Scene *scene) } else if(nu->type==CU_NURBS) { if(cyclmode==0) { - cyclmode= pupmenu("Toggle %t|cyclic U%x1|cyclic V%x2"); - if(cyclmode < 1) return; + cyclmode= pupmenu("Toggle %t|cyclic U%x1|cyclic V%x2"); // XXX + if(cyclmode < 1) return OPERATOR_CANCELLED; } a= nu->pntsu*nu->pntsv; bp= nu->bp; @@ -3220,12 +3578,31 @@ void makecyclicNurb(Scene *scene) } } } - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - BIF_undo_push("Cyclic"); + + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + + return OPERATOR_FINISHED; } -void selectconnected_nurb(Scene *scene) +void CURVE_OT_make_cyclic(wmOperatorType *ot) { + /* identifiers */ + ot->name= "Make Cyclic"; + ot->idname= "CURVE_OT_make_cyclic"; + + /* api callbacks */ + ot->exec= make_cyclic_exec; + ot->poll= ED_operator_editcurve; // XXX nurb poll() + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************** XXX select linked operator **********************/ + +static int select_linked_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ViewContext vc; Nurb *nu; BezTriple *bezt; @@ -3233,8 +3610,8 @@ void selectconnected_nurb(Scene *scene) int a; short mval[2], shift= 0; // XXX - findnearestNurbvert(&vc, 1, mval, &nu, &bezt, &bp); + if(bezt) { a= nu->pntsu; bezt= nu->bezt; @@ -3254,13 +3631,30 @@ void selectconnected_nurb(Scene *scene) } } - BIF_undo_push("Select connected"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } -void selectrow_nurb(Scene *scene) +void CURVE_OT_select_linked(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Select Linked"; + ot->idname= "CURVE_OT_select_linked"; + + /* api callbacks */ + ot->exec= select_linked_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************** select row operator **********************/ + +static int select_row_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Curve *cu= obedit->data; static BPoint *last=0; @@ -3269,9 +3663,14 @@ void selectrow_nurb(Scene *scene) BPoint *bp; int u = 0, v = 0, a, b, ok=0; - if(editnurb->first==0) return; - if(obedit==NULL || obedit->type!=OB_SURF) return; - if(cu->lastselbp==NULL) return; + if(editnurb->first==0) + return OPERATOR_CANCELLED; + + if(obedit->type!=OB_SURF) + return OPERATOR_CANCELLED; // XXX poll() + + if(cu->lastselbp==NULL) + return OPERATOR_CANCELLED; /* find the correct nurb and toggle with u of v */ for(nu= editnurb->first; nu; nu= nu->next) { @@ -3287,6 +3686,7 @@ void selectrow_nurb(Scene *scene) } if(ok) break; } + if(ok) { if(last==cu->lastselbp) { direction= 1-direction; @@ -3305,40 +3705,89 @@ void selectrow_nurb(Scene *scene) } } } - return; + + break; } } - BIF_undo_push("Select Row"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; } -void select_next_nurb(Scene *scene) +void CURVE_OT_select_row(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX use context - ListBase *editnurb= curve_get_editcurve(obedit); + /* identifiers */ + ot->name= "Select Control Point Row"; + ot->idname= "CURVE_OT_select_row"; - if(obedit==0) return; + /* api callbacks */ + ot->exec= select_row_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************** select next operator **********************/ + +static int select_next_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + ListBase *editnurb= curve_get_editcurve(obedit); select_adjacent_cp(editnurb, 1, 0, SELECT); - - BIF_undo_push("Select Next"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; } -void select_prev_nurb(Scene *scene) +void CURVE_OT_select_next(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX use context + /* identifiers */ + ot->name= "Select Next"; + ot->idname= "CURVE_OT_select_next"; + + /* api callbacks */ + ot->exec= select_next_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************** select previous operator **********************/ + +static int select_previous_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); - if(obedit==NULL) return; - select_adjacent_cp(editnurb, -1, 0, SELECT); - - BIF_undo_push("Select Previous"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; } -void select_more_nurb(Scene *scene) +void CURVE_OT_select_previous(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Select Previous"; + ot->idname= "CURVE_OT_select_previous"; + + /* api callbacks */ + ot->exec= select_previous_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************** select more operator **********************/ + +static int select_more_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BPoint *bp, *tempbp; @@ -3346,8 +3795,6 @@ void select_more_nurb(Scene *scene) short sel= 0; short *selbpoints; - if(obedit==0) return; - /* note that NURBS surface is a special case because we mimic */ /* the behaviour of "select more" of mesh tools. */ /* The algorithm is designed to work in planar cases so it */ @@ -3404,13 +3851,31 @@ void select_more_nurb(Scene *scene) select_adjacent_cp(editnurb, -1, 0, SELECT); } - BIF_undo_push("Select More"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; } -/* basic method: deselect if control point doesn't have all neighbours selected */ -void select_less_nurb(Scene *scene) +void CURVE_OT_select_more(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Select More"; + ot->idname= "CURVE_OT_select_more"; + + /* api callbacks */ + ot->exec= select_more_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/******************** select less operator *****************/ + +/* basic method: deselect if control point doesn't have all neighbours selected */ +static int select_less_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BPoint *bp; @@ -3418,8 +3883,6 @@ void select_less_nurb(Scene *scene) int a; short sel= 0, lastsel= 0; short *selbpoints; - - if(obedit==0) return; if(obedit->type==OB_SURF) { for(nu= editnurb->first; nu; nu= nu->next) { @@ -3549,9 +4012,27 @@ void select_less_nurb(Scene *scene) } } - BIF_undo_push("Select Less"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; } +void CURVE_OT_select_less(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Less"; + ot->idname= "CURVE_OT_select_less"; + + /* api callbacks */ + ot->exec= select_less_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/********************** select random *********************/ + /* this function could be moved elsewhere as it can be reused in other parts of the source needing randomized list */ /* returns list containing -1 in indices that have been left out of the list. otherwise index contains reference */ /* to next index. basically *list contains a linked list */ @@ -3584,26 +4065,23 @@ static void generate_pickable_list(int *list, int size, int pickamount) } } -void select_random_nurb(Scene *scene) +static int select_random_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BezTriple *bezt; BPoint *bp; - static short randfac= 50; + float percent= RNA_float_get(op->ptr, "percent"); int amounttoselect, amountofcps, a, i, k= 0; int *itemstobeselected; - - if(!obedit) return; - if(!button(&randfac,0, 100,"Percentage:")) return; - - if(randfac == 0) return; + if(percent == 0.0f) + return OPERATOR_CANCELLED; amountofcps= count_curveverts_without_handles(editnurb); itemstobeselected= MEM_callocN(sizeof(int) * amountofcps, "selectitems"); - amounttoselect= floor(randfac * amountofcps / 100 + 0.5); + amounttoselect= floor(percent * amountofcps + 0.5); generate_pickable_list(itemstobeselected, amountofcps, amounttoselect); /* select elements */ @@ -3630,69 +4108,117 @@ void select_random_nurb(Scene *scene) MEM_freeN(itemstobeselected); - BIF_undo_push("Select Random"); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; } -void select_every_nth_nurb(Scene *scene) +void CURVE_OT_select_random(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX use context - ListBase *editnurb= curve_get_editcurve(obedit); - static short nfac= 2; - - if(!obedit) return; - - if(!button(&nfac, 2, 25,"N:")) return; - - select_adjacent_cp(editnurb, nfac, 1, SELECT); - select_adjacent_cp(editnurb, -nfac, 1, SELECT); + /* identifiers */ + ot->name= "Select Random"; + ot->idname= "CURVE_OT_select_random"; - BIF_undo_push("Select Every Nth"); + /* api callbacks */ + ot->exec= select_random_exec; + ot->poll= ED_operator_editcurve; + + // XXX invoke popup? + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_float(ot->srna, "percent", 0.5f, 0.0f, 1.0f, "Percent", "Percentage of vertices to select randomly.", 0.0001f, 1.0f); } -void adduplicate_nurb(Scene *scene) +/********************** select every nth *********************/ + +static int select_every_nth_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX use context - View3D *v3d= NULL; // XXX + Object *obedit= CTX_data_edit_object(C); + ListBase *editnurb= curve_get_editcurve(obedit); + int n= RNA_int_get(op->ptr, "n"); + + select_adjacent_cp(editnurb, n, 1, SELECT); + select_adjacent_cp(editnurb, -n, 1, SELECT); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - if(v3d==0 || (v3d->lay & obedit->lay)==0 ) return; + return OPERATOR_FINISHED; +} - adduplicateflagNurb(scene, 1); +void CURVE_OT_select_every_nth(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Every Nth"; + ot->idname= "CURVE_OT_select_every_nth"; + + /* api callbacks */ + ot->exec= select_every_nth_exec; + ot->poll= ED_operator_editcurve; + + // XXX invoke popup? + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_int(ot->srna, "n", 2, 2, INT_MAX, "N", "Select every Nth element", 2, 25); +} + +/********************** add duplicate operator *********************/ + +static int add_duplicate_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + + adduplicateflagNurb(obedit, 1); // XXX BIF_TransformSetUndo("Add Duplicate"); // initTransform(TFM_TRANSLATION, CTX_NO_PET); // Transform(); + + return OPERATOR_FINISHED; } -void delNurb(Scene *scene) +void CURVE_OT_add_duplicate(wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX + /* identifiers */ + ot->name= "Add Duplicate"; + ot->idname= "CURVE_OT_add_duplicate"; + + /* api callbacks */ + ot->exec= add_duplicate_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/********************** delete operator *********************/ + +static int delete_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); - View3D *v3d= NULL; // XXX Nurb *nu, *next, *nu1; BezTriple *bezt, *bezt1, *bezt2; BPoint *bp, *bp1, *bp2; - int a; - short event, cut = 0; - - if(obedit==0 ) return; - if(v3d==0 || (v3d->lay & obedit->lay)==0 ) return; - - if(obedit->type==OB_SURF) event= pupmenu("Erase %t|Selected%x0|All%x2"); - else event= pupmenu("Erase %t|Selected%x0|Segment%x1|All%x2"); - - if(event== -1) return; + int a, cut= 0, type= RNA_enum_get(op->ptr, "type"); if(obedit->type==OB_SURF) { - if(event==0) deleteflagNurb(scene, 1); + if(type==0) deleteflagNurb(C, op, 1); else freeNurblist(editnurb); + // XXX notifier DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - BIF_undo_push("Delete"); - return; + return OPERATOR_FINISHED; } - if(event==0) { + if(type==0) { /* first loop, can we remove entire pieces? */ nu= editnurb->first; while(nu) { @@ -3743,7 +4269,7 @@ void delNurb(Scene *scene) nu= editnurb->first; while(nu) { next= nu->next; - event= 0; + type= 0; if( (nu->type & 7)==CU_BEZIER ) { bezt= nu->bezt; for(a=0;apntsu;a++) { @@ -3751,11 +4277,11 @@ void delNurb(Scene *scene) memmove(bezt, bezt+1, (nu->pntsu-a-1)*sizeof(BezTriple)); nu->pntsu--; a--; - event= 1; + type= 1; } else bezt++; } - if(event) { + if(type) { bezt1 = (BezTriple*)MEM_mallocN((nu->pntsu) * sizeof(BezTriple), "delNurb"); memcpy(bezt1, nu->bezt, (nu->pntsu)*sizeof(BezTriple) ); @@ -3772,13 +4298,13 @@ void delNurb(Scene *scene) memmove(bp, bp+1, (nu->pntsu-a-1)*sizeof(BPoint)); nu->pntsu--; a--; - event= 1; + type= 1; } else { bp++; } } - if(event) { + if(type) { bp1 = (BPoint*)MEM_mallocN(nu->pntsu * sizeof(BPoint), "delNurb2"); memcpy(bp1, nu->bp, (nu->pntsu)*sizeof(BPoint) ); MEM_freeN(nu->bp); @@ -3796,7 +4322,7 @@ void delNurb(Scene *scene) nu= next; } } - else if(event==1) { /* erase segment */ + else if(type==1) { /* erase segment */ /* find the 2 selected points */ bezt1= bezt2= 0; bp1= bp2= 0; @@ -3820,7 +4346,7 @@ void delNurb(Scene *scene) BIF_undo_push("Delete"); } } - return; + return OPERATOR_FINISHED; //XXX } cut= a; nu1= nu; @@ -3845,7 +4371,7 @@ void delNurb(Scene *scene) BIF_undo_push("Delete"); } } - return; + return OPERATOR_FINISHED; // XXX } cut= a; nu1= nu; @@ -3935,39 +4461,106 @@ void delNurb(Scene *scene) } } } - else if(event==2) { + else if(type==2) freeNurblist(editnurb); - } DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - - BIF_undo_push("Delete"); + // XXX notifier + return OPERATOR_FINISHED; } -void nurb_set_smooth(Scene *scene, short event) +static int delete_invoke(bContext *C, wmOperator *op, wmEvent *event) { - Object *obedit= scene->obedit; // XXX + Object *obedit= CTX_data_edit_object(C); + uiMenuItem *head; + + if(obedit->type==OB_SURF) { + head= uiPupMenuBegin("Delete", 0); + uiMenuItemEnumO(head, "", 0, op->idname, "type", 0); + uiMenuItemEnumO(head, "", 0, op->idname, "type", 2); + uiPupMenuEnd(C, head); + } + else { + head= uiPupMenuBegin("Delete", 0); + uiMenuItemsEnumO(head, op->idname, "type"); + uiPupMenuEnd(C, head); + } + + return OPERATOR_CANCELLED; +} + +void CURVE_OT_delete(wmOperatorType *ot) +{ + static EnumPropertyItem type_items[] = { + {0, "SELECTED", "Selected", ""}, + {1, "SEGMENT", "Segment", ""}, + {2, "ALL", "All", ""}, + {0, NULL, NULL, NULL}}; + + /* identifiers */ + ot->name= "Delete"; + ot->idname= "CURVE_OT_delete"; + + /* api callbacks */ + ot->exec= delete_exec; + ot->invoke= delete_invoke; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "Which elements to delete."); +} + +/********************** set smooth operator *********************/ + +static int set_smooth_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; + int disable= RNA_boolean_get(op->ptr, "disable"); - if(obedit==0) return; - - if(obedit->type != OB_CURVE) return; + if(obedit->type != OB_CURVE) + return OPERATOR_CANCELLED; for(nu= editnurb->first; nu; nu= nu->next) { if(isNurbsel(nu)) { - if(event==1) nu->flag |= CU_SMOOTH; - else if(event==0) nu->flag &= ~CU_SMOOTH; + if(!disable) nu->flag |= CU_SMOOTH; + else nu->flag &= ~CU_SMOOTH; } } - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + // XXX notifier + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); - if(event==1) BIF_undo_push("Set Smooth"); - else if(event==0) BIF_undo_push("Set Solid"); + // XXX if(event==1) BIF_undo_push("Set Smooth"); + // XXX else if(event==0) BIF_undo_push("Set Solid"); + + return OPERATOR_FINISHED; } +void CURVE_OT_set_smooth(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set Smooth"; + ot->idname= "CURVE_OT_set_smooth"; + + /* api callbacks */ + ot->exec= set_smooth_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_boolean(ot->srna, "disable", 0, "Disable", "Disable smooth shading for selection instead of enabling it."); +} + +/********************* XXX join operator ***********************/ + int join_curve(Scene *scene, int type) { View3D *v3d= NULL; // XXX @@ -4052,6 +4645,8 @@ int join_curve(Scene *scene, int type) return 1; } +/***************** XXX add primitive operator ********************/ + Nurb *addNurbprim(bContext *C, int type, int newname) { static int xzproj= 0; /* this function calls itself... */ @@ -4454,54 +5049,17 @@ Nurb *addNurbprim(bContext *C, int type, int newname) return nu; } -void default_curve_ipo(Scene *scene, Curve *cu) -{ -#if 0 // XXX old animation system - IpoCurve *icu; - BezTriple *bezt; - - if(cu->ipo) return; - - cu->ipo= add_ipo(scene, "CurveIpo", ID_CU); - - icu= MEM_callocN(sizeof(IpoCurve), "ipocurve"); - - icu->blocktype= ID_CU; - icu->adrcode= CU_SPEED; - icu->flag= IPO_VISIBLE|IPO_SELECT|IPO_AUTO_HORIZ; - set_icu_vars(icu); - - BLI_addtail( &(cu->ipo->curve), icu); - - icu->bezt= bezt= MEM_callocN(2*sizeof(BezTriple), "defaultipo"); - icu->totvert= 2; - - bezt->hide= IPO_BEZ; - bezt->f1=bezt->f2= bezt->f3= SELECT; - bezt->h1= bezt->h2= HD_AUTO; - bezt++; - bezt->vec[1][0]= 100.0; - bezt->vec[1][1]= 1.0; - bezt->hide= IPO_BEZ; - bezt->f1=bezt->f2= bezt->f3= SELECT; - bezt->h1= bezt->h2= HD_AUTO; - - calchandles_ipocurve(icu); -#endif // XXX old animation system -} +/***************** clear tilt operator ********************/ - -void clear_tilt(Scene *scene) +static int clear_tilt_exec(bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BezTriple *bezt; BPoint *bp; int a; - if(okee("Clear tilt")==0) return; - for(nu= editnurb->first; nu; nu= nu->next) { if( nu->bezt ) { bezt= nu->bezt; @@ -4521,37 +5079,27 @@ void clear_tilt(Scene *scene) } } - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - BIF_undo_push("Clear tilt"); - + // XXX notifier WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_TRANSFORM, obedit); + DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + + return OPERATOR_FINISHED; } -int bezt_compare (const void *e1, const void *e2) +void CURVE_OT_clear_tilt(wmOperatorType *ot) { - BezTriple *b1 = *((BezTriple**)e1); - BezTriple *b2 = *((BezTriple**)e2); - - /* Check numerical values */ - float val = b1->vec[1][0] - b2->vec[1][0]; - - if (val<0) - return -1; - - if (val>0) - return 1; - - /* Check selected flags : Ensures that selected keys will be listed first */ - - if ((b1->f2 & SELECT) && !(b2->f2 & SELECT)) - return -1; - if (!(b1->f2 & SELECT) && (b2->f2 & SELECT)) - return 1; - - return 0; + /* identifiers */ + ot->name= "Clear Tilt"; + ot->idname= "CURVE_OT_clear_tilt"; + + /* api callbacks */ + ot->exec= clear_tilt_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } - -/* **************** undo for curves ************** */ +/****************** undo for curves ****************/ static void undoCurve_to_editCurve(void *lbu, void *lbe) { @@ -4604,6 +5152,41 @@ void undo_push_curve(bContext *C, char *name) undo_editmode_push(C, name, get_data, free_undoCurve, undoCurve_to_editCurve, editCurve_to_undoCurve, NULL); } +/***************** XXX old cruft ********************/ +void default_curve_ipo(Scene *scene, Curve *cu) +{ +#if 0 // XXX old animation system + IpoCurve *icu; + BezTriple *bezt; + + if(cu->ipo) return; + + cu->ipo= add_ipo(scene, "CurveIpo", ID_CU); + + icu= MEM_callocN(sizeof(IpoCurve), "ipocurve"); + + icu->blocktype= ID_CU; + icu->adrcode= CU_SPEED; + icu->flag= IPO_VISIBLE|IPO_SELECT|IPO_AUTO_HORIZ; + set_icu_vars(icu); + + BLI_addtail( &(cu->ipo->curve), icu); + + icu->bezt= bezt= MEM_callocN(2*sizeof(BezTriple), "defaultipo"); + icu->totvert= 2; + + bezt->hide= IPO_BEZ; + bezt->f1=bezt->f2= bezt->f3= SELECT; + bezt->h1= bezt->h2= HD_AUTO; + bezt++; + bezt->vec[1][0]= 100.0; + bezt->vec[1][1]= 1.0; + bezt->hide= IPO_BEZ; + bezt->f1=bezt->f2= bezt->f3= SELECT; + bezt->h1= bezt->h2= HD_AUTO; + + calchandles_ipocurve(icu); +#endif // XXX old animation system +} -/***/ diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index bd878946bb9..d98d5731236 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -2661,7 +2661,7 @@ void MESH_OT_hide(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* props */ - RNA_def_boolean(ot->srna, "invert", 0, "Invert", ""); + RNA_def_boolean(ot->srna, "invert", 0, "Invert", "Hide unselected rather than selected."); } void EM_reveal_mesh(EditMesh *em) @@ -3167,7 +3167,7 @@ void EM_select_swap(EditMesh *em) /* exported for UV */ } -static int selectswap_mesh_exec(bContext *C, wmOperator *op) +static int select_invert_mesh_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; @@ -3181,11 +3181,11 @@ static int selectswap_mesh_exec(bContext *C, wmOperator *op) void MESH_OT_select_invert(wmOperatorType *ot) { /* identifiers */ - ot->name= "Select Swap"; + ot->name= "Select Invert"; ot->idname= "MESH_OT_select_invert"; /* api callbacks */ - ot->exec= selectswap_mesh_exec; + ot->exec= select_invert_mesh_exec; ot->poll= ED_operator_editmesh; /* flags */ @@ -3388,7 +3388,7 @@ static void selectrandom_mesh(EditMesh *em, float perc) /* randomly selects a us EditVert *eve; EditEdge *eed; EditFace *efa; - float randfac= perc/100.0f; + float randfac= perc; /* Get the percentage of vertices to randomly select as 'randfac' */ // XXX if(button(&randfac,0, 100,"Percentage:")==0) return; @@ -3451,7 +3451,7 @@ void MESH_OT_select_random(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/; /* props */ - RNA_def_float(ot->srna, "percent", 50.0f, 0.0f, 100.0f, "Percent", "percentage of mesh data to randomly select", 0.01f, 100.0f); + RNA_def_float(ot->srna, "percent", 0.5f, 0.0f, 1.0f, "Percent", "Percentage of vertices to select randomly.", 0.0001f, 1.0f); } void editmesh_select_by_material(EditMesh *em, int index) diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 7830d4d0ae8..03b2c6fe983 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -1170,7 +1170,7 @@ static int delete_mesh_exec(bContext *C, wmOperator *op) void MESH_OT_delete(wmOperatorType *ot) { /* identifiers */ - ot->name= "Delete Mesh"; + ot->name= "Delete"; ot->idname= "MESH_OT_delete"; /* api callbacks */ @@ -6672,7 +6672,7 @@ void MESH_OT_subdivide_smooth(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* props */ - RNA_def_float(ot->srna, "smoothness", 5.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); + RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); } static int subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event) @@ -6735,7 +6735,7 @@ void MESH_OT_subdivs(wmOperatorType *ot) /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/ RNA_def_int(ot->srna, "number_cuts", 4, 1, 10, "Number of Cuts", "", 1, INT_MAX); RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f); - RNA_def_float(ot->srna, "smoothness", 5.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); + RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 6cd06faab68..2225be4eda8 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -238,6 +238,9 @@ int ED_operator_editcurve(bContext *C) if(obedit && obedit->type==OB_CURVE) return NULL != ((Mesh *)obedit->data)->edit_mesh; return 0; + + // XXX this test was in many tools, still needed? + // if(v3d==0 || (v3d->lay & obedit->lay)==0 ) return 0; } diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index ebe8341ffc5..0a87940d917 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1338,8 +1338,6 @@ TransDataCurveHandleFlags *initTransDataCurveHandes(TransData *td, struct BezTri static void createTransCurveVerts(bContext *C, TransInfo *t) { - // TRANSFORM_FIX_ME -#if 0 Object *obedit= CTX_data_edit_object(C); Curve *cu= obedit->data; TransData *td = NULL; @@ -1542,7 +1540,6 @@ static void createTransCurveVerts(bContext *C, TransInfo *t) calc_distanceCurveVerts(head, tail-1); } } -#endif } /* ********************* lattice *************** */ diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 0a0b6e6f07a..b1387d7d504 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -351,41 +351,12 @@ void recalcData(TransInfo *t) } } } - else if (t->obedit) { - if ELEM(t->obedit->type, OB_CURVE, OB_SURF) { - Curve *cu= t->obedit->data; - Nurb *nu= cu->editnurb->first; - - DAG_object_flush_update(G.scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ - - if (t->state == TRANS_CANCEL) { - while(nu) { - calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */ - nu= nu->next; - } - } else { - /* Normal updating */ - while(nu) { - test2DNurb(nu); - calchandlesNurb(nu); - nu= nu->next; - } - retopo_do_all(); - } - } - else if(t->obedit->type==OB_LATTICE) { - DAG_object_flush_update(G.scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ - - if(editLatt->flag & LT_OUTSIDE) outside_lattice(editLatt); - } - else { - DAG_object_flush_update(G.scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ - } +#endif + if (t->obedit) { } else if(G.f & G_PARTICLEEDIT) { flushTransParticles(t); } -#endif if (t->spacetype==SPACE_NODE) { flushTransNodes(t); } @@ -446,7 +417,35 @@ void recalcData(TransInfo *t) } } else if (t->obedit) { - if (t->obedit->type == OB_MESH) { + if ELEM(t->obedit->type, OB_CURVE, OB_SURF) { + Curve *cu= t->obedit->data; + Nurb *nu= cu->editnurb->first; + + DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ + + if (t->state == TRANS_CANCEL) { + while(nu) { + calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */ + nu= nu->next; + } + } else { + /* Normal updating */ + while(nu) { + test2DNurb(nu); + calchandlesNurb(nu); + nu= nu->next; + } + /* TRANSFORM_FIX_ME */ + // retopo_do_all(); + } + } + else if(t->obedit->type==OB_LATTICE) { + Lattice *la= t->obedit->data; + DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ + + if(la->editlatt->flag & LT_OUTSIDE) outside_lattice(la->editlatt); + } + else if (t->obedit->type == OB_MESH) { if(t->spacetype==SPACE_IMAGE) { SpaceImage *sima= t->sa->spacedata.first; @@ -454,7 +453,7 @@ void recalcData(TransInfo *t) if(sima->flag & SI_LIVE_UNWRAP) ED_uvedit_live_unwrap_re_solve(); - DAG_object_flush_update(t->scene, t->obedit, OB_RECALC_DATA); + DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); } else { EditMesh *em = ((Mesh*)t->obedit->data)->edit_mesh; /* mirror modifier clipping? */ @@ -466,10 +465,10 @@ void recalcData(TransInfo *t) // } clipMirrorModifier(t, t->obedit); } - if((t->options & CTX_NO_MIRROR) == 0 && (t->scene->toolsettings->editbutflag & B_MESH_X_MIRROR)) + if((t->options & CTX_NO_MIRROR) == 0 && (scene->toolsettings->editbutflag & B_MESH_X_MIRROR)) editmesh_apply_to_mirror(t); - DAG_object_flush_update(t->scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ + DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ recalc_editnormals(em); } @@ -552,6 +551,8 @@ void recalcData(TransInfo *t) transform_armature_mirror_update(t->obedit); } + else + DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ } else if( (t->flag & T_POSE) && t->poseobj) { Object *ob= t->poseobj; From 9ad8f1cf6a1911516ebf48e268995bc0357ecf2c Mon Sep 17 00:00:00 2001 From: Michael Fox Date: Wed, 11 Feb 2009 23:50:06 +0000 Subject: [PATCH 51/63] 2.5 ****** ported selection_invert for both edit armature and pose mode --- .../editors/armature/armature_intern.h | 2 + .../blender/editors/armature/armature_ops.c | 4 + .../blender/editors/armature/editarmature.c | 74 ++++++++++++++++++- 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index a6fa50cfc6a..d3938961d85 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -42,6 +42,7 @@ void ARMATURE_OT_subdivide_multi(struct wmOperatorType *ot); void ARMATURE_OT_parent_set(struct wmOperatorType *ot); void ARMATURE_OT_parent_clear(struct wmOperatorType *ot); void ARMATURE_OT_de_select_all(struct wmOperatorType *ot); +void ARMATURE_OT_selection_invert(struct wmOperatorType *ot); void POSE_OT_hide(struct wmOperatorType *ot); void POSE_OT_reveil(struct wmOperatorType *ot); @@ -49,6 +50,7 @@ void POSE_OT_rot_clear(struct wmOperatorType *ot); void POSE_OT_loc_clear(struct wmOperatorType *ot); void POSE_OT_scale_clear(struct wmOperatorType *ot); void POSE_OT_de_select_all(struct wmOperatorType *ot); +void POSE_OT_selection_invert(struct wmOperatorType *ot); void POSE_OT_select_parent(struct wmOperatorType *ot); #endif /* ED_ARMATURE_INTERN_H */ diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index 5f482e13183..3fececc8cac 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -119,6 +119,7 @@ void ED_operatortypes_armature(void) WM_operatortype_append(ARMATURE_OT_parent_clear); WM_operatortype_append(ARMATURE_OT_de_select_all); + WM_operatortype_append(ARMATURE_OT_selection_invert); /* POSE */ WM_operatortype_append(POSE_OT_hide); @@ -129,6 +130,7 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_scale_clear); WM_operatortype_append(POSE_OT_de_select_all); + WM_operatortype_append(POSE_OT_selection_invert); WM_operatortype_append(POSE_OT_select_parent); @@ -157,6 +159,7 @@ void ED_keymap_armature(wmWindowManager *wm) WM_keymap_add_item(keymap, "ARMATURE_OT_clear_parent", PKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_de_select_all", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_selection_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_test", TKEY, KM_PRESS, 0, 0); // XXX temp test for context iterators... to be removed @@ -174,6 +177,7 @@ void ED_keymap_armature(wmWindowManager *wm) WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_de_select_all", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "POSE_OT_selection_invert", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "POSE_OT_select_parent", PKEY, KM_PRESS, KM_SHIFT, 0); } diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index fdefd01a122..cb92c423783 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3509,8 +3509,45 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", prop_editarm_clear_parent_types, 0, "ClearType", "What way to clear parenting"); } -/* ****** (de)select All *******/ +/* **************** Selections ******************/ + +static int armature_selection_invert_exec(bContext *C, wmOperator *op) +{ + Object *obedit = CTX_data_edit_object(C); + bArmature *arm= obedit->data; + EditBone *ebone; + + /* Set the flags */ + for (ebone=arm->edbo->first;ebone;ebone=ebone->next) { + /* select bone */ + if(arm->layer & ebone->layer && (ebone->flag & BONE_HIDDEN_A)==0) { + ebone->flag ^= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); + ebone->flag &= ~BONE_ACTIVE; + } + } + + /* undo? */ + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL); + + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_selection_invert(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "Invert Selection"; + ot->idname= "ARMATURE_OT_selection_invert"; + + /* api callbacks */ + ot->exec= armature_selection_invert_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + +} static int armature_de_select_all_exec(bContext *C, wmOperator *op) { Object *obedit = CTX_data_edit_object(C); @@ -4380,7 +4417,42 @@ void POSE_OT_rot_clear(wmOperatorType *ot) } +/* ***************** selections ********************** */ +static int pose_selection_invert_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + bArmature *arm= ob->data; + bPoseChannel *pchan; + + /* Set the flags */ + for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + if ((pchan->bone->layer & arm->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) { + pchan->bone->flag ^= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL); + pchan->bone->flag &= ~BONE_ACTIVE; + } + } + + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL); + + return OPERATOR_FINISHED; +} + +void POSE_OT_selection_invert(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "Invert Selection"; + ot->idname= "POSE_OT_selection_invert"; + + /* api callbacks */ + ot->exec= pose_selection_invert_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + +} static int pose_de_select_all_exec(bContext *C, wmOperator *op) { Object *ob= CTX_data_active_object(C); From 9733eebd60237a841f1876557c55b78e353ae961 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 12 Feb 2009 01:11:29 +0000 Subject: [PATCH 52/63] KeyingSets: More work on preparing the UI KeyingSets can now be added/removed. Next up, the code for the operators to add items to Keying Sets. --- source/blender/editors/animation/keyframing.c | 19 +++- .../blender/editors/include/ED_keyframing.h | 2 +- .../blender/editors/space_outliner/outliner.c | 4 +- .../editors/space_outliner/outliner_header.c | 95 ++++++++++++++++++- .../editors/space_outliner/space_outliner.c | 13 +++ .../blender/editors/space_time/space_time.c | 10 +- .../blender/editors/space_time/time_header.c | 2 +- source/blender/makesdna/DNA_space_types.h | 1 + source/blender/windowmanager/WM_types.h | 1 + 9 files changed, 132 insertions(+), 15 deletions(-) diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 42ed4fddc99..08ee83277a8 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -877,23 +877,32 @@ enum { /* Build menu-string of available keying-sets (allocates memory for string) * NOTE: mode must not be longer than 64 chars */ -char *ANIM_build_keyingsets_menu (ListBase *list) +char *ANIM_build_keyingsets_menu (ListBase *list, short for_edit) { DynStr *pupds= BLI_dynstr_new(); KeyingSet *ks; char buf[64]; char *str; + int i; /* add title first */ BLI_dynstr_append(pupds, "Keying Sets%t|"); - /* add dummy entry for none-active */ - BLI_dynstr_append(pupds, "%x0|"); + /* add dummy entries for none-active */ + if (for_edit) { + BLI_dynstr_append(pupds, "Add New%x-1|"); + BLI_dynstr_append(pupds, " %x0|"); + } + else + BLI_dynstr_append(pupds, "%x0|"); /* loop through keyingsets, adding them */ - for (ks= list->first; ks; ks= ks->next) { + for (ks=list->first, i=1; ks; ks=ks->next, i++) { + if (for_edit == 0) + BLI_dynstr_append(pupds, "KS: "); + BLI_dynstr_append(pupds, ks->name); - BLI_snprintf( buf, 64, "%s", ((ks->next)?"|":"") ); + BLI_snprintf( buf, 64, "%%x%d%s", i, ((ks->next)?"|":"") ); BLI_dynstr_append(pupds, buf); } diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index e7441188fc3..d310066c999 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -84,7 +84,7 @@ short deletekey(struct ID *id, const char group[], const char rna_path[], int ar /* Generate menu of KeyingSets */ -char *ANIM_build_keyingsets_menu(struct ListBase *list); +char *ANIM_build_keyingsets_menu(struct ListBase *list, short for_edit); /* Main Keyframe Management operators: * These handle keyframes management from various spaces. They will handle the menus diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 7d06c98577d..dafe0cb4e03 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -3105,8 +3105,10 @@ static KeyingSet *verify_active_keyingset(Scene *scene, short add) /* add if none found */ // XXX the default settings have yet to evolve - if ((add) && (ks==NULL)) + if ((add) && (ks==NULL)) { ks= BKE_keyingset_add(&scene->keyingsets, "KeyingSet", KEYINGSET_ABSOLUTE, 0); + scene->active_keyingset= BLI_countlist(&scene->keyingsets); + } return ks; } diff --git a/source/blender/editors/space_outliner/outliner_header.c b/source/blender/editors/space_outliner/outliner_header.c index 7add3f85ea0..f5b93254693 100644 --- a/source/blender/editors/space_outliner/outliner_header.c +++ b/source/blender/editors/space_outliner/outliner_header.c @@ -30,6 +30,7 @@ #include #include "DNA_ID.h" +#include "DNA_anim_types.h" #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -39,6 +40,7 @@ #include "BLI_blenlib.h" +#include "BKE_animsys.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_main.h" @@ -159,15 +161,51 @@ static uiBlock *outliner_viewmenu(bContext *C, ARegion *ar, void *arg_unused) return block; } -#define B_REDR 1 +enum { + B_REDR = 1, + + B_KEYINGSET_CHANGE, + B_KEYINGSET_REMOVE, +} eOutlinerHeader_Events; + static void do_outliner_buttons(bContext *C, void *arg, int event) { ScrArea *sa= CTX_wm_area(C); + Scene *scene= CTX_data_scene(C); switch(event) { case B_REDR: ED_area_tag_redraw(sa); break; + + case B_KEYINGSET_CHANGE: + /* add a new KeyingSet if active is -1 */ + if (scene->active_keyingset == -1) { + // XXX the default settings have yet to evolve... need to keep this in sync with the + BKE_keyingset_add(&scene->keyingsets, "KeyingSet", KEYINGSET_ABSOLUTE, 0); + scene->active_keyingset= BLI_countlist(&scene->keyingsets); + } + + /* redraw regions with KeyingSet info */ + WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, scene); + break; + + case B_KEYINGSET_REMOVE: + /* remove the active KeyingSet */ + if (scene->active_keyingset) { + KeyingSet *ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); + + /* firstly free KeyingSet's data, then free the KeyingSet itself */ + if (ks) { + BKE_keyingset_free(ks); + BLI_freelinkN(&scene->keyingsets, ks); + scene->active_keyingset= 0; + } + } + + /* redraw regions with KeyingSet info */ + WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, scene); + break; } } @@ -175,6 +213,7 @@ static void do_outliner_buttons(bContext *C, void *arg, int event) void outliner_header_buttons(const bContext *C, ARegion *ar) { ScrArea *sa= CTX_wm_area(C); + Scene *scene= CTX_data_scene(C); SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); uiBlock *block; int xco, yco= 3, xmax; @@ -201,13 +240,63 @@ void outliner_header_buttons(const bContext *C, ARegion *ar) } //if (outliner->type==SO_OUTLINER) { + /* data selector*/ if(G.main->library.first) uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Libraries %x7|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); else - uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); + uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); + xco += 120; + + /* KeyingSet editing buttons */ + if ((soutliner->flag & SO_HIDE_KEYINGSETINFO)==0 && (soutliner->outlinevis==SO_DATABLOCKS)) { + KeyingSet *ks= NULL; + char *menustr= NULL; + + xco+= (int)(XIC*1.5); + + if (scene->active_keyingset) + ks= (KeyingSet *)BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); + + uiBlockBeginAlign(block); + /* currently 'active' KeyingSet */ + menustr= ANIM_build_keyingsets_menu(&scene->keyingsets, 1); + uiDefButI(block, MENU, B_KEYINGSET_CHANGE, menustr, xco,yco, 18,20, &scene->active_keyingset, 0, 0, 0, 0, "Browse Keying Sets"); + MEM_freeN(menustr); + xco += 18; + + /* currently 'active' KeyingSet - change name */ + if (ks) { + /* active KeyingSet */ + uiDefBut(block, TEX, B_KEYINGSET_CHANGE,"", xco,yco,120,20, ks->name, 0, 63, 0, 0, "Name of Active Keying Set"); + xco += 120; + uiDefIconBut(block, BUT, B_KEYINGSET_REMOVE, VICON_X, xco, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Remove this Keying Set"); + xco += 20; + } + else { + /* no active KeyingSet... so placeholder instead */ + uiDefBut(block, LABEL, 0,"", xco,yco,140,20, NULL, 0, 63, 0, 0, "Name of Active Keying Set"); + xco += 140; + } + uiBlockEndAlign(block); + + /* current 'active' KeyingSet */ + if (ks) { + xco += 5; + + /* operator buttons to add/remove selected items from set */ + uiBlockBeginAlign(block); + // XXX the icons here are temporary + uiDefIconButO(block, BUT, "OUTLINER_OT_keyingset_remove_selected", WM_OP_INVOKE_REGION_WIN, ICON_ZOOMOUT, xco,yco,XIC,YIC, "Remove selected properties from active Keying Set (Alt-K)"); + xco += XIC; + uiDefIconButO(block, BUT, "OUTLINER_OT_keyingset_add_selected", WM_OP_INVOKE_REGION_WIN, ICON_ZOOMIN, xco,yco,XIC,YIC, "Add selected properties to active Keying Set (K)"); + xco += XIC; + uiBlockEndAlign(block); + } + + xco += XIC*2; + } //} - /* always as last */ UI_view2d_totRect_set(&ar->v2d, xco+XIC+100, (int)(ar->v2d.tot.ymax-ar->v2d.tot.ymin)); diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 69f57d507b9..b8187309c0d 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -119,6 +119,7 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn) case ND_OB_ACTIVE: case ND_OB_SELECT: case ND_MODE: + case ND_KEYINGSET: ED_region_tag_redraw(ar); break; } @@ -170,6 +171,17 @@ static void outliner_header_area_free(ARegion *ar) { } +static void outliner_header_area_listener(ARegion *ar, wmNotifier *wmn) +{ + /* context changes */ + switch(wmn->category) { + case NC_SCENE: + if(wmn->data == ND_KEYINGSET) + ED_region_tag_redraw(ar); + break; + } +} + /* ******************** default callbacks for outliner space ***************** */ static SpaceLink *outliner_new(const bContext *C) @@ -289,6 +301,7 @@ void ED_spacetype_outliner(void) art->init= outliner_header_area_init; art->draw= outliner_header_area_draw; art->free= outliner_header_area_free; + art->listener= outliner_header_area_listener; BLI_addhead(&st->regiontypes, art); BKE_spacetype_register(st); diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c index d28fdc7f371..3df57208bbd 100644 --- a/source/blender/editors/space_time/space_time.c +++ b/source/blender/editors/space_time/space_time.c @@ -207,11 +207,13 @@ static void time_header_area_listener(ARegion *ar, wmNotifier *wmn) { /* context changes */ switch(wmn->category) { - case NC_SCENE: - if(wmn->data==ND_FRAME) - ED_region_tag_redraw(ar); - break; + switch (wmn->data) { + case ND_FRAME: + case ND_KEYINGSET: + ED_region_tag_redraw(ar); + break; + } } } diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c index 1f03530b680..38c0f2dfc1d 100644 --- a/source/blender/editors/space_time/time_header.c +++ b/source/blender/editors/space_time/time_header.c @@ -542,7 +542,7 @@ void time_header_buttons(const bContext *C, ARegion *ar) xco+= 16; - menustr= ANIM_build_keyingsets_menu(&scene->keyingsets); + menustr= ANIM_build_keyingsets_menu(&scene->keyingsets, 0); uiDefButI(block, MENU, B_DIFF, menustr, xco, yco, (int)5.5*XIC, YIC, &(scene->active_keyingset), 0, 1, 0, 0, diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index a1d8c5cd13b..678179f6f60 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -619,6 +619,7 @@ enum { #define SO_TESTBLOCKS 1 #define SO_NEWSELECTED 2 #define SO_HIDE_RESTRICTCOLS 4 +#define SO_HIDE_KEYINGSETINFO 8 /* SpaceOops->visiflag */ #define OOPS_SCE 1 diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index a8fb42c4ed0..2e7b31b0700 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -176,6 +176,7 @@ typedef struct wmNotifier { #define ND_MODE (9<<16) #define ND_RENDER_RESULT (10<<16) #define ND_COMPO_RESULT (11<<16) +#define ND_KEYINGSET (12<<16) /* NC_OBJECT Object */ #define ND_TRANSFORM (16<<16) From 12811a096c8ec23477bdc29a02d5d9492d13e94d Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 12 Feb 2009 01:47:45 +0000 Subject: [PATCH 53/63] Graph Editor: Experimental variations of curve display * Uneditable F-Curves are drawn with dotted lines (and no handles) * Muted F-Curves are drawn with a greyish colour. I'm not sure how visible this will be under some other colour schemes. Perhaps this needs as separate theme colour? --- .../blender/editors/space_graph/graph_draw.c | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 8df483b9048..077706f0c2b 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -707,11 +707,29 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) /* draw curve - we currently calculate colour on the fly, but that should probably be done in advance instead */ if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) { - col= ipo_rainbow(i, items); - cpack(col); + /* set color/drawing style for curve itself */ + if (fcu->flag & FCURVE_PROTECTED) { + /* protected curves (non editable) are drawn with dotted lines */ + setlinestyle(2); + } + if (fcu->flag & FCURVE_MUTED) { + /* muted curves are drawn in a greyish hue */ + // XXX should we have some variations? + UI_ThemeColorShade(TH_HEADER, 50); + } + else { + // XXX color calculation here really needs to be done in advance instead + col= ipo_rainbow(i, items); + cpack(col); + } + /* draw F-Curve */ draw_fcurve_repeat(fcu, &ar->v2d, 0, 0, &fac); // XXX this call still needs a lot more work + /* restore settings */ + setlinestyle(0); + + /* draw handles and vertices as appropriate */ if (fcu->bezt) { /* only draw handles/vertices on keyframes */ From b96180ec1763b29bdda4acd6cf79275058bcbde3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 12 Feb 2009 03:39:56 +0000 Subject: [PATCH 54/63] * Added description string to operator types, should be set along with ot->idname when defining ops. * User interface uses this as a tooltip when NULL or "" is given. * Python doc generation includes this description * Python defined ops take the description as an argument. * NULL check to image_ops.c, was crashing on exit when there was an image open. --- source/blender/editors/interface/interface.c | 4 ++++ source/blender/editors/space_image/image_ops.c | 3 +++ source/blender/editors/space_sequencer/sequencer_add.c | 5 +++++ source/blender/makesdna/DNA_windowmanager_types.h | 3 ++- source/blender/python/epy_doc_gen.py | 1 + source/blender/python/intern/bpy_opwrapper.c | 10 +++++++--- source/blender/windowmanager/intern/wm_operators.c | 2 +- 7 files changed, 23 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index c2c15a4cd5c..c4bd05f8076 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -2308,6 +2308,10 @@ uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext if(ot) str= ot->name; else str= opname; } + + if ((!tip || tip[0]=='\0') && ot->description) { + tip= ot->description; + } but= ui_def_but(block, type, -1, str, x1, y1, x2, y2, NULL, 0, 0, 0, 0, tip); but->opname= opname; diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index e24e7254553..51bca9d4fcc 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1221,6 +1221,9 @@ static void sample_draw(const bContext *C, ARegion *ar, void *arg_info) ImBuf *ibuf= ED_space_image_buffer(sima); ImageSampleInfo *info= arg_info; + if(ibuf == NULL) + return; + draw_image_info(ar, ibuf->channels, info->x, info->y, info->colp, info->colfp, info->zp, info->zfp); } diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index 5ab149ff6ca..c91972ec4f3 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -213,6 +213,7 @@ void SEQUENCER_OT_add_scene_strip(struct wmOperatorType *ot) /* identifiers */ ot->name= "Add Scene Strip"; ot->idname= "SEQUENCER_OT_add_scene_strip"; + ot->description= "Add a strip to the sequencer using a blender scene as a source"; /* api callbacks */ ot->invoke= sequencer_add_scene_strip_invoke; @@ -300,6 +301,7 @@ void SEQUENCER_OT_add_movie_strip(struct wmOperatorType *ot) /* identifiers */ ot->name= "Add Movie Strip"; ot->idname= "SEQUENCER_OT_add_movie_strip"; + ot->description= "Add a movie strip to the sequencer"; /* api callbacks */ ot->invoke= sequencer_add_movie_strip_invoke; @@ -400,6 +402,7 @@ void SEQUENCER_OT_add_sound_strip(struct wmOperatorType *ot) /* identifiers */ ot->name= "Add Sound Strip"; ot->idname= "SEQUENCER_OT_add_sound_strip"; + ot->description= "Add a sound strip to the sequencer"; /* api callbacks */ ot->invoke= sequencer_add_sound_strip_invoke; @@ -492,6 +495,7 @@ void SEQUENCER_OT_add_image_strip(struct wmOperatorType *ot) /* identifiers */ ot->name= "Add Image Strip"; ot->idname= "SEQUENCER_OT_add_image_strip"; + ot->description= "Add an image or image sequence to the sequencer"; /* api callbacks */ ot->invoke= sequencer_add_image_strip_invoke; @@ -623,6 +627,7 @@ void SEQUENCER_OT_add_effect_strip(struct wmOperatorType *ot) /* identifiers */ ot->name= "Add Effect Strip"; ot->idname= "SEQUENCER_OT_add_effect_strip"; + ot->description= "Add an effect to the sequencer, most are applied ontop of existing strips"; /* api callbacks */ ot->invoke= sequencer_add_effect_strip_invoke; diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 822f081f9a8..e0f55ac5356 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -123,7 +123,8 @@ typedef struct wmOperatorType { struct wmOperatorType *next, *prev; char *name; /* text for ui, undo */ - char *idname; /* unique identifier */ + char *idname; /* unique identifier */ + char *description; /* tooltips and python docs */ /* this callback executes the operator without any interactive input, * parameters may be provided through operator properties. cannot use diff --git a/source/blender/python/epy_doc_gen.py b/source/blender/python/epy_doc_gen.py index afe5468070b..afe9acff36d 100644 --- a/source/blender/python/epy_doc_gen.py +++ b/source/blender/python/epy_doc_gen.py @@ -265,6 +265,7 @@ def op2epy(target_path): out.write('def %s(%s):\n' % (op, ', '.join(kw_args))) out.write('\t"""\n') + out.write('\t%s\n' % rna_struct.description) for desc in kw_arg_attrs: out.write('\t%s\n' % desc) out.write('\t@rtype: None\n') diff --git a/source/blender/python/intern/bpy_opwrapper.c b/source/blender/python/intern/bpy_opwrapper.c index 8a644f51b24..ca6104d087f 100644 --- a/source/blender/python/intern/bpy_opwrapper.c +++ b/source/blender/python/intern/bpy_opwrapper.c @@ -44,6 +44,7 @@ typedef struct PyOperatorType { void *next, *prev; char idname[OP_MAX_TYPENAME]; char name[OP_MAX_TYPENAME]; + char description[OP_MAX_TYPENAME]; // XXX should be longer? PyObject *py_invoke; PyObject *py_exec; } PyOperatorType; @@ -276,6 +277,7 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata) /* identifiers */ ot->name= pyot->name; ot->idname= pyot->idname; + ot->description= pyot->description; /* api callbacks */ if (pyot->py_invoke != Py_None) @@ -342,10 +344,11 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *args) char *idname= NULL; char *name= NULL; + char *description= NULL; PyObject *invoke= NULL; PyObject *exec= NULL; - if (!PyArg_ParseTuple(args, "ssOO", &idname, &name, &invoke, &exec)) { + if (!PyArg_ParseTuple(args, "sssOO", &idname, &name, &description, &invoke, &exec)) { PyErr_SetString( PyExc_AttributeError, "expected 2 strings and 2 function objects"); return NULL; } @@ -362,8 +365,9 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *args) pyot= MEM_callocN(sizeof(PyOperatorType), "PyOperatorType"); - strcpy(pyot->idname, idname); - strcpy(pyot->name, name); + strncpy(pyot->idname, idname, sizeof(pyot->idname)); + strncpy(pyot->name, name, sizeof(pyot->name)); + strncpy(pyot->description, description, sizeof(pyot->description)); pyot->py_invoke= invoke; pyot->py_exec= exec; Py_INCREF(invoke); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 5ebca6842b1..eb0d9d312e9 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -101,7 +101,7 @@ void WM_operatortype_append(void (*opfunc)(wmOperatorType*)) ot= MEM_callocN(sizeof(wmOperatorType), "operatortype"); ot->srna= RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties"); opfunc(ot); - RNA_def_struct_ui_text(ot->srna, ot->name, "DOC_BROKEN"); /* TODO - add a discription to wmOperatorType? */ + RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:""); // XXX All ops should have a description but for now allow them not to. RNA_def_struct_identifier(ot->srna, ot->idname); BLI_addtail(&global_ops, ot); } From a5f26d4c14a3dea60b26ff9a579c4c4ec8205d2e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 12 Feb 2009 03:48:56 +0000 Subject: [PATCH 55/63] reveil -> reveal --- source/blender/editors/armature/armature_intern.h | 2 +- source/blender/editors/armature/armature_ops.c | 4 ++-- source/blender/editors/armature/editarmature.c | 8 ++++---- source/blender/editors/space_node/node_draw.c | 2 +- source/blender/editors/space_outliner/outliner.c | 2 +- source/blender/makesdna/DNA_ID.h | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index d3938961d85..9aacec7e44b 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -45,7 +45,7 @@ void ARMATURE_OT_de_select_all(struct wmOperatorType *ot); void ARMATURE_OT_selection_invert(struct wmOperatorType *ot); void POSE_OT_hide(struct wmOperatorType *ot); -void POSE_OT_reveil(struct wmOperatorType *ot); +void POSE_OT_reveal(struct wmOperatorType *ot); void POSE_OT_rot_clear(struct wmOperatorType *ot); void POSE_OT_loc_clear(struct wmOperatorType *ot); void POSE_OT_scale_clear(struct wmOperatorType *ot); diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index 3fececc8cac..a8502aefcff 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -123,7 +123,7 @@ void ED_operatortypes_armature(void) /* POSE */ WM_operatortype_append(POSE_OT_hide); - WM_operatortype_append(POSE_OT_reveil); + WM_operatortype_append(POSE_OT_reveal); WM_operatortype_append(POSE_OT_rot_clear); WM_operatortype_append(POSE_OT_loc_clear); @@ -170,7 +170,7 @@ void ED_keymap_armature(wmWindowManager *wm) WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, 0, 0); kmi= WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "invert", 1); - WM_keymap_add_item(keymap, "POSE_OT_reveil", HKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "POSE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); /*clear pose*/ WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0); diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index cb92c423783..15f8bcf9e29 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -4614,7 +4614,7 @@ static int show_pose_bone(Object *ob, Bone *bone, void *ptr) } /* active object is armature in posemode, poll checked */ -static int pose_reveil_exec(bContext *C, wmOperator *op) +static int pose_reveal_exec(bContext *C, wmOperator *op) { Object *ob= CTX_data_active_object(C); bArmature *arm= ob->data; @@ -4627,14 +4627,14 @@ static int pose_reveil_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void POSE_OT_reveil(wmOperatorType *ot) +void POSE_OT_reveal(wmOperatorType *ot) { /* identifiers */ ot->name= "Reveil Selection"; - ot->idname= "POSE_OT_reveil"; + ot->idname= "POSE_OT_reveal"; /* api callbacks */ - ot->exec= pose_reveil_exec; + ot->exec= pose_reveal_exec; ot->poll= ED_operator_posemode; /* flags */ diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index e9d865a371a..b4df3764308 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -702,7 +702,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN UI_icon_draw_aspect_blended(iconofs, rct->ymax-NODE_DY+2, ICON_BUTS, snode->aspect, -60); glDisable(GL_BLEND); } - { /* always hide/reveil unused sockets */ + { /* always hide/reveal unused sockets */ int shade; iconofs-= 18.0f; diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index dafe0cb4e03..2d3ccedd201 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -2478,7 +2478,7 @@ void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again, // else return; /* XXX RETURN! XXX */ } - /* do selection and reveil */ + /* do selection and reveal */ if (te) { tselem= TREESTORE(te); if (tselem) { diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 2846d138fbf..71c57b3df71 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -116,7 +116,7 @@ typedef struct Library { ID id; ID *idblock; struct FileData *filedata; - char name[240]; /* reveiled in the UI, can store relative path */ + char name[240]; /* revealed in the UI, can store relative path */ char filename[240]; /* expanded name, not relative, used while reading */ int tot, pad; /* tot, idblock and filedata are only fo read and write */ struct Library *parent; /* for outliner, showing dependency */ From a150242f8e801537a71421187a81dbde609db35f Mon Sep 17 00:00:00 2001 From: Diego Borghetti Date: Thu, 12 Feb 2009 05:02:42 +0000 Subject: [PATCH 56/63] Commit to continue tomorrow from work. --- source/blender/blenfont/intern/blf.c | 208 ++++++++++++++++++ source/blender/blenfont/intern/blf_font.c | 117 ++++++++-- .../blenfont/intern/blf_internal_types.h | 4 + 3 files changed, 309 insertions(+), 20 deletions(-) create mode 100644 source/blender/blenfont/intern/blf.c diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c new file mode 100644 index 00000000000..b503ea06404 --- /dev/null +++ b/source/blender/blenfont/intern/blf.c @@ -0,0 +1,208 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#if 0 + +#include +#include +#include + +#include + +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "MEM_guardedalloc.h" + +#include "DNA_listBase.h" + +#include "BKE_utildefines.h" + +#include "BLI_blenlib.h" +#include "BLI_linklist.h" /* linknode */ +#include "BLI_string.h" + +#include "blf_internal_types.h" +#include "blf_internal.h" + + +/* Max number of font in memory. + * Take care that now every font have a glyph cache per size/dpi, + * so we don't need load the same font with different size, just + * load one and call BLF_size. + */ +#define BLF_MAX_FONT 16 + +/* Font array. */ +FontBLF *global_font[BLF_MAX_FONT]; + +/* Number of font. */ +int global_font_num= 0; + +/* Current font. */ +int global_font_cur= 0; + +int BLF_init(void) +{ + int i; + + for (i= 0; i < BLF_MAX_FONT; i++) + global_font[i]= NULL; + + return(blf_font_init()); +} + +int blf_search(char *name) +{ + FontBLF *font; + int i; + + for (i= 0; i < global_font_num; i++) { + font= global_font[i]; + if (font && (!strcmp(font->name, name))) + return(i); + } + return(-1); +} + +int BLF_load(char *name) +{ + FontBLF *font; + char *filename; + int i; + + if (!name) + return(-1); + + /* check if we already load this font. */ + i= blf_search(name); + if (i >= 0) + return(i); + + if (global_font_num+1 >= BLF_MAX_FONT) + return(-1); + + filename= blf_dir_search(name); + if (!filename) + return(-1); + + font= blf_font_new(name, filename); + MEM_freeN(filename); + + if (!font) + return(-1); + + global_font[global_font_num]= font; + i= global_font_num; + global_font_num++; + return(i); +} + +int BLF_load_mem(char *name, unsigned char *mem, int mem_size) +{ + FontBLF *font; + int i; + + if (!name || !mem || !mem_size) + return(-1); + + i= blf_search(name); + if (i >= 0) + return(i); + + if (global_font_num+1 >= BLF_MAX_FONT) + return(-1); + + font= blf_font_new_from_mem(name, mem, size); + if (!font) + return(-1); + + global_font[global_font_num]= font; + i= global_font_num; + global_font_num++; + return(i); +} + +void BLF_set(int fontid) +{ + if (fontid >= 0 && fontid < global_font_num) + global_font_cur= fontid; +} + +void BLF_aspect(float aspect) +{ + FontBLF *font; + + font= global_font[global_font_cur]; + if (font) + font->aspect= aspect; +} + +void BLF_position(float x, float y, float z) +{ + FontBLF *font; + + font= global_font[global_font_cur]; + if (font) { + font->pos[0]= x; + font->pos[1]= y; + font->pos[2]= z; + } +} + +void BLF_size(int size, int dpi) +{ + FontBLF *font; + + font= global_font[global_font_cur]; + if (font) + blf_font_size(font, size, dpi); +} + +void BLF_draw(char *str) +{ + FontBLF *font; + + font= global_font[global_font_cur]; + if (font) { + glEnable(GL_BLEND); + glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glPushMatrix(); + glTranslatef(font->pos[0], font->pos[1], font->pos[2]); + + blf_font_draw(font, str); + + glPopMatrix(); + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + } +} + +#endif diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 42043a58781..28b33640692 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -64,27 +64,8 @@ void blf_font_exit(void) FT_Done_Freetype(global_ft_lib); } -FontBLF *blf_font_new(char *name) +void blf_font_fill(FontBLF *font) { - FontBLF *font; - FT_Error err; - - font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new"); - err= FT_New_Face(global_ft_lib, name, 0, &font->face); - if (err) { - MEM_freeN(font); - return(NULL); - } - - err= FT_Select_Charmap(font->face, ft_encoding_unicode); - if (err) { - printf("Warning: FT_Select_Charmap fail!!\n"); - FT_Done_Face(font->face); - MEM_freeN(font); - return(NULL); - } - - font->name= MEM_strdup(name); font->ref= 1; font->aspect= 1.0f; font->pos[0]= 0.0f; @@ -104,6 +85,59 @@ FontBLF *blf_font_new(char *name) font->cache.last= NULL; font->glyph_cache= NULL; glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint *)&font->max_tex_size); +} + +FontBLF *blf_font_new(char *name, char *filename) +{ + FontBLF *font; + FT_Error err; + + font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new"); + err= FT_New_Face(global_ft_lib, filename, 0, &font->face); + if (err) { + printf("BLF: Can't load font: %s\n", filename); + MEM_freeN(font); + return(NULL); + } + + err= FT_Select_Charmap(font->face, ft_encoding_unicode); + if (err) { + printf("Warning: FT_Select_Charmap fail!!\n"); + FT_Done_Face(font->face); + MEM_freeN(font); + return(NULL); + } + + font->name= MEM_strdup(name); + font->filename= MEM_strdup(filename); + blf_font_fill(font); + return(font); +} + +FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size) +{ + FontBLF *font; + FT_Error err; + + font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new_from_mem"); + err= FT_New_Memory_Face(global_ft_lib, mem, size, 0, &font->face); + if (err) { + printf("BLF: Can't load font: %s, from memory!!\n", name); + MEM_freeN(font); + return(NULL); + } + + err= FT_Select_Charmap(font->face, ft_encoding_unicode); + if (err) { + printf("BLF: FT_Select_Charmap fail!!\n"); + FT_Done_Face(font->face); + MEM_freeN(font); + return(NULL); + } + + font->name= MEM_strdup(name); + font->filename= NULL; + blf_font_fill(font); return(font); } @@ -132,4 +166,47 @@ void blf_font_size(FontBLF *font, int size, int dpi) } } +void blf_font_draw(FontBLF *font, char *str) +{ + unsigned int c; + GlyphBLF *g, *g_prev; + FT_Vector delta; + FT_UInt glyph_index; + int pen_x, pen_y; + int i, has_kerning; + + i= 0; + pen_x= 0; + pen_y= 0; + has_kerning= FT_HAS_KERNING(font->face); + g_prev= NULL; + + while (str[i]) { + c= blf_uf8_next((unsigned char *)str, &i); + if (c == 0) + break; + + glyph_index= FT_Get_Char_Index(face, c); + g= blf_glyph_search(font->glyph_cache, glyph_index); + if (!g) + g= blf_glyph_add(font, glyph_index, c); + + /* if we don't found a glyph, skip it. */ + if (!g) + continue; + + if (use_kering && g_prev) { + delta.x= 0; + delta.y= 0; + + FT_Get_Kerning(font->face, g_prev->index, glyph_index, FT_KERNING_MODE_UNFITTED, &delta); + pen_x += delta.x >> 6; + } + + blf_glyph_render(g, (float)pen_x, (float)pen_y); + pen_x += g->advance; + g_prev= g; + } +} + #endif /* zero!! */ diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h index 396230410b2..5aacb2343bb 100644 --- a/source/blender/blenfont/intern/blf_internal_types.h +++ b/source/blender/blenfont/intern/blf_internal_types.h @@ -127,8 +127,12 @@ typedef struct _GlyphBLF { } GlyphBLF; typedef struct FontBLF { + /* font name. */ char *name; + /* filename or NULL. */ + char *filename; + /* reference count. */ int ref; From 48594a3a70b3427c35c3d0e0f1e12e52321215d3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 12 Feb 2009 06:36:06 +0000 Subject: [PATCH 57/63] own error in last commit. --- source/blender/makesdna/DNA_windowmanager_types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index e0f55ac5356..5ca268692e5 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -117,8 +117,8 @@ typedef struct wmWindow { ListBase gesture; /* gesture stuff */ } wmWindow; -# -# + + typedef struct wmOperatorType { struct wmOperatorType *next, *prev; From 517d9b882a75f177e68c83252e5b560b735b1842 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Thu, 12 Feb 2009 09:18:35 +0000 Subject: [PATCH 58/63] 2.5 Bugfix: node editor crashed when using bitmap fonts, still had a call commented out, happened during migration to get things linked. --- source/blender/editors/space_node/node_draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index b4df3764308..39a2144e867 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -1108,7 +1108,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d) /* aspect+font, set each time */ snode->aspect= (v2d->cur.xmax - v2d->cur.xmin)/((float)ar->winx); - //snode->curfont= uiSetCurFont_ext(snode->aspect); + snode->curfont= uiSetCurFont_ext(snode->aspect); UI_view2d_constant_grid_draw(C, v2d); /* backdrop */ From 4075c601336967f1714d8eee12e24b3b1f503978 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 12 Feb 2009 10:41:57 +0000 Subject: [PATCH 59/63] KeyingSets: First working prototype To use KeyingSets, simply Outliner-select items in the Datablocks view and press K to add to the active KeyingSet. Then keyframes can be inserted by choosing the 'Active Keying Set' option when inserting keyframes. Important notes on the current implementation: * Only properties directly inside some ID-block that is close to the root (i.e. main -> objects -> "someobj" -> location, or main -> materials -> "somemat" -> colour) can be accessed for now, as I haven't got the code for building the inner-parts of the paths working yet. Help on getting this working is welcome (hint to Brecht). * Properties that can be safely included include simple properties "object -> Dupli Verts", entire arrays "object -> Location" or individual array elements "object -> Location -> y" --- Also added typo fix for KeyingSet freeing. It was freeing the KeyingSet instead of it's paths. --- source/blender/blenkernel/intern/anim_sys.c | 2 +- source/blender/editors/animation/keyframing.c | 186 +++++++++-------- .../blender/editors/space_graph/graph_draw.c | 2 +- .../blender/editors/space_outliner/outliner.c | 191 +++++++++++++++++- 4 files changed, 298 insertions(+), 83 deletions(-) diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 55597b635c9..098d0ad7a32 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -248,7 +248,7 @@ void BKE_keyingset_free (KeyingSet *ks) MEM_freeN(ksp->rna_path); /* free path itself */ - BLI_freelinkN(&ks->paths, ks); + BLI_freelinkN(&ks->paths, ksp); } } diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 08ee83277a8..157609ed640 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -111,7 +111,7 @@ FCurve *verify_fcurve (ID *id, const char group[], const char rna_path[], const /* use default settings to make a F-Curve */ fcu= MEM_callocN(sizeof(FCurve), "FCurve"); - fcu->flag |= (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES); + fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED); if (act->curves.first==NULL) fcu->flag |= FCURVE_ACTIVE; /* first one added active */ @@ -119,6 +119,9 @@ FCurve *verify_fcurve (ID *id, const char group[], const char rna_path[], const fcu->rna_path= BLI_strdupn(rna_path, strlen(rna_path)); fcu->array_index= array_index; + /* set additional flags */ + // TODO: need to set the FCURVE_INT_VALUES flag must be set if property is not float! + /* if a group name has been provided, try to add or find a group, then add F-Curve to it */ if (group) { @@ -2019,13 +2022,14 @@ static int commonkey_modifykey (ListBase *dsources, KeyingSet *ks, short mode, f else if (mode == COMMONKEY_MODE_DELETE) kflag= 0; - /* check if the KeyingSet is absolute or not (i.e. does it requires sources info) */ if (ks->flag & KEYINGSET_ABSOLUTE) { /* Absolute KeyingSets are simpler to use, as all the destination info has already been * provided by the user, and is stored, ready to use, in the KeyingSet paths. */ for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + int arraylen, i; + /* get pointer to name of group to add channels to */ if (ksp->flag & KSP_FLAG_GROUP_NONE) groupname= NULL; @@ -2034,11 +2038,34 @@ static int commonkey_modifykey (ListBase *dsources, KeyingSet *ks, short mode, f else groupname= ksp->group; - /* action to take depends on mode */ - if (mode == COMMONKEY_MODE_INSERT) - success+= insertkey(ksp->id, groupname, ksp->rna_path, ksp->array_index, cfra, kflag); - else if (mode == COMMONKEY_MODE_DELETE) - success+= deletekey(ksp->id, groupname, ksp->rna_path, ksp->array_index, cfra, kflag); + /* init arraylen and i - arraylen should be greater than i so that + * normal non-array entries get keyframed correctly + */ + i= ksp->array_index; + arraylen= i+1; + + /* get length of array if whole array option is enabled */ + if (ksp->flag & KSP_FLAG_WHOLE_ARRAY) { + PointerRNA id_ptr, ptr; + PropertyRNA *prop; + + RNA_id_pointer_create(ksp->id, &id_ptr); + if (RNA_path_resolve(&id_ptr, ksp->rna_path, &ptr, &prop)) + arraylen= RNA_property_array_length(&ptr, prop); + } + + /* for each possible index, perform operation + * - assume that arraylen is greater than index + */ + for (; i < arraylen; i++) { + /* action to take depends on mode */ + if (mode == COMMONKEY_MODE_INSERT) + success+= insertkey(ksp->id, groupname, ksp->rna_path, i, cfra, kflag); + else if (mode == COMMONKEY_MODE_DELETE) + success+= deletekey(ksp->id, groupname, ksp->rna_path, i, cfra, kflag); + } + + // TODO: set recalc tags on the ID? } } #if 0 // XXX still need to figure out how to get such keyingsets working @@ -2148,96 +2175,97 @@ static int insert_key_exec (bContext *C, wmOperator *op) else return OPERATOR_FINISHED; } - - // XXX more comprehensive tests will be needed - CTX_DATA_BEGIN(C, Base*, base, selected_bases) - { - Object *ob= base->object; - ID *id= (ID *)ob; - short success= 0; - - /* check which keyframing mode chosen for this object */ - if (mode < 4) { - /* object-based keyframes */ - switch (mode) { - case 4: /* color of active material (only for geometry...) */ - // NOTE: this is just a demo... but ideally we'd go through materials instead of active one only so reference stays same - // XXX no group for now - success+= insertkey(id, NULL, "active_material.diffuse_color", 0, cfra, 0); - success+= insertkey(id, NULL, "active_material.diffuse_color", 1, cfra, 0); - success+= insertkey(id, NULL, "active_material.diffuse_color", 2, cfra, 0); - break; - case 3: /* object scale */ - success+= insertkey(id, "Object Transforms", "scale", 0, cfra, 0); - success+= insertkey(id, "Object Transforms", "scale", 1, cfra, 0); - success+= insertkey(id, "Object Transforms", "scale", 2, cfra, 0); - break; - case 2: /* object rotation */ - success+= insertkey(id, "Object Transforms", "rotation", 0, cfra, 0); - success+= insertkey(id, "Object Transforms", "rotation", 1, cfra, 0); - success+= insertkey(id, "Object Transforms", "rotation", 2, cfra, 0); - break; - case 1: /* object location */ - success+= insertkey(id, "Object Transforms", "location", 0, cfra, 0); - success+= insertkey(id, "Object Transforms", "location", 1, cfra, 0); - success+= insertkey(id, "Object Transforms", "location", 2, cfra, 0); - break; + else { + // more comprehensive tests will be needed + CTX_DATA_BEGIN(C, Base*, base, selected_bases) + { + Object *ob= base->object; + ID *id= (ID *)ob; + short success= 0; + + /* check which keyframing mode chosen for this object */ + if (mode < 4) { + /* object-based keyframes */ + switch (mode) { + case 4: /* color of active material (only for geometry...) */ + // NOTE: this is just a demo... but ideally we'd go through materials instead of active one only so reference stays same + // XXX no group for now + success+= insertkey(id, NULL, "active_material.diffuse_color", 0, cfra, 0); + success+= insertkey(id, NULL, "active_material.diffuse_color", 1, cfra, 0); + success+= insertkey(id, NULL, "active_material.diffuse_color", 2, cfra, 0); + break; + case 3: /* object scale */ + success+= insertkey(id, "Object Transforms", "scale", 0, cfra, 0); + success+= insertkey(id, "Object Transforms", "scale", 1, cfra, 0); + success+= insertkey(id, "Object Transforms", "scale", 2, cfra, 0); + break; + case 2: /* object rotation */ + success+= insertkey(id, "Object Transforms", "rotation", 0, cfra, 0); + success+= insertkey(id, "Object Transforms", "rotation", 1, cfra, 0); + success+= insertkey(id, "Object Transforms", "rotation", 2, cfra, 0); + break; + case 1: /* object location */ + success+= insertkey(id, "Object Transforms", "location", 0, cfra, 0); + success+= insertkey(id, "Object Transforms", "location", 1, cfra, 0); + success+= insertkey(id, "Object Transforms", "location", 2, cfra, 0); + break; + } + + ob->recalc |= OB_RECALC_OB; } - - ob->recalc |= OB_RECALC_OB; - } - else if ((ob->pose) && (ob->flag & OB_POSEMODE)) { - /* PoseChannel based keyframes */ - bPoseChannel *pchan; - - for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - /* only if selected */ - if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) { - char buf[512]; - - switch (mode) { - case 6: /* pchan scale */ - sprintf(buf, "pose.pose_channels[\"%s\"].scale", pchan->name); - success+= insertkey(id, pchan->name, buf, 0, cfra, 0); - success+= insertkey(id, pchan->name, buf, 1, cfra, 0); - success+= insertkey(id, pchan->name, buf, 2, cfra, 0); - break; - case 5: /* pchan rotation */ - if (pchan->rotmode == PCHAN_ROT_QUAT) { - sprintf(buf, "pose.pose_channels[\"%s\"].rotation", pchan->name); + else if ((ob->pose) && (ob->flag & OB_POSEMODE)) { + /* PoseChannel based keyframes */ + bPoseChannel *pchan; + + for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + /* only if selected */ + if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) { + char buf[512]; + + switch (mode) { + case 6: /* pchan scale */ + sprintf(buf, "pose.pose_channels[\"%s\"].scale", pchan->name); success+= insertkey(id, pchan->name, buf, 0, cfra, 0); success+= insertkey(id, pchan->name, buf, 1, cfra, 0); success+= insertkey(id, pchan->name, buf, 2, cfra, 0); - success+= insertkey(id, pchan->name, buf, 3, cfra, 0); - } - else { - sprintf(buf, "pose.pose_channels[\"%s\"].euler_rotation", pchan->name); + break; + case 5: /* pchan rotation */ + if (pchan->rotmode == PCHAN_ROT_QUAT) { + sprintf(buf, "pose.pose_channels[\"%s\"].rotation", pchan->name); + success+= insertkey(id, pchan->name, buf, 0, cfra, 0); + success+= insertkey(id, pchan->name, buf, 1, cfra, 0); + success+= insertkey(id, pchan->name, buf, 2, cfra, 0); + success+= insertkey(id, pchan->name, buf, 3, cfra, 0); + } + else { + sprintf(buf, "pose.pose_channels[\"%s\"].euler_rotation", pchan->name); + success+= insertkey(id, pchan->name, buf, 0, cfra, 0); + success+= insertkey(id, pchan->name, buf, 1, cfra, 0); + success+= insertkey(id, pchan->name, buf, 2, cfra, 0); + } + break; + default: /* pchan location */ + sprintf(buf, "pose.pose_channels[\"%s\"].location", pchan->name); success+= insertkey(id, pchan->name, buf, 0, cfra, 0); success+= insertkey(id, pchan->name, buf, 1, cfra, 0); success+= insertkey(id, pchan->name, buf, 2, cfra, 0); + break; } - break; - default: /* pchan location */ - sprintf(buf, "pose.pose_channels[\"%s\"].location", pchan->name); - success+= insertkey(id, pchan->name, buf, 0, cfra, 0); - success+= insertkey(id, pchan->name, buf, 1, cfra, 0); - success+= insertkey(id, pchan->name, buf, 2, cfra, 0); - break; } } + + ob->recalc |= OB_RECALC_OB; } - ob->recalc |= OB_RECALC_OB; + printf("Ob '%s' - Successfully added %d Keyframes \n", id->name+2, success); } - - printf("Ob '%s' - Successfully added %d Keyframes \n", id->name+2, success); + CTX_DATA_END; } - CTX_DATA_END; /* send updates */ ED_anim_dag_flush_update(C); - if (mode == 3) // material color requires different notifiers + if (mode == 4) // material color requires different notifiers WM_event_add_notifier(C, NC_MATERIAL|ND_KEYS, NULL); else WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, NULL); diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 077706f0c2b..86316d93214 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -708,7 +708,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) /* draw curve - we currently calculate colour on the fly, but that should probably be done in advance instead */ if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) { /* set color/drawing style for curve itself */ - if (fcu->flag & FCURVE_PROTECTED) { + if ( ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) || (fcu->flag & FCURVE_PROTECTED) ) { /* protected curves (non editable) are drawn with dotted lines */ setlinestyle(2); } diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 2d3ccedd201..e91d478d327 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -76,6 +76,7 @@ #include "BKE_material.h" #include "BKE_modifier.h" #include "BKE_object.h" +#include "BKE_report.h" #include "BKE_screen.h" #include "BKE_scene.h" #include "BKE_sequence.h" @@ -3092,13 +3093,38 @@ void outliner_operation_menu(Scene *scene, ARegion *ar, SpaceOops *soops) /* These operators are only available in databrowser mode for now, as * they depend on having RNA paths and/or hierarchies available. */ +enum { + KEYINGSET_EDITMODE_ADD = 0, + KEYINGSET_EDITMODE_REMOVE, +} eKeyingSet_EditModes; +/* typedef'd function-prototype style for KeyingSet operation callbacks */ +typedef void (*ksEditOp)(SpaceOops *soops, KeyingSet *ks, TreeElement *te, TreeStoreElem *tselem); + +/* Utilities ---------------------------------- */ + +/* specialised poll callback for these operators to work in Datablocks view only */ +static int ed_operator_outliner_datablocks_active(bContext *C) +{ + ScrArea *sa= CTX_wm_area(C); + if ((sa) && (sa->spacetype==SPACE_OOPS)) { + SpaceOops *so= (SpaceOops *)CTX_wm_space_data(C); + return ((so->type == SO_OUTLINER) && (so->outlinevis == SO_DATABLOCKS)); + } + return 0; +} + + /* find the 'active' KeyingSet, and add if not found (if adding is allowed) */ // TODO: should this be an API func? static KeyingSet *verify_active_keyingset(Scene *scene, short add) { KeyingSet *ks= NULL; + /* sanity check */ + if (scene == NULL) + return NULL; + /* try to find one from scene */ if (scene->active_keyingset > 0) ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); @@ -3113,22 +3139,183 @@ static KeyingSet *verify_active_keyingset(Scene *scene, short add) return ks; } -/* ---------------------------------- */ +/* helper func to add a new KeyingSet Path */ +static void ks_editop_add_cb(SpaceOops *soops, KeyingSet *ks, TreeElement *te, TreeStoreElem *tselem) +{ + ListBase hierarchy = {NULL, NULL}; + LinkData *ld; + TreeElement *tem; + TreeStoreElem *tse; + PointerRNA *ptr; + PropertyRNA *prop; + ID *id = NULL; + char *path=NULL, *newpath=NULL; + int array_index= 0; + int flag= KSP_FLAG_GROUP_KSNAME; + + /* optimise tricks: + * - Don't do anything if the selected item is a 'struct', but arrays are allowed + */ + if (tselem->type == TSE_RNA_STRUCT) + return; + + //printf("ks_editop_add_cb() \n"); + + /* Overview of Algorithm: + * 1. Go up the chain of parents until we find the 'root', taking note of the + * levels encountered in reverse-order (i.e. items are added to the start of the list + * for more convenient looping later) + * 2. Walk down the chain, adding from the first ID encountered + * (which will become the 'ID' for the KeyingSet Path), and build a + * path as we step through the chain + */ + // XXX do we want to separate this part out to a helper func for the other editing op at some point? + + /* step 1: flatten out hierarchy of parents into a flat chain */ + for (tem= te->parent; tem; tem= tem->parent) { + ld= MEM_callocN(sizeof(LinkData), "LinkData for ks_editop_add_cb()"); + ld->data= tem; + BLI_addhead(&hierarchy, ld); + } + + /* step 2: step down hierarchy building the path (NOTE: addhead in previous loop was needed so that we can loop like this) */ + for (ld= hierarchy.first; ld; ld= ld->next) { + /* get data */ + tem= (TreeElement *)ld->data; + tse= TREESTORE(tem); + ptr= &tem->rnaptr; + prop= tem->directdata; + + /* check if we're looking for first ID, or appending to path */ + if (id) { + /* just 'append' property to path + * - to prevent memory leaks, we must write to newpath not path, then free old path + swap them + */ + // TODO: how to do this? + //newpath= RNA_path_append(path, NULL, prop, index, NULL); + + if (path) MEM_freeN(path); + path= newpath; + } + else { + /* no ID, so check if entry is RNA-struct, and if that RNA-struct is an ID datablock to extract info from */ + if (tse->type == TSE_RNA_STRUCT) { + /* ptr->data not ptr->id.data seems to be the one we want, since ptr->data is sometimes the owner of this ID? */ + if (RNA_struct_is_ID(ptr)) + id= (ID *)ptr->data; + } + } + } + + /* step 3: if we've got an ID, add the current item to the path */ + if (id) { + /* add the active property to the path */ + // if array base, add KSP_FLAG_WHOLE_ARRAY + ptr= &te->rnaptr; + prop= te->directdata; + + /* array checks */ + if (tselem->type == TSE_RNA_ARRAY_ELEM) { + /* item is part of an array, so must set the array_index */ + array_index= te->index; + } + else if (RNA_property_array_length(ptr, prop)) { + /* entire array was selected, so keyframe all */ + flag |= KSP_FLAG_WHOLE_ARRAY; + } + + /* path */ + newpath= RNA_path_append(path, NULL, prop, 0, NULL); + if (path) MEM_freeN(path); + path= newpath; + + printf("Adding KeyingSet '%s': Path %s %d \n", ks->name, path, array_index); + + /* add a new path with the information obtained (only if valid) */ + // TODO: what do we do with group name? for now, we don't supply one, and just let this use the KeyingSet name + if (path) + BKE_keyingset_add_destination(ks, id, NULL, path, array_index, flag); + } + + /* free temp data */ + if (path) MEM_freeN(path); + BLI_freelistN(&hierarchy); +} +/* Recursively iterate over tree, finding and working on selected items */ +static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBase *tree, ksEditOp edit_cb) +{ + TreeElement *te; + TreeStoreElem *tselem; + + for (te= tree->first; te; te=te->next) { + tselem= TREESTORE(te); + + /* if item is selected, perform operation */ + if (tselem->flag & TSE_SELECTED) { + if (edit_cb) edit_cb(soops, ks, te, tselem); + } + + /* go over sub-tree */ + if ((tselem->flag & TSE_CLOSED)==0) + do_outliner_keyingset_editop(soops, ks, &te->subtree, edit_cb); + } +} + +/* Add Operator ---------------------------------- */ + +static int outliner_keyingset_additems_exec(bContext *C, wmOperator *op) +{ + SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); + Scene *scene= CTX_data_scene(C); + KeyingSet *ks= verify_active_keyingset(scene, 1); + + /* check for invalid states */ + if (ks == NULL) { + BKE_report(op->reports, RPT_ERROR, "Operation requires an Active Keying Set"); + return OPERATOR_CANCELLED; + } + if (soutliner == NULL) + return OPERATOR_CANCELLED; + + /* recursively go into tree, adding selected items */ + // TODO: make the last arg a callback func instead... + do_outliner_keyingset_editop(soutliner, ks, &soutliner->tree, ks_editop_add_cb); + + /* send notifiers */ + WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, NULL); + + return OPERATOR_FINISHED; +} void OUTLINER_OT_keyingset_add_selected(wmOperatorType *ot) { + /* identifiers */ ot->idname= "OUTLINER_OT_keyingset_add_selected"; ot->name= "Keyingset Add Selected"; + + /* api callbacks */ + ot->exec= outliner_keyingset_additems_exec; + ot->poll= ed_operator_outliner_datablocks_active; + + /* flags */ + ot->flag = OPTYPE_UNDO; } -/* ---------------------------------- */ +/* Remove Operator ---------------------------------- */ void OUTLINER_OT_keyingset_remove_selected(wmOperatorType *ot) { + /* identifiers */ ot->idname= "OUTLINER_OT_keyingset_remove_selected"; ot->name= "Keyingset Remove Selected"; + + /* api callbacks */ + ot->poll= ed_operator_outliner_datablocks_active; + + /* flags */ + ot->flag = OPTYPE_UNDO; } /* ***************** DRAW *************** */ From cfa511ab9ed32c6c86dc94b0b1ec11f6951112ef Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 12 Feb 2009 11:04:08 +0000 Subject: [PATCH 60/63] Dummy commit... * Added comment for what needs to be done to get KeyingSets fully functional * In previous commit, also made group-locking be taken into account when drawing curves as locked --- source/blender/editors/space_outliner/outliner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index e91d478d327..3e2d5edd4ed 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -3191,7 +3191,7 @@ static void ks_editop_add_cb(SpaceOops *soops, KeyingSet *ks, TreeElement *te, T /* just 'append' property to path * - to prevent memory leaks, we must write to newpath not path, then free old path + swap them */ - // TODO: how to do this? + // TODO: how to do this? we must use 'string' identifiers for collections so that these don't break if data is added/removed //newpath= RNA_path_append(path, NULL, prop, index, NULL); if (path) MEM_freeN(path); From 763a98f4c0169f7a44b37124b88babcc0df02dc2 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 12 Feb 2009 22:12:21 +0000 Subject: [PATCH 61/63] 2.5: Most curve/surface editmode operators back: * Hide, Reveal * Separate, Duplicate, Delete * Set Weight, Set Radius, Set Spline Type, Set Handle Type, Set Smooth * Tilt, Clear Tilt * Smooth, Smooth Radius * De(select) First, De(select) Last, De(select) All, Select Inverse, Select Linked, Select Control Point Row, Select Next, Select Previous, Select More, Select Less, Select Random, Select Every Nth * Switch Direction, Subdivide, Make Segment, Spin, Extrude, Toggle Cyclic * Specials Menu Not working correct yet: * Add Vertex (ctrl click) * Add Menu --- source/blender/blenkernel/intern/curve.c | 2 + source/blender/editors/curve/curve_intern.h | 15 +- source/blender/editors/curve/curve_ops.c | 132 +++- source/blender/editors/curve/editcurve.c | 723 +++++++++++------- source/blender/editors/include/ED_curve.h | 1 - source/blender/editors/include/ED_screen.h | 2 + source/blender/editors/interface/interface.c | 2 +- source/blender/editors/object/object_edit.c | 10 +- source/blender/editors/screen/screen_ops.c | 22 +- .../editors/space_view3d/view3d_header.c | 425 +++------- .../editors/uvedit/uvedit_unwrap_ops.c | 11 +- 11 files changed, 691 insertions(+), 654 deletions(-) diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 2e0347870cc..7d7d98095c6 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -191,6 +191,8 @@ Curve *copy_curve(Curve *cu) cun->bev.first= cun->bev.last= 0; cun->path= 0; + cun->editnurb= NULL; + #if 0 // XXX old animation system /* single user ipo too */ if(cun->ipo) cun->ipo= copy_ipo(cun->ipo); diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h index ba01c1207e7..cced4720cec 100644 --- a/source/blender/editors/curve/curve_intern.h +++ b/source/blender/editors/curve/curve_intern.h @@ -44,20 +44,21 @@ void CURVE_OT_switch_direction(struct wmOperatorType *ot); void CURVE_OT_set_weight(struct wmOperatorType *ot); void CURVE_OT_set_radius(struct wmOperatorType *ot); void CURVE_OT_smooth(struct wmOperatorType *ot); -void CURVE_OT_smooth_curve_radius(struct wmOperatorType *ot); +void CURVE_OT_smooth_radius(struct wmOperatorType *ot); void CURVE_OT_de_select_first(struct wmOperatorType *ot); void CURVE_OT_de_select_last(struct wmOperatorType *ot); void CURVE_OT_de_select_all(struct wmOperatorType *ot); void CURVE_OT_hide(struct wmOperatorType *ot); void CURVE_OT_reveal(struct wmOperatorType *ot); -void CURVE_OT_select_invert(struct wmOperatorType *ot); +void CURVE_OT_select_inverse(struct wmOperatorType *ot); void CURVE_OT_subdivide(struct wmOperatorType *ot); void CURVE_OT_set_spline_type(struct wmOperatorType *ot); +void CURVE_OT_set_handle_type(struct wmOperatorType *ot); void CURVE_OT_make_segment(struct wmOperatorType *ot); void CURVE_OT_spin(struct wmOperatorType *ot); void CURVE_OT_add_vertex(struct wmOperatorType *ot); void CURVE_OT_extrude(struct wmOperatorType *ot); -void CURVE_OT_make_cyclic(struct wmOperatorType *ot); +void CURVE_OT_toggle_cyclic(struct wmOperatorType *ot); void CURVE_OT_select_linked(struct wmOperatorType *ot); void CURVE_OT_select_row(struct wmOperatorType *ot); void CURVE_OT_select_next(struct wmOperatorType *ot); @@ -66,10 +67,16 @@ void CURVE_OT_select_more(struct wmOperatorType *ot); void CURVE_OT_select_less(struct wmOperatorType *ot); void CURVE_OT_select_random(struct wmOperatorType *ot); void CURVE_OT_select_every_nth(struct wmOperatorType *ot); -void CURVE_OT_add_duplicate(struct wmOperatorType *ot); +void CURVE_OT_duplicate(struct wmOperatorType *ot); void CURVE_OT_delete(struct wmOperatorType *ot); void CURVE_OT_set_smooth(struct wmOperatorType *ot); void CURVE_OT_clear_tilt(struct wmOperatorType *ot); +void CURVE_OT_add_surface_primitive(struct wmOperatorType *ot); +void CURVE_OT_add_curve_primitive(struct wmOperatorType *ot); + +void CURVE_OT_specials_menu(struct wmOperatorType *ot); +void CURVE_OT_add_menu(struct wmOperatorType *ot); + #endif /* ED_UTIL_INTERN_H */ diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c index 4455144c859..30ddb226045 100644 --- a/source/blender/editors/curve/curve_ops.c +++ b/source/blender/editors/curve/curve_ops.c @@ -55,35 +55,95 @@ #include "ED_screen.h" #include "ED_object.h" +#include "BIF_transform.h" + +#include "UI_interface.h" + #include "curve_intern.h" -/* ************************** registration **********************************/ +/**************************** menus *****************************/ +static int specials_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + uiMenuItem *head; + + head= uiPupMenuBegin("Specials", 0); + uiMenuItemO(head, 0, "CURVE_OT_subdivide"); + uiMenuItemO(head, 0, "CURVE_OT_switch_direction"); + uiMenuItemO(head, 0, "CURVE_OT_set_weight"); + uiMenuItemO(head, 0, "CURVE_OT_set_radius"); + uiMenuItemO(head, 0, "CURVE_OT_smooth"); + uiMenuItemO(head, 0, "CURVE_OT_smooth_radius"); + uiPupMenuEnd(C, head); + + return OPERATOR_CANCELLED; +} + +void CURVE_OT_specials_menu(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Specials Menu"; + ot->idname= "CURVE_OT_specials_menu"; + + /* api clastbacks */ + ot->invoke= specials_menu_invoke; + ot->poll= ED_operator_editsurfcurve; +} + +static int add_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + Object *obedit= CTX_data_edit_object(C); + uiMenuItem *head; + + head= uiPupMenuBegin("Add", 0); + if(obedit->type == OB_CURVE) + uiMenuItemsEnumO(head, "CURVE_OT_add_curve_primitive", "type"); + else + uiMenuItemsEnumO(head, "CURVE_OT_add_surface_primitive", "type"); + uiPupMenuEnd(C, head); + + return OPERATOR_CANCELLED; +} + +void CURVE_OT_add_menu(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Menu"; + ot->idname= "CURVE_OT_add_menu"; + + /* api clastbacks */ + ot->invoke= add_menu_invoke; + ot->poll= ED_operator_editsurfcurve; +} + +/************************* registration ****************************/ void ED_operatortypes_curve(void) { WM_operatortype_append(FONT_OT_textedit); + WM_operatortype_append(CURVE_OT_hide); + WM_operatortype_append(CURVE_OT_reveal); + WM_operatortype_append(CURVE_OT_separate); - WM_operatortype_append(CURVE_OT_switch_direction); + WM_operatortype_append(CURVE_OT_duplicate); + WM_operatortype_append(CURVE_OT_delete); + WM_operatortype_append(CURVE_OT_set_weight); WM_operatortype_append(CURVE_OT_set_radius); + WM_operatortype_append(CURVE_OT_set_spline_type); + WM_operatortype_append(CURVE_OT_set_handle_type); + WM_operatortype_append(CURVE_OT_set_smooth); + WM_operatortype_append(CURVE_OT_clear_tilt); + WM_operatortype_append(CURVE_OT_smooth); - WM_operatortype_append(CURVE_OT_smooth_curve_radius); + WM_operatortype_append(CURVE_OT_smooth_radius); + WM_operatortype_append(CURVE_OT_de_select_first); WM_operatortype_append(CURVE_OT_de_select_last); WM_operatortype_append(CURVE_OT_de_select_all); - WM_operatortype_append(CURVE_OT_hide); - WM_operatortype_append(CURVE_OT_reveal); - WM_operatortype_append(CURVE_OT_select_invert); - WM_operatortype_append(CURVE_OT_subdivide); - WM_operatortype_append(CURVE_OT_set_spline_type); - WM_operatortype_append(CURVE_OT_make_segment); - WM_operatortype_append(CURVE_OT_spin); - WM_operatortype_append(CURVE_OT_add_vertex); - WM_operatortype_append(CURVE_OT_extrude); - WM_operatortype_append(CURVE_OT_make_cyclic); + WM_operatortype_append(CURVE_OT_select_inverse); WM_operatortype_append(CURVE_OT_select_linked); WM_operatortype_append(CURVE_OT_select_row); WM_operatortype_append(CURVE_OT_select_next); @@ -92,10 +152,20 @@ void ED_operatortypes_curve(void) WM_operatortype_append(CURVE_OT_select_less); WM_operatortype_append(CURVE_OT_select_random); WM_operatortype_append(CURVE_OT_select_every_nth); - WM_operatortype_append(CURVE_OT_add_duplicate); - WM_operatortype_append(CURVE_OT_delete); - WM_operatortype_append(CURVE_OT_set_smooth); - WM_operatortype_append(CURVE_OT_clear_tilt); + + WM_operatortype_append(CURVE_OT_switch_direction); + WM_operatortype_append(CURVE_OT_subdivide); + WM_operatortype_append(CURVE_OT_make_segment); + WM_operatortype_append(CURVE_OT_spin); + WM_operatortype_append(CURVE_OT_add_vertex); + WM_operatortype_append(CURVE_OT_extrude); + WM_operatortype_append(CURVE_OT_toggle_cyclic); + + WM_operatortype_append(CURVE_OT_add_menu); + WM_operatortype_append(CURVE_OT_specials_menu); + + WM_operatortype_append(CURVE_OT_add_surface_primitive); + WM_operatortype_append(CURVE_OT_add_curve_primitive); } void ED_keymap_curve(wmWindowManager *wm) @@ -109,5 +179,33 @@ void ED_keymap_curve(wmWindowManager *wm) keymap= WM_keymap_listbase(wm, "Curve", 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "CURVE_OT_add_vertex", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0); + + WM_keymap_add_item(keymap, "CURVE_OT_de_select_all", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_select_row", RKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "CURVE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "CURVE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1); + + WM_keymap_add_item(keymap, "CURVE_OT_separate", PKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_extrude", EKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "CURVE_OT_make_segment", FKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_toggle_cyclic", CKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_delete", XKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_delete", DELKEY, KM_PRESS, 0, 0); + + WM_keymap_add_item(keymap, "CURVE_OT_clear_tilt", TKEY, KM_PRESS, KM_ALT, 0); + RNA_enum_set(WM_keymap_add_item(keymap, "TFM_OT_transform", TKEY, KM_PRESS, 0, 0)->ptr, "mode", TFM_TILT); + RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_set_handle_type", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", 1); + RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_set_handle_type", HKEY, KM_PRESS, 0, 0)->ptr, "type", 3); + RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_set_handle_type", VKEY, KM_PRESS, 0, 0)->ptr, "type", 2); + + WM_keymap_add_item(keymap, "CURVE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_CTRL, 0); + RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "deselected", 1); + + WM_keymap_add_item(keymap, "CURVE_OT_specials_menu", WKEY, KM_PRESS, 0, 0); } diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 281d9f407dc..848bec89a39 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -71,6 +71,7 @@ #include "WM_types.h" #include "ED_anim_api.h" +#include "ED_curve.h" #include "ED_keyframes_edit.h" #include "ED_object.h" #include "ED_screen.h" @@ -80,6 +81,8 @@ #include "UI_interface.h" +#include "BIF_transform.h" + #include "RNA_access.h" #include "RNA_define.h" @@ -89,14 +92,6 @@ /* for curve objects in editmode that can have hidden handles */ #define BEZSELECTED_HIDDENHANDLES(bezt) ((G.f & G_HIDDENHANDLES) ? (bezt)->f2 & SELECT : BEZSELECTED(bezt)) -/* XXX */ -static void BIF_undo_push() {} -static int okee() {return 0;} -static int pupmenu() {return 0;} -static void adduplicate() {} -static void error_libdata() {} -/* XXX */ - float nurbcircle[8][2]= { {0.0, -1.0}, {-1.0, -1.0}, {-1.0, 0.0}, {-1.0, 1.0}, {0.0, 1.0}, { 1.0, 1.0}, { 1.0, 0.0}, { 1.0, -1.0} @@ -116,11 +111,10 @@ void set_actNurb(Object *obedit, Nurb *nu) { Curve *cu= obedit->data; - if (nu==NULL) { + if(nu==NULL) cu->actnu = -1; - } else { + else cu->actnu = BLI_findindex(cu->editnurb, nu); - } } Nurb *get_actNurb(Object *obedit) @@ -130,7 +124,6 @@ Nurb *get_actNurb(Object *obedit) return BLI_findlink(cu->editnurb, cu->actnu); } - /* ******************* SELECTION FUNCTIONS ********************* */ #define HIDDEN 1 @@ -357,14 +350,6 @@ void make_editNurb(Object *obedit) set_actNurb(obedit, NULL); } -void remake_editNurb(Object *obedit) -{ - - if(okee("Reload original data")==0) return; - - make_editNurb(obedit); -} - void free_editNurb(Object *obedit) { Curve *cu= obedit->data; @@ -376,90 +361,64 @@ void free_editNurb(Object *obedit) } } -/******************** XXX separate operator ***********************/ +/******************** separate operator ***********************/ static int separate_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - Object *obedit= CTX_data_edit_object(C); - ListBase *editnurb= curve_get_editcurve(obedit); - View3D *v3d= NULL; // XXX Nurb *nu, *nu1; - Object *oldob; - Base *base, *oldbase; - Curve *cu; - ListBase editnurbo; + Object *oldob, *newob; + Base *oldbase, *newbase; + Curve *oldcu, *newcu; + ListBase *oldedit, *newedit; - cu= obedit->data; - if(cu->key) { - BKE_report(op->reports, RPT_ERROR, "Can't separate a curve with vertex keys"); + oldbase= CTX_data_active_base(C); + oldob= oldbase->object; + oldcu= oldob->data; + oldedit= oldcu->editnurb; + + if(oldcu->key) { + BKE_report(op->reports, RPT_ERROR, "Can't separate a curve with vertex keys."); return OPERATOR_CANCELLED; } WM_cursor_wait(1); - /* we are going to trick everything as follows: - * 1. duplicate base: this is the new one, remember old pointer - * 2. set aside all NOT selected curves/nurbs - * 3. load_ebaseNurb(): this will be the new base - * 4. freelist and restore old nurbs - */ - - /* only edit-base selected */ - base= FIRSTBASE; - while(base) { - if(base->lay & v3d->lay) { - if(base->object==obedit) base->flag |= 1; - else base->flag &= ~1; - } - base= base->next; - } + /* 1. duplicate the object and data */ + newbase= ED_object_add_duplicate(scene, oldbase, 0); /* 0 = fully linked */ + ED_base_object_select(newbase, BA_DESELECT); + newob= newbase->object; - /* set aside: everything that is not selected */ - editnurbo.first= editnurbo.last= 0; - nu= editnurb->first; - while(nu) { + newcu= newob->data= copy_curve(oldcu); + newcu->editnurb= NULL; + oldcu->id.us--; /* because new curve is a copy: reduce user count */ + + /* 2. put new object in editmode and clear it */ + make_editNurb(newob); + newedit= newcu->editnurb; + freeNurblist(newedit); + + /* 3. move over parts from old object */ + for(nu= oldedit->first; nu; nu=nu1) { nu1= nu->next; - if(isNurbsel(nu)==0) { - BLI_remlink(editnurb, nu); - BLI_addtail(&editnurbo, nu); + + if(isNurbsel(nu)) { + BLI_remlink(oldedit, nu); + BLI_addtail(newedit, nu); } - nu= nu1; } - oldob= obedit; - oldbase= BASACT; + /* 4. put old object out of editmode */ + load_editNurb(newob); + free_editNurb(newob); - adduplicate(1, 0); /* no transform and zero so do get a linked dupli */ - - obedit= BASACT->object; /* basact is set in adduplicate() */ - - obedit->data= copy_curve(cu); - /* because new curve is a copy: reduce user count */ - cu->id.us--; - - load_editNurb(obedit); - - BASACT->flag &= ~SELECT; - - if(editnurb->first) freeNurblist(editnurb); - - *editnurb= editnurbo; - - obedit= 0; /* displists behave different in edit mode */ - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); /* this is the separated one */ DAG_object_flush_update(scene, oldob, OB_RECALC_DATA); /* this is the original one */ - - obedit= oldob; - BASACT= oldbase; - BASACT->flag |= SELECT; - - set_actNurb(obedit, NULL); + DAG_object_flush_update(scene, newob, OB_RECALC_DATA); /* this is the separated one */ + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, oldob); WM_cursor_wait(0); - // XXX notifier - return OPERATOR_FINISHED; } @@ -471,7 +430,7 @@ void CURVE_OT_separate(wmOperatorType *ot) /* api callbacks */ ot->exec= separate_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1050,7 +1009,7 @@ static int switch_direction_exec(bContext *C, wmOperator *op) switchdirectionNurb(nu); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); - // XXX notifier + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); return OPERATOR_FINISHED; } @@ -1063,7 +1022,7 @@ void CURVE_OT_switch_direction(wmOperatorType *ot) /* api callbacks */ ot->exec= switch_direction_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1096,8 +1055,8 @@ static int set_weight_exec(bContext *C, wmOperator *op) } } - // XXX notifier DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); return OPERATOR_FINISHED; } @@ -1110,7 +1069,7 @@ void CURVE_OT_set_weight(wmOperatorType *ot) /* api callbacks */ ot->exec= set_weight_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->poll= ED_operator_editsurfcurve; // XXX invoke popup? @@ -1148,6 +1107,7 @@ static int set_radius_exec(bContext *C, wmOperator *op) } } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); return OPERATOR_FINISHED; @@ -1161,7 +1121,7 @@ void CURVE_OT_set_radius(wmOperatorType *ot) /* api callbacks */ ot->exec= set_radius_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->poll= ED_operator_editsurfcurve; // XXX invoke popup? @@ -1223,8 +1183,8 @@ static int smooth_exec(bContext *C, wmOperator *op) } } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); - // XXX notifier return OPERATOR_FINISHED; } @@ -1237,7 +1197,7 @@ void CURVE_OT_smooth(wmOperatorType *ot) /* api callbacks */ ot->exec= smooth_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1246,7 +1206,7 @@ void CURVE_OT_smooth(wmOperatorType *ot) /**************** smooth curve radius operator *************/ /* TODO, make smoothing distance based */ -static int smooth_curve_radius_exec(bContext *C, wmOperator *op) +static int smooth_radius_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); @@ -1388,21 +1348,21 @@ static int smooth_curve_radius_exec(bContext *C, wmOperator *op) } } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); - // XXX notifier return OPERATOR_FINISHED; } -void CURVE_OT_smooth_curve_radius(wmOperatorType *ot) +void CURVE_OT_smooth_radius(wmOperatorType *ot) { /* identifiers */ ot->name= "Smooth Curve Radius"; - ot->idname= "CURVE_OT_smooth_curve_radius"; + ot->idname= "CURVE_OT_smooth_radius"; /* api clastbacks */ - ot->exec= smooth_curve_radius_exec; - ot->poll= ED_operator_editcurve; + ot->exec= smooth_radius_exec; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1643,7 +1603,7 @@ void CURVE_OT_de_select_all(wmOperatorType *ot) /* api callbacks */ ot->exec= de_select_all_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1658,7 +1618,7 @@ static int hide_exec(bContext *C, wmOperator *op) Nurb *nu; BPoint *bp; BezTriple *bezt; - int a, sel, invert= RNA_boolean_get(op->ptr, "invert"); + int a, sel, invert= RNA_boolean_get(op->ptr, "deselected"); for(nu= editnurb->first; nu; nu= nu->next) { if((nu->type & 7)==CU_BEZIER) { @@ -1666,7 +1626,11 @@ static int hide_exec(bContext *C, wmOperator *op) a= nu->pntsu; sel= 0; while(a--) { - if(BEZSELECTED_HIDDENHANDLES(bezt)) { + if(invert == 0 && BEZSELECTED_HIDDENHANDLES(bezt)) { + select_beztriple(bezt, DESELECT, 1, HIDDEN); + bezt->hide= 1; + } + else if(invert && !BEZSELECTED_HIDDENHANDLES(bezt)) { select_beztriple(bezt, DESELECT, 1, HIDDEN); bezt->hide= 1; } @@ -1709,13 +1673,13 @@ void CURVE_OT_hide(wmOperatorType *ot) /* api callbacks */ ot->exec= hide_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* props */ - RNA_def_boolean(ot->srna, "invert", 0, "Invert", "Hide unselected rather than selected."); + RNA_def_boolean(ot->srna, "deselected", 0, "Deselected", "Hide deselected rather than selected."); } /********************** reveal operator *********************/ @@ -1769,7 +1733,7 @@ void CURVE_OT_reveal(wmOperatorType *ot) /* api callbacks */ ot->exec= reveal_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1777,7 +1741,7 @@ void CURVE_OT_reveal(wmOperatorType *ot) /********************** select invert operator *********************/ -static int select_invert_exec(bContext *C, wmOperator *op) +static int select_inverse_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); @@ -1816,15 +1780,15 @@ static int select_invert_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void CURVE_OT_select_invert(wmOperatorType *ot) +void CURVE_OT_select_inverse(wmOperatorType *ot) { /* identifiers */ - ot->name= "Select Invert"; - ot->idname= "CURVE_OT_select_invert"; + ot->name= "Select Inverse"; + ot->idname= "CURVE_OT_select_inverse"; /* api callbacks */ - ot->exec= select_invert_exec; - ot->poll= ED_operator_editcurve; + ot->exec= select_inverse_exec; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2207,9 +2171,8 @@ static int subdivide_exec(bContext *C, wmOperator *op) } /* End of 'if((nu->type & 7)==CU_NURBS)' */ } - + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); - // XXX notifier WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; } @@ -2222,7 +2185,7 @@ void CURVE_OT_subdivide(wmOperatorType *ot) /* api callbacks */ ot->exec= subdivide_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2232,7 +2195,7 @@ void CURVE_OT_subdivide(wmOperatorType *ot) static void findnearestNurbvert__doClosest(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y) { - struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; short dist, hpoint, select, mval[2]; } *data = userData; + struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; int dist, hpoint, select, mval[2]; } *data = userData; short flag; short temp; @@ -2263,12 +2226,12 @@ static void findnearestNurbvert__doClosest(void *userData, Nurb *nu, BPoint *bp, } } -static short findnearestNurbvert(ViewContext *vc, short sel, short mval[2], Nurb **nurb, BezTriple **bezt, BPoint **bp) +static short findnearestNurbvert(ViewContext *vc, short sel, int mval[2], Nurb **nurb, BezTriple **bezt, BPoint **bp) { /* sel==1: selected gets a disadvantage */ /* in nurb and bezt or bp the nearest is written */ /* return 0 1 2: handlepunt */ - struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; short dist, hpoint, select, mval[2]; } data = {0}; + struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; int dist, hpoint, select, mval[2]; } data = {0}; data.dist = 100; data.hpoint = 0; @@ -2538,7 +2501,48 @@ void CURVE_OT_set_spline_type(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", type_items, CU_POLY, "Type", "Spline type"); } -/***************** XXX make segment operator **********************/ +/***************** set handle type operator *******************/ + +static int set_handle_type_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + ListBase *editnurb= curve_get_editcurve(obedit); + + sethandlesNurb(editnurb, RNA_enum_get(op->ptr, "type")); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + + return OPERATOR_FINISHED; +} + +void CURVE_OT_set_handle_type(wmOperatorType *ot) +{ + static EnumPropertyItem type_items[]= { + {1, "AUTOMATIC", "Automatic", ""}, + {2, "VECTOR", "Vector", ""}, + {3, "TOGGLE_FREE_ALIGN", "Toggle Free/Align", ""}, + {5, "ALIGN", "Align", ""}, + {6, "FREE_ALIGN", "Free Align", ""}, + {0, NULL, NULL, NULL}}; + + /* identifiers */ + ot->name= "Set Handle Type"; + ot->idname= "CURVE_OT_set_handle_type"; + + /* api callbacks */ + ot->exec= set_handle_type_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", type_items, CU_POLY, "Type", "Spline type"); +} + +/***************** make segment operator **********************/ /* ******************** SKINNING LOFTING!!! ******************** */ @@ -2862,10 +2866,8 @@ static int merge_nurb(bContext *C, wmOperator *op) set_actNurb(obedit, NULL); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); - // XXX notifier - - // XXX BIF_undo_push("Merge"); return OPERATOR_FINISHED; } @@ -3018,8 +3020,8 @@ static int make_segment_exec(bContext *C, wmOperator *op) set_actNurb(obedit, NULL); /* for selected */ + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - // XXX notifier return OPERATOR_FINISHED; } @@ -3037,13 +3039,13 @@ void CURVE_OT_make_segment(wmOperatorType *ot) /* api callbacks */ ot->exec= make_segment_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -/***************** XXX pick select operator **********************/ +/***************** pick select from 3d view **********************/ void mouse_nurb(bContext *C, short mval[2], int extend) { @@ -3054,11 +3056,14 @@ void mouse_nurb(bContext *C, short mval[2], int extend) Nurb *nu; BezTriple *bezt=0; BPoint *bp=0; + int location[2]; short hand; view3d_set_viewcontext(C, &vc); - hand= findnearestNurbvert(&vc, 1, mval, &nu, &bezt, &bp); + location[0]= mval[0]; + location[1]= mval[1]; + hand= findnearestNurbvert(&vc, 1, location, &nu, &bezt, &bp); if(bezt || bp) { if(extend==0) { @@ -3102,33 +3107,28 @@ void mouse_nurb(bContext *C, short mval[2], int extend) WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - if(nu!=get_actNurb(obedit)) { + if(nu!=get_actNurb(obedit)) set_actNurb(obedit, nu); - } - } -/***************** XXX spin operator **********************/ +/******************** spin operator ***********************/ /* from what I can gather, the mode==0 magic number spins and bridges the nurbs based on the * orientation of the global 3d view (yuck yuck!) mode==1 does the same, but doesn't bridge up * up the new geometry, mode==2 now does the same as 0, but aligned to world axes, not the view. */ -static int spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode) +static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, short mode) { ListBase *editnurb= curve_get_editcurve(obedit); - RegionView3D *rv3d= NULL; // XXX - View3D *v3d= NULL; // XXX + View3D *v3d= CTX_wm_view3d(C); + RegionView3D *rv3d= CTX_wm_region_view3d(C); Nurb *nu; float *curs, si,phi,n[3],q[4],cmat[3][3],tmat[3][3],imat[3][3]; float cent[3],bmat[3][3], rotmat[3][3], scalemat1[3][3], scalemat2[3][3]; float persmat[3][3], persinv[3][3]; short a,ok, changed= 0; - if(obedit->type!=OB_SURF) - return changed; // XXX poll - - if (mode != 2) Mat3CpyMat4(persmat, rv3d->viewmat); + if(mode != 2 && rv3d) Mat3CpyMat4(persmat, rv3d->viewmat); else Mat3One(persmat); Mat3Inv(persinv, persmat); @@ -3136,12 +3136,17 @@ static int spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode) Mat3CpyMat4(bmat, obedit->obmat); Mat3Inv(imat, bmat); - curs= give_cursor(scene, v3d); - VECCOPY(cent, curs); + if(v3d) { + curs= give_cursor(scene, v3d); + VECCOPY(cent, curs); + } + else + cent[0]= cent[1]= cent[2]= 0.0f; + VecSubf(cent, cent, obedit->obmat[3]); Mat3MulVecfl(imat,cent); - if(dvec || mode==2) { + if(dvec || mode==2 || !rv3d) { n[0]=n[1]= 0.0; n[2]= 1.0; } else { @@ -3226,13 +3231,13 @@ static int spin_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); - if(!spin_nurb(scene, obedit, 0, 0)) { + if(!spin_nurb(C, scene, obedit, 0, 0)) { BKE_report(op->reports, RPT_ERROR, "Can't spin"); return OPERATOR_CANCELLED; } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - // XXX notifier return OPERATOR_FINISHED; } @@ -3245,26 +3250,25 @@ void CURVE_OT_spin(wmOperatorType *ot) /* api callbacks */ ot->exec= spin_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->poll= ED_operator_editsurf; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -/***************** XXX add vertex operator **********************/ +/***************** add vertex operator **********************/ -static int addvert_Nurb(Scene *scene, Object *obedit, short mode) +static int addvert_Nurb(bContext *C, short mode) { + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); - View3D *v3d= NULL; // XXX + View3D *v3d= CTX_wm_view3d(C); Nurb *nu; BezTriple *bezt, *newbezt = NULL; BPoint *bp, *newbp = NULL; float *curs, mat[3][3],imat[3][3], temp[3]; - if(obedit==0 || v3d == 0) return OPERATOR_CANCELLED; - if( (v3d->lay & obedit->lay)==0 ) return OPERATOR_CANCELLED; - Mat3CpyMat4(mat, obedit->obmat); Mat3Inv(imat,mat); @@ -3311,9 +3315,16 @@ static int addvert_Nurb(Scene *scene, Object *obedit, short mode) VECCOPY(newbezt->vec[2], bezt->vec[2]); } else { - curs= give_cursor(scene, v3d); - - VECCOPY(newbezt->vec[1], curs); + if(v3d) { + curs= give_cursor(scene, v3d); + VECCOPY(newbezt->vec[1], curs); + } + else { + newbezt->vec[1][0]= 0.0f; + newbezt->vec[1][1]= 0.0f; + newbezt->vec[1][2]= 0.0f; + } + VecSubf(newbezt->vec[1],newbezt->vec[1], obedit->obmat[3]); Mat3MulVecfl(imat,newbezt->vec[1]); VecSubf(temp, newbezt->vec[1],temp); @@ -3359,9 +3370,16 @@ static int addvert_Nurb(Scene *scene, Object *obedit, short mode) VECCOPY(newbp->vec, bp->vec); } else { - curs= give_cursor(scene, v3d); + if(v3d) { + curs= give_cursor(scene, v3d); + VECCOPY(newbp->vec, curs); + } + else { + newbp->vec[0]= 0.0f; + newbp->vec[1]= 0.0f; + newbp->vec[1]= 0.0f; + } - VECCOPY(newbp->vec, curs); VecSubf(newbp->vec, newbp->vec, obedit->obmat[3]); Mat3MulVecfl(imat,newbp->vec); newbp->vec[3]= 1.0; @@ -3369,35 +3387,26 @@ static int addvert_Nurb(Scene *scene, Object *obedit, short mode) } } -// XXX retopo_do_all(); + // XXX retopo_do_all(); test2DNurb(nu); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - if(mode=='e') { -// XXX BIF_TransformSetUndo("Extrude"); -// initTransform(TFM_TRANSLATION, CTX_NO_PET); -// Transform(); - } -// else while(get_mbut()&R_MOUSE) BIF_wait_for_statechange(); - - if(mode!='e') { - /* dependencies with other objects, should become event */ - BIF_undo_push("Add vertex"); - - } - return OPERATOR_FINISHED; } static int add_vertex_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); - Object *obedit= CTX_data_edit_object(C); + return addvert_Nurb(C, 0); +} - // XXX - - return addvert_Nurb(scene, obedit, 0); +static int add_vertex_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + // XXX doesn't work correct, old code was in mouse_cursor + // temporarly setting cursor, adding vertex and restoring cursor + return add_vertex_exec(C, 0); } void CURVE_OT_add_vertex(wmOperatorType *ot) @@ -3408,13 +3417,14 @@ void CURVE_OT_add_vertex(wmOperatorType *ot) /* api callbacks */ ot->exec= add_vertex_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->invoke= add_vertex_invoke; + ot->poll= ED_operator_editcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -/***************** XXX extrude operator **********************/ +/***************** extrude operator **********************/ static int extrude_exec(bContext *C, wmOperator *op) { @@ -3422,32 +3432,37 @@ static int extrude_exec(bContext *C, wmOperator *op) Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; - int ok= 0; - - if(obedit->type!=OB_SURF) - return OPERATOR_CANCELLED; - - /* first test: curve? */ - for(nu= editnurb->first; nu; nu= nu->next) { - if(nu->pntsv==1 && isNurbsel_count(nu)==1 ) break; - } - if(nu) { - addvert_Nurb(scene, obedit, 'e'); - } else { - ok= extrudeflagNurb(editnurb, 1); /* '1'= flag */ - if(ok) { + /* first test: curve? */ + for(nu= editnurb->first; nu; nu= nu->next) + if(nu->pntsv==1 && isNurbsel_count(nu)==1) + break; + + if(obedit->type==OB_CURVE || nu) { + addvert_Nurb(C, 'e'); + } + else { + if(extrudeflagNurb(editnurb, 1)) { /* '1'= flag */ + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - // XXX notifier -// XXX BIF_TransformSetUndo("Extrude"); -// initTransform(TFM_TRANSLATION, CTX_NO_PET); -// Transform(); } } return OPERATOR_FINISHED; } +static int extrude_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if(extrude_exec(C, op) == OPERATOR_FINISHED) { + RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); + WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); + + return OPERATOR_FINISHED; + } + + return OPERATOR_CANCELLED; +} + void CURVE_OT_extrude(wmOperatorType *ot) { /* identifiers */ @@ -3456,15 +3471,19 @@ void CURVE_OT_extrude(wmOperatorType *ot) /* api callbacks */ ot->exec= extrude_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->invoke= extrude_invoke; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* to give to transform */ + RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); } -/***************** XXX make cyclic operator **********************/ +/***************** make cyclic operator **********************/ -static int make_cyclic_exec(bContext *C, wmOperator *op) +static int toggle_cyclic_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); @@ -3472,7 +3491,7 @@ static int make_cyclic_exec(bContext *C, wmOperator *op) BezTriple *bezt; BPoint *bp; float *fp; - int a, b, cyclmode=0; + int a, b, direction= RNA_enum_get(op->ptr, "direction"); for(nu= editnurb->first; nu; nu= nu->next) { if( nu->pntsu>1 || nu->pntsv>1) { @@ -3527,16 +3546,12 @@ static int make_cyclic_exec(bContext *C, wmOperator *op) } } else if(nu->type==CU_NURBS) { - if(cyclmode==0) { - cyclmode= pupmenu("Toggle %t|cyclic U%x1|cyclic V%x2"); // XXX - if(cyclmode < 1) return OPERATOR_CANCELLED; - } a= nu->pntsu*nu->pntsv; bp= nu->bp; while(a--) { if( bp->f1 & SELECT) { - if(cyclmode==1 && nu->pntsu>1) { + if(direction==0 && nu->pntsu>1) { if(nu->flagu & CU_CYCLIC) nu->flagu &= ~CU_CYCLIC; else { nu->flagu |= CU_CYCLIC; @@ -3553,7 +3568,7 @@ static int make_cyclic_exec(bContext *C, wmOperator *op) } } } - if(cyclmode==2 && nu->pntsv>1) { + if(direction==1 && nu->pntsv>1) { if(nu->flagv & 1) nu->flagv--; else { nu->flagv++; @@ -3579,44 +3594,82 @@ static int make_cyclic_exec(bContext *C, wmOperator *op) } } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); return OPERATOR_FINISHED; } -void CURVE_OT_make_cyclic(wmOperatorType *ot) +static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *event) { + Object *obedit= CTX_data_edit_object(C); + ListBase *editnurb= curve_get_editcurve(obedit); + uiMenuItem *head; + Nurb *nu; + + for(nu= editnurb->first; nu; nu= nu->next) { + if(nu->pntsu>1 || nu->pntsv>1) { + if(nu->type==CU_NURBS) { + head= uiPupMenuBegin("Direction", 0); + uiMenuItemsEnumO(head, op->type->idname, "direction"); + uiPupMenuEnd(C, head); + return OPERATOR_CANCELLED; + } + } + } + + return toggle_cyclic_exec(C, op); +} + +void CURVE_OT_toggle_cyclic(wmOperatorType *ot) +{ + static EnumPropertyItem direction_items[]= { + {0, "CYCLIC_U", "Cyclic U", ""}, + {1, "CYCLIC_V", "Cyclic V", ""}, + {0, NULL, NULL, NULL}}; + /* identifiers */ - ot->name= "Make Cyclic"; - ot->idname= "CURVE_OT_make_cyclic"; + ot->name= "Toggle Cyclic"; + ot->idname= "CURVE_OT_toggle_cyclic"; /* api callbacks */ - ot->exec= make_cyclic_exec; - ot->poll= ED_operator_editcurve; // XXX nurb poll() + ot->exec= toggle_cyclic_exec; + ot->invoke= toggle_cyclic_invoke; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "direction", direction_items, 0, "Direction", "Direction to make surface cyclic in."); } -/***************** XXX select linked operator **********************/ +/***************** select linked operator ******************/ static int select_linked_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); + RegionView3D *rv3d= CTX_wm_region_view3d(C); ViewContext vc; Nurb *nu; BezTriple *bezt; BPoint *bp; - int a; - short mval[2], shift= 0; // XXX + int a, location[2], deselect; + + if(!rv3d) + return OPERATOR_CANCELLED; - findnearestNurbvert(&vc, 1, mval, &nu, &bezt, &bp); + deselect= RNA_boolean_get(op->ptr, "deselect"); + RNA_int_get_array(op->ptr, "location", location); + + view3d_set_viewcontext(C, &vc); + findnearestNurbvert(&vc, 1, location, &nu, &bezt, &bp); if(bezt) { a= nu->pntsu; bezt= nu->bezt; while(a--) { - if(shift) select_beztriple(bezt, DESELECT, 1, VISIBLE); + if(deselect) select_beztriple(bezt, DESELECT, 1, VISIBLE); else select_beztriple(bezt, SELECT, 1, VISIBLE); bezt++; } @@ -3625,7 +3678,7 @@ static int select_linked_exec(bContext *C, wmOperator *op) a= nu->pntsu*nu->pntsv; bp= nu->bp; while(a--) { - if(shift) select_bpoint(bp, DESELECT, 1, VISIBLE); + if(deselect) select_bpoint(bp, DESELECT, 1, VISIBLE); else select_bpoint(bp, SELECT, 1, VISIBLE); bp++; } @@ -3636,6 +3689,18 @@ static int select_linked_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int select_linked_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + int location[2]; + + location[0]= event->x - ar->winrct.xmin; + location[1]= event->y - ar->winrct.ymin; + RNA_int_set_array(op->ptr, "location", location); + + return select_linked_exec(C, op); +} + void CURVE_OT_select_linked(wmOperatorType *ot) { /* identifiers */ @@ -3644,10 +3709,15 @@ void CURVE_OT_select_linked(wmOperatorType *ot) /* api callbacks */ ot->exec= select_linked_exec; - ot->poll= ED_operator_editcurve; + ot->invoke= select_linked_invoke; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect linked control points rather than selecting them."); + RNA_def_int_vector(ot->srna, "location", 2, NULL, 0, INT_MAX, "Location", "", 0, 16384); } /***************** select row operator **********************/ @@ -3665,10 +3735,6 @@ static int select_row_exec(bContext *C, wmOperator *op) if(editnurb->first==0) return OPERATOR_CANCELLED; - - if(obedit->type!=OB_SURF) - return OPERATOR_CANCELLED; // XXX poll() - if(cu->lastselbp==NULL) return OPERATOR_CANCELLED; @@ -3723,7 +3789,7 @@ void CURVE_OT_select_row(wmOperatorType *ot) /* api callbacks */ ot->exec= select_row_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurf; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -3864,7 +3930,7 @@ void CURVE_OT_select_more(wmOperatorType *ot) /* api callbacks */ ot->exec= select_more_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -4025,7 +4091,7 @@ void CURVE_OT_select_less(wmOperatorType *ot) /* api callbacks */ ot->exec= select_less_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -4121,7 +4187,7 @@ void CURVE_OT_select_random(wmOperatorType *ot) /* api callbacks */ ot->exec= select_random_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; // XXX invoke popup? @@ -4156,7 +4222,7 @@ void CURVE_OT_select_every_nth(wmOperatorType *ot) /* api callbacks */ ot->exec= select_every_nth_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; // XXX invoke popup? @@ -4169,31 +4235,41 @@ void CURVE_OT_select_every_nth(wmOperatorType *ot) /********************** add duplicate operator *********************/ -static int add_duplicate_exec(bContext *C, wmOperator *op) +static int duplicate_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); adduplicateflagNurb(obedit, 1); -// XXX BIF_TransformSetUndo("Add Duplicate"); -// initTransform(TFM_TRANSLATION, CTX_NO_PET); -// Transform(); - return OPERATOR_FINISHED; } -void CURVE_OT_add_duplicate(wmOperatorType *ot) +static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + duplicate_exec(C, op); + + RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); + WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); + + return OPERATOR_FINISHED; +} + +void CURVE_OT_duplicate(wmOperatorType *ot) { /* identifiers */ - ot->name= "Add Duplicate"; - ot->idname= "CURVE_OT_add_duplicate"; + ot->name= "Duplicate"; + ot->idname= "CURVE_OT_duplicate"; /* api callbacks */ - ot->exec= add_duplicate_exec; - ot->poll= ED_operator_editcurve; + ot->exec= duplicate_exec; + ot->invoke= duplicate_invoke; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* to give to transform */ + RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); } /********************** delete operator *********************/ @@ -4212,7 +4288,7 @@ static int delete_exec(bContext *C, wmOperator *op) if(type==0) deleteflagNurb(C, op, 1); else freeNurblist(editnurb); - // XXX notifier + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); return OPERATOR_FINISHED; @@ -4342,11 +4418,12 @@ static int delete_exec(bContext *C, wmOperator *op) bezt2= bezt+(nu->pntsu-1); if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) { nu->flagu &= ~CU_CYCLIC; + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - BIF_undo_push("Delete"); } } - return OPERATOR_FINISHED; //XXX + + return OPERATOR_FINISHED; } cut= a; nu1= nu; @@ -4367,11 +4444,12 @@ static int delete_exec(bContext *C, wmOperator *op) bp2= bp+(nu->pntsu-1); if( bp2->f1 & SELECT ) { nu->flagu &= ~CU_CYCLIC; + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - BIF_undo_push("Delete"); } } - return OPERATOR_FINISHED; // XXX + + return OPERATOR_FINISHED; } cut= a; nu1= nu; @@ -4464,8 +4542,8 @@ static int delete_exec(bContext *C, wmOperator *op) else if(type==2) freeNurblist(editnurb); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - // XXX notifier return OPERATOR_FINISHED; } @@ -4477,13 +4555,13 @@ static int delete_invoke(bContext *C, wmOperator *op, wmEvent *event) if(obedit->type==OB_SURF) { head= uiPupMenuBegin("Delete", 0); - uiMenuItemEnumO(head, "", 0, op->idname, "type", 0); - uiMenuItemEnumO(head, "", 0, op->idname, "type", 2); + uiMenuItemEnumO(head, "", 0, op->type->idname, "type", 0); + uiMenuItemEnumO(head, "", 0, op->type->idname, "type", 2); uiPupMenuEnd(C, head); } else { head= uiPupMenuBegin("Delete", 0); - uiMenuItemsEnumO(head, op->idname, "type"); + uiMenuItemsEnumO(head, op->type->idname, "type"); uiPupMenuEnd(C, head); } @@ -4505,7 +4583,7 @@ void CURVE_OT_delete(wmOperatorType *ot) /* api callbacks */ ot->exec= delete_exec; ot->invoke= delete_invoke; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -4521,23 +4599,20 @@ static int set_smooth_exec(bContext *C, wmOperator *op) Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; - int disable= RNA_boolean_get(op->ptr, "disable"); + int clear= RNA_boolean_get(op->ptr, "clear"); if(obedit->type != OB_CURVE) return OPERATOR_CANCELLED; for(nu= editnurb->first; nu; nu= nu->next) { if(isNurbsel(nu)) { - if(!disable) nu->flag |= CU_SMOOTH; + if(!clear) nu->flag |= CU_SMOOTH; else nu->flag &= ~CU_SMOOTH; } } - // XXX notifier + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); - - // XXX if(event==1) BIF_undo_push("Set Smooth"); - // XXX else if(event==0) BIF_undo_push("Set Solid"); return OPERATOR_FINISHED; } @@ -4550,22 +4625,23 @@ void CURVE_OT_set_smooth(wmOperatorType *ot) /* api callbacks */ ot->exec= set_smooth_exec; - ot->poll= ED_operator_editcurve; + ot->poll= ED_operator_editsurfcurve; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_boolean(ot->srna, "disable", 0, "Disable", "Disable smooth shading for selection instead of enabling it."); + RNA_def_boolean(ot->srna, "clear", 0, "Clear", "Clear smooth shading to solid for selection instead of enabling it."); } -/********************* XXX join operator ***********************/ +/************** join operator, to be used externally? ****************/ -int join_curve(Scene *scene, int type) +int join_curve(bContext *C, wmOperator *op, int type) { - View3D *v3d= NULL; // XXX + View3D *v3d= CTX_wm_view3d(C); + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_edit_object(C); Base *base, *nextb; - Object *ob; Curve *cu; Nurb *nu, *newnu; BezTriple *bezt; @@ -4573,24 +4649,26 @@ int join_curve(Scene *scene, int type) ListBase tempbase; float imat[4][4], cmat[4][4]; int a; + + // XXX not integrated yet, to be called by object/ module? */ - ob= OBACT; - if (object_data_is_libdata(ob)) { - error_libdata(); - return 0; + if(object_data_is_libdata(ob)) { + BKE_report(op->reports, RPT_ERROR, "Can't edit external libdata"); + return OPERATOR_CANCELLED; } - if(!v3d || ob->type!=type) return 0; - if(ob->lay & v3d->lay); else return 0; + if(ob->type!=type) + return 0; + tempbase.first= tempbase.last= 0; /* trasnform all selected curves inverse in obact */ Mat4Invert(imat, ob->obmat); - base= FIRSTBASE; - while(base) { + for(base= FIRSTBASE; base; base=nextb) { nextb= base->next; - if (TESTBASE(v3d, base)) { + + if(TESTBASE(v3d, base)) { if(base->object->type==type) { if(base->object != ob) { @@ -4629,7 +4707,6 @@ int join_curve(Scene *scene, int type) } } } - base= nextb; } cu= ob->data; @@ -4637,15 +4714,15 @@ int join_curve(Scene *scene, int type) DAG_scene_sort(scene); // because we removed object(s), call before editmode! - // XXX Context - ED_object_enter_editmode(NULL, EM_WAITCURSOR); - ED_object_exit_editmode(NULL, EM_FREEDATA|EM_WAITCURSOR); + ED_object_enter_editmode(C, EM_WAITCURSOR); + ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR); - BIF_undo_push("Join"); - return 1; + // BIF_undo_push("Join"); + + return OPERATOR_FINISHED; } -/***************** XXX add primitive operator ********************/ +/************ add primitive, internal + external ****************/ Nurb *addNurbprim(bContext *C, int type, int newname) { @@ -4672,16 +4749,23 @@ Nurb *addNurbprim(bContext *C, int type, int newname) if(obedit) { Mat3CpyMat4(mat, obedit->obmat); - curs= give_cursor(scene, v3d); - VECCOPY(cent, curs); + if(v3d) { + curs= give_cursor(scene, v3d); + VECCOPY(cent, curs); + } + else + cent[0]= cent[1]= cent[2]= 0.0f; + cent[0]-= obedit->obmat[3][0]; cent[1]-= obedit->obmat[3][1]; cent[2]-= obedit->obmat[3][2]; - if (rv3d) { - if ( !(newname) || U.flag & USER_ADD_VIEWALIGNED) + if(rv3d) { + if (!(newname) || U.flag & USER_ADD_VIEWALIGNED || !rv3d) Mat3CpyMat4(imat, rv3d->viewmat); - else Mat3One(imat); + else + Mat3One(imat); + Mat3MulVecfl(imat, cent); Mat3MulMat3(cmat, imat, mat); Mat3Inv(imat, cmat); @@ -4994,9 +5078,9 @@ Nurb *addNurbprim(bContext *C, int type, int newname) BLI_addtail(editnurb, nu); /* temporal for spin */ if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0) - spin_nurb(scene, obedit, 0, 2); + spin_nurb(C, scene, obedit, 0, 2); else - spin_nurb(scene, obedit, 0, 0); + spin_nurb(C, scene, obedit, 0, 0); makeknots(nu, 2, nu->flagv>>1); @@ -5024,9 +5108,9 @@ Nurb *addNurbprim(bContext *C, int type, int newname) nu->flag= CU_SMOOTH; BLI_addtail(editnurb, nu); /* temporal for extrude and translate */ if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0) - spin_nurb(scene, obedit, 0, 2); + spin_nurb(C, scene, obedit, 0, 2); else - spin_nurb(scene, obedit, 0, 0); + spin_nurb(C, scene, obedit, 0, 0); BLI_remlink(editnurb, nu); @@ -5049,6 +5133,87 @@ Nurb *addNurbprim(bContext *C, int type, int newname) return nu; } +/***************** add curve primitive operator ********************/ + +static int add_curve_primitive_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + + addNurbprim(C, RNA_enum_get(op->ptr, "type"), 0); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + return OPERATOR_FINISHED; +} + +void CURVE_OT_add_curve_primitive(wmOperatorType *ot) +{ + static EnumPropertyItem type_items[]= { + {CU_PRIM_CURVE|CU_2D|CU_BEZIER, "BEZIER_CURVE", "Bezier Curve", ""}, + {CU_PRIM_CIRCLE|CU_2D|CU_BEZIER, "BEZIER_CIRCLE", "Bezier Circle", ""}, + {CU_PRIM_CURVE|CU_2D|CU_NURBS, "NURBS_CURVE", "NURBS Curve", ""}, + {CU_PRIM_CIRCLE|CU_2D|CU_NURBS, "NURBS_CIRCLE", "NURBS Circle", ""}, + {CU_PRIM_PATH|CU_2D|CU_NURBS, "PATH", "Path", ""}, + {0, NULL, NULL, NULL}}; + + /* identifiers */ + ot->name= "Add Curve Primitive"; + ot->idname= "CURVE_OT_add_curve_primitive"; + + /* api callbacks */ + ot->exec= add_curve_primitive_exec; + ot->poll= ED_operator_editcurve; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", type_items, CU_PRIM_CURVE|CU_2D|CU_BEZIER, "Type", "Type of primitive to add."); +} + +/***************** add surface primitive operator ********************/ + +static int add_surface_primitive_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + + addNurbprim(C, RNA_enum_get(op->ptr, "type"), 0); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + + return OPERATOR_FINISHED; +} + +void CURVE_OT_add_surface_primitive(wmOperatorType *ot) +{ + static EnumPropertyItem type_items[]= { + {CU_PRIM_CURVE|CU_NURBS, "NURBS_CURVE", "NURBS Curve", ""}, + {CU_PRIM_CIRCLE|CU_NURBS, "NURBS_CIRCLE", "NURBS Circle", ""}, + {CU_PRIM_PATCH|CU_NURBS, "NURBS_SURFACE", "NURBS Surface", ""}, + {CU_PRIM_TUBE|CU_NURBS, "NURBS_TUBE", "NURBS Tube", ""}, + {CU_PRIM_SPHERE|CU_NURBS, "NURBS_SPHERE", "NURBS Sphere", ""}, + {CU_PRIM_DONUT|CU_NURBS, "NURBS_DONUT", "NURBS Donut", ""}, + {0, NULL, NULL, NULL}}; + + /* identifiers */ + ot->name= "Add Surface Primitive"; + ot->idname= "CURVE_OT_add_surface_primitive"; + + /* api callbacks */ + ot->exec= add_surface_primitive_exec; + ot->poll= ED_operator_editsurf; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", type_items, CU_PRIM_CURVE|CU_NURBS, "Type", "Type of primitive to add."); +} + /***************** clear tilt operator ********************/ static int clear_tilt_exec(bContext *C, wmOperator *op) @@ -5079,7 +5244,7 @@ static int clear_tilt_exec(bContext *C, wmOperator *op) } } - // XXX notifier WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_TRANSFORM, obedit); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); return OPERATOR_FINISHED; diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h index 29411e2cc91..3d428dbf754 100644 --- a/source/blender/editors/include/ED_curve.h +++ b/source/blender/editors/include/ED_curve.h @@ -45,7 +45,6 @@ ListBase *curve_get_editcurve(struct Object *ob); void load_editNurb (struct Object *obedit); void make_editNurb (struct Object *obedit); -void remake_editNurb (struct Object *obedit); void free_editNurb (struct Object *obedit); void mouse_nurb (struct bContext *C, short mval[2], int extend); diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index b5e2558c893..3ec472a9085 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -117,6 +117,8 @@ int ED_operator_object_active(struct bContext *C); int ED_operator_editmesh(struct bContext *C); int ED_operator_editarmature(struct bContext *C); int ED_operator_editcurve(struct bContext *C); +int ED_operator_editsurf(struct bContext *C); +int ED_operator_editsurfcurve(struct bContext *C); int ED_operator_uvedit(struct bContext *C); int ED_operator_uvmap(struct bContext *C); int ED_operator_posemode(struct bContext *C); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index c4bd05f8076..8f96732a911 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -2309,7 +2309,7 @@ uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext else str= opname; } - if ((!tip || tip[0]=='\0') && ot->description) { + if ((!tip || tip[0]=='\0') && ot && ot->description) { tip= ot->description; } diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 59566fcfe7d..aeddff72539 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -422,10 +422,10 @@ void OBJECT_OT_mesh_add(wmOperatorType *ot) } static EnumPropertyItem prop_curve_types[] = { - {CU_BEZIER|CU_2D|CU_PRIM_CURVE, "BEZCURVE", "Bezier Curve", ""}, - {CU_BEZIER|CU_2D|CU_PRIM_CIRCLE, "BEZCIRCLE", "Bezier Circle", ""}, - {CU_NURBS|CU_2D|CU_PRIM_CURVE, "NURBSCUVE", "NURBS Curve", ""}, - {CU_NURBS|CU_2D|CU_PRIM_CIRCLE, "NURBSCIRCLE", "NURBS Circle", ""}, + {CU_BEZIER|CU_2D|CU_PRIM_CURVE, "BEZIER_CURVE", "Bezier Curve", ""}, + {CU_BEZIER|CU_2D|CU_PRIM_CIRCLE, "BEZIER_CIRCLE", "Bezier Circle", ""}, + {CU_NURBS|CU_2D|CU_PRIM_CURVE, "NURBS_CURVE", "NURBS Curve", ""}, + {CU_NURBS|CU_2D|CU_PRIM_CIRCLE, "NURBS_CIRCLE", "NURBS Circle", ""}, {CU_NURBS|CU_2D|CU_PRIM_PATH, "PATH", "Path", ""}, {0, NULL, NULL, NULL} }; @@ -5991,7 +5991,6 @@ static int add_duplicate_exec(bContext *C, wmOperator *op) static int add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event) { - add_duplicate_exec(C, op); RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); @@ -6020,7 +6019,6 @@ void OBJECT_OT_add_duplicate(wmOperatorType *ot) RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); } - /* ********************** */ void image_aspect(Scene *scene, View3D *v3d) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 2225be4eda8..04e66995b2e 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -232,11 +232,11 @@ int ED_operator_uvmap(bContext *C) return 0; } -int ED_operator_editcurve(bContext *C) +int ED_operator_editsurfcurve(bContext *C) { Object *obedit= CTX_data_edit_object(C); - if(obedit && obedit->type==OB_CURVE) - return NULL != ((Mesh *)obedit->data)->edit_mesh; + if(obedit && ELEM(obedit->type, OB_CURVE, OB_SURF)) + return NULL != ((Curve *)obedit->data)->editnurb; return 0; // XXX this test was in many tools, still needed? @@ -244,6 +244,22 @@ int ED_operator_editcurve(bContext *C) } +int ED_operator_editcurve(bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + if(obedit && obedit->type==OB_CURVE) + return NULL != ((Curve *)obedit->data)->editnurb; + return 0; +} + +int ED_operator_editsurf(bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + if(obedit && obedit->type==OB_SURF) + return NULL != ((Curve *)obedit->data)->editnurb; + return 0; +} + /* *************************** action zone operator ************************** */ /* operator state vars used: diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 20a6f15e057..7131bf65495 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -1152,109 +1152,46 @@ static uiBlock *view3d_select_meshmenu(bContext *C, ARegion *ar, void *arg_unuse return block; } -void do_view3d_select_curvemenu(bContext *C, void *arg, int event) +static void view3d_select_curvemenu(bContext *C, uiMenuItem *head, void *arg_unused) { -#if 0 -/* extern void borderselect(void);*/ + Object *obedit= CTX_data_edit_object(C); - switch(event) { - case 0: /* border select */ - borderselect(); - break; - case 2: /* Select/Deselect all */ - deselectall_nurb(); - break; - case 3: /* Inverse */ - selectswapNurb(); - break; - /* select connected control points */ - /*case 4: - G.qual |= LR_CTRLKEY; - select_connected_nurb(); - G.qual &= ~LR_CTRLKEY; - break;*/ - case 5: /* select row (nurb) */ - selectrow_nurb(); - break; - case 7: /* select/deselect first */ - selectend_nurb(FIRST, 1, DESELECT); - break; - case 8: /* select/deselect last */ - selectend_nurb(LAST, 1, DESELECT); - break; - case 9: /* select more */ - select_more_nurb(); - break; - case 10: /* select less */ - select_less_nurb(); - break; - case 11: /* select next */ - select_next_nurb(); - break; - case 12: /* select previous */ - select_prev_nurb(); - break; - case 13: /* select random */ - select_random_nurb(); - break; - case 14: /* select every nth */ - select_every_nth_nurb(); - break; - } - allqueue(REDRAWVIEW3D, 0); -#endif -} + uiMenuItemO(head, 0, "VIEW3D_OT_borderselect"); + uiMenuItemO(head, 0, "VIEW3D_OT_circle_select"); + uiMenuSeparator(head); -static uiBlock *view3d_select_curvemenu(bContext *C, ARegion *ar, void *arg_unused) -{ - Scene *scene= CTX_data_scene(C); - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_select_curvemenu", UI_EMBOSSP, UI_HELV); - uiBlockSetButmFunc(block, do_view3d_select_curvemenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Every Nth", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); - - if (OBACT->type == OB_SURF) { - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Control Point Row|Shift R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); + uiMenuItemO(head, 0, "CURVE_OT_de_select_all"); + uiMenuItemO(head, 0, "CURVE_OT_select_inverse"); + uiMenuItemO(head, 0, "CURVE_OT_select_random"); // Random... + uiMenuItemO(head, 0, "CURVE_OT_select_every_nth"); // Every Nth.. + + uiMenuSeparator(head); + + if(obedit->type == OB_SURF) { + uiMenuItemO(head, 0, "CURVE_OT_select_row"); } else { - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect First", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect Last", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); + uiMenuItemO(head, 0, "CURVE_OT_de_select_first"); + uiMenuItemO(head, 0, "CURVE_OT_de_select_last"); + uiMenuItemO(head, 0, "CURVE_OT_select_next"); + uiMenuItemO(head, 0, "CURVE_OT_select_previous"); } - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "More|Ctrl NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Less|Ctrl NumPad -", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, ""); - + + uiMenuSeparator(head); + + uiMenuItemO(head, 0, "CURVE_OT_select_more"); + uiMenuItemO(head, 0, "CURVE_OT_select_less"); + /* commented out because it seems to only like the LKEY method - based on mouse pointer position :( */ - /*uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connected Control Points|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");*/ - - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - return block; + /* uiMenuItemO(head, 0, "CURVE_OT_select_linked"); */ + +#if 0 + G.qual |= LR_CTRLKEY; + select_connected_nurb(); + G.qual &= ~LR_CTRLKEY; + break;*/ +#endif } void do_view3d_select_metaballmenu(bContext *C, void *arg, int event) @@ -3327,262 +3264,85 @@ static uiBlock *view3d_edit_meshmenu(bContext *C, ARegion *ar, void *arg_unused) return block; } -static void do_view3d_edit_curve_controlpointsmenu(bContext *C, void *arg, int event) +static void view3d_edit_curve_controlpointsmenu(bContext *C, uiMenuItem *head, void *arg_unused) { -#if 0 - Scene *scene= CTX_data_scene(C); - - switch(event) { - case 0: /* tilt */ - initTransform(TFM_TILT, CTX_NONE); - Transform(); - break; - case 1: /* clear tilt */ - clear_tilt(); - break; - case 2: /* Free */ - sethandlesNurb(editnurb, 3); - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - break; - case 3: /* vector */ - sethandlesNurb(editnurb, 2); - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - break; - case 4: /* smooth */ - sethandlesNurb(editnurb, 1); - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - break; - case 5: /* make vertex parent */ - make_parent(); - break; - case 6: /* add hook */ - add_hook_menu(); - break; - case 7: - separate_nurb(); - break; - } - allqueue(REDRAWVIEW3D, 0); -#endif -} + Object *obedit= CTX_data_edit_object(C); -static uiBlock *view3d_edit_curve_controlpointsmenu(bContext *C, ARegion *ar, void *arg_unused) -{ - Scene *scene= CTX_data_scene(C); - uiBlock *block; - short yco = 20, menuwidth = 120; - - block= uiBeginBlock(C, ar, "view3d_edit_curve_controlpointsmenu", UI_EMBOSSP, UI_HELV); - uiBlockSetButmFunc(block, do_view3d_edit_curve_controlpointsmenu, NULL); - - if (OBACT->type == OB_CURVE) { - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Tilt|Alt T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); + if(obedit->type == OB_CURVE) { + uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TILT); + uiMenuItemO(head, 0, "CURVE_OT_clear_tilt"); + uiMenuItemO(head, 0, "CURVE_OT_separate"); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Automatic|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle Free/Aligned|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector|V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); + uiMenuSeparator(head); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiMenuItemEnumO(head, "", 0, "CURVE_OT_set_handle_type", "type", 1); + uiMenuItemEnumO(head, "", 0, "CURVE_OT_set_handle_type", "type", 3); + uiMenuItemEnumO(head, "", 0, "CURVE_OT_set_handle_type", "type", 2); + + uiMenuSeparator(head); } - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); - - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - return block; + + // XXX uiMenuItemO(head, 0, "OBJECT_OT_make_vertex_parent"); Make VertexParent|Ctrl P + // make_parent() + // XXX uiMenuItemO(head, 0, "OBJECT_OT_add_hook"); Add Hook| Ctrl H + // add_hook_menu() } -void do_view3d_edit_curve_segmentsmenu(bContext *C, void *arg, int event) +static void view3d_edit_curve_segmentsmenu(bContext *C, uiMenuItem *head, void *arg_unused) { -#if 0 - switch(event) { - case 0: /* subdivide */ - subdivideNurb(); - break; - case 1: /* switch direction */ - switchdirectionNurb2(); - break; - } - allqueue(REDRAWVIEW3D, 0); -#endif + uiMenuItemO(head, 0, "CURVE_OT_subdivide"); + uiMenuItemO(head, 0, "CURVE_OT_switch_direction"); } -static uiBlock *view3d_edit_curve_segmentsmenu(bContext *C, ARegion *ar, void *arg_unused) +static void view3d_edit_curve_showhidemenu(bContext *C, uiMenuItem *head, void *arg_unused) { - uiBlock *block; - short yco = 20, menuwidth = 120; - - block= uiBeginBlock(C, ar, "view3d_edit_curve_segmentsmenu", UI_EMBOSSP, UI_HELV); - uiBlockSetButmFunc(block, do_view3d_edit_curve_segmentsmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Direction", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - return block; + uiMenuItemO(head, 0, "CURVE_OT_reveal"); + uiMenuItemO(head, 0, "CURVE_OT_hide"); + uiMenuItemBooleanO(head, "Hide Deselected", 0, "CURVE_OT_hide", "deselected", 1); } -void do_view3d_edit_curve_showhidemenu(bContext *C, void *arg, int event) -{ -#if 0 - switch(event) { - case 10: /* show hidden control points */ - revealNurb(); - break; - case 11: /* hide selected control points */ - hideNurb(0); - break; - case 12: /* hide deselected control points */ - hideNurb(1); - break; - } - allqueue(REDRAWVIEW3D, 0); -#endif -} - -static uiBlock *view3d_edit_curve_showhidemenu(bContext *C, ARegion *ar, void *arg_unused) +static void view3d_edit_curvemenu(bContext *C, uiMenuItem *head, void *arg_unused) { + PointerRNA sceneptr; Scene *scene= CTX_data_scene(C); - uiBlock *block; - short yco = 20, menuwidth = 120; - block= uiBeginBlock(C, ar, "view3d_edit_curve_showhidemenu", UI_EMBOSSP, UI_HELV); - uiBlockSetButmFunc(block, do_view3d_edit_curve_showhidemenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|Alt Ctrl H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, ""); - if (OBACT->type == OB_SURF) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected Control Points|Alt Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); - + RNA_id_pointer_create(&scene->id, &sceneptr); - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - return block; -} -static void do_view3d_edit_curvemenu(bContext *C, void *arg, int event) -{ #if 0 - switch(event) { - - case 0: /* Undo Editing */ - remake_editNurb(ob); - break; - case 1: /* transformation properties */ -// XXX mainqenter(NKEY, 1); - break; - case 2: /* insert keyframe */ - common_insertkey(); - break; - case 4: /* extrude */ - if (OBACT->type == OB_CURVE) { - addvert_Nurb('e'); - } else if (OBACT->type == OB_SURF) { - extrude_nurb(); - } - break; - case 5: /* duplicate */ - duplicate_context_selected(); - break; - case 6: /* make segment */ - addsegment_nurb(); - break; - case 7: /* toggle cyclic */ - makecyclicNurb(); - DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - break; - case 8: /* delete */ - delete_context_selected(); - break; - case 9: /* proportional edit (toggle) */ - if(scene->proportional) scene->proportional= 0; - else scene->proportional= 1; - break; - case 13: /* Shear */ - initTransform(TFM_SHEAR, CTX_NONE); - Transform(); - break; - case 14: /* Warp */ - initTransform(TFM_WARP, CTX_NONE); - Transform(); - break; - case 15: - uv_autocalc_tface(); - break; - case 16: /* delete keyframe */ - common_deletekey(); - break; - } - allqueue(REDRAWVIEW3D, 0); -#endif -} - -static uiBlock *view3d_edit_curvemenu(bContext *C, ARegion *ar, void *arg_unused) -{ - Scene *scene= CTX_data_scene(C); - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_edit_curvemenu", UI_EMBOSSP, UI_HELV); - uiBlockSetButmFunc(block, do_view3d_edit_curvemenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reload Original|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, ""); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiMenuSeparator(head); +#endif - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Segment|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle Cyclic|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBlockBut(block, view3d_edit_curve_controlpointsmenu, NULL, ICON_RIGHTARROW_THIN, "Control Points", 0, yco-=20, menuwidth, 19, ""); - uiDefIconTextBlockBut(block, view3d_edit_curve_segmentsmenu, NULL, ICON_RIGHTARROW_THIN, "Segments", 0, yco-=20, menuwidth, 19, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - if(scene->proportional) { - uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, ""); - } else { - uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, ""); - } - uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, menuwidth, 19, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBlockBut(block, view3d_edit_curve_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Control Points", 0, yco-=20, menuwidth, 19, ""); - - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } + // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); + // common_insertkey(); + // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); + // common_deletekey(); - uiTextBoundsBlock(block, 50); - return block; + + uiMenuItemO(head, 0, "CURVE_OT_extrude"); + uiMenuItemO(head, 0, "CURVE_OT_duplicate"); + uiMenuItemO(head, 0, "CURVE_OT_separate"); + uiMenuItemO(head, 0, "CURVE_OT_make_segment"); + uiMenuItemO(head, 0, "CURVE_OT_toggle_cyclic"); + uiMenuItemO(head, 0, "CURVE_OT_delete"); // Delete... + + uiMenuSeparator(head); + + uiMenuLevel(head, "Control Points", view3d_edit_curve_controlpointsmenu); + uiMenuLevel(head, "Segments", view3d_edit_curve_segmentsmenu); + + uiMenuSeparator(head); + + uiMenuItemBooleanR(head, &sceneptr, "proportional_editing"); // |O + uiMenuLevelEnumR(head, &sceneptr, "proportional_editing_falloff"); + + uiMenuSeparator(head); + + uiMenuLevel(head, "Show/Hide Control Points", view3d_edit_curve_showhidemenu); } static void do_view3d_edit_mball_showhidemenu(bContext *C, void *arg, int event) @@ -3650,9 +3410,6 @@ static void do_view3d_edit_metaballmenu(bContext *C, void *arg, int event) case 7: /* Transform Properties */ add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, 0); break; - case 8: - uv_autocalc_tface(); - break; } allqueue(REDRAWVIEW3D, 0); #endif @@ -3679,10 +3436,6 @@ static uiBlock *view3d_edit_metaballmenu(bContext *C, ARegion *ar, void *arg_unu uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); @@ -5648,7 +5401,7 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o if (ob && ob->type == OB_MESH) { uiDefPulldownBut(block, view3d_select_meshmenu, NULL, "Select", xco,yco-2, xmax-3, 24, ""); } else if (ob && (ob->type == OB_CURVE || ob->type == OB_SURF)) { - uiDefPulldownBut(block, view3d_select_curvemenu, NULL, "Select", xco,yco-2, xmax-3, 24, ""); + uiDefMenuBut(block, view3d_select_curvemenu, NULL, "Select", xco, yco-2, xmax-3, 24, ""); } else if (ob && ob->type == OB_FONT) { uiDefPulldownBut(block, view3d_select_meshmenu, NULL, "Select", xco, yco-2, xmax-3, 24, ""); } else if (ob && ob->type == OB_MBALL) { @@ -5682,11 +5435,11 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o xco+= xmax; } else if (ob && ob->type == OB_CURVE) { xmax= GetButStringLength("Curve"); - uiDefPulldownBut(block, view3d_edit_curvemenu, NULL, "Curve", xco,yco-2, xmax-3, 24, ""); + uiDefMenuBut(block, view3d_edit_curvemenu, NULL, "Curve", xco, yco-2, xmax-3, 24, ""); xco+= xmax; } else if (ob && ob->type == OB_SURF) { xmax= GetButStringLength("Surface"); - uiDefPulldownBut(block, view3d_edit_curvemenu, NULL, "Surface", xco,yco-2, xmax-3, 24, ""); + uiDefMenuBut(block, view3d_edit_curvemenu, NULL, "Surface", xco, yco-2, xmax-3, 24, ""); xco+= xmax; } else if (ob && ob->type == OB_FONT) { xmax= GetButStringLength("Text"); diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index ccad3acfd56..d8b1dd66325 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -596,10 +596,8 @@ static void uv_map_transform(bContext *C, wmOperator *op, float center[3], float Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= ((Mesh*)obedit->data)->edit_mesh; - SpaceLink *sl= CTX_wm_space_data(C); - View3D *v3d= (sl->spacetype == SPACE_VIEW3D)? (View3D*)sl: NULL; - ARegion *ar= CTX_wm_region(C); - RegionView3D *rv3d= (v3d && ar->regiontype == RGN_TYPE_WINDOW)? ar->regiondata: NULL; + View3D *v3d= CTX_wm_view3d(C); + RegionView3D *rv3d= CTX_wm_region_view3d(C); /* common operator properties */ int align= RNA_enum_get(op->ptr, "align"); int direction= RNA_enum_get(op->ptr, "direction"); @@ -935,13 +933,12 @@ static int from_view_exec(bContext *C, wmOperator *op) static int from_view_poll(bContext *C) { - SpaceLink *sl= CTX_wm_space_data(C); - ARegion *ar= CTX_wm_region(C); + RegionView3D *rv3d= CTX_wm_region_view3d(C) if(!ED_operator_uvmap(C)) return 0; - return (sl->spacetype == SPACE_VIEW3D && ar->regiontype == RGN_TYPE_WINDOW); + return (rv3d != NULL); } void UV_OT_from_view(wmOperatorType *ot) From c5d8155aebd00edf95f1baa1f586fe557cfa9dc5 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 12 Feb 2009 22:24:51 +0000 Subject: [PATCH 62/63] Compilation fix: added missing ; --- source/blender/editors/uvedit/uvedit_unwrap_ops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index d8b1dd66325..7efeb51e6f2 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -933,7 +933,7 @@ static int from_view_exec(bContext *C, wmOperator *op) static int from_view_poll(bContext *C) { - RegionView3D *rv3d= CTX_wm_region_view3d(C) + RegionView3D *rv3d= CTX_wm_region_view3d(C); if(!ED_operator_uvmap(C)) return 0; From ed7e211c2d5be8a9e7e87a41fc6fecc02bb346c5 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 12 Feb 2009 23:25:36 +0000 Subject: [PATCH 63/63] KeyingSets: Fixing crash when adding KeyingSets and no group name is supplied --- source/blender/blenkernel/intern/anim_sys.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 098d0ad7a32..cb29685bd15 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -177,7 +177,10 @@ KeyingSet *BKE_keyingset_add (ListBase *list, const char name[], short flag, sho /* allocate new KeyingSet */ ks= MEM_callocN(sizeof(KeyingSet), "KeyingSet"); - BLI_snprintf(ks->name, 64, name); + if (name) + BLI_snprintf(ks->name, 64, name); + else + strcpy(ks->name, "Keying Set"); ks->flag= flag; ks->keyingflag= keyingflag; @@ -212,7 +215,10 @@ void BKE_keyingset_add_destination (KeyingSet *ks, ID *id, const char group_name /* just store absolute info */ if (ks->flag & KEYINGSET_ABSOLUTE) { ksp->id= id; - BLI_snprintf(ksp->group, 64, group_name); + if (group_name) + BLI_snprintf(ksp->group, 64, group_name); + else + strcpy(ksp->group, ""); } /* just copy path info */